我們前面接觸到的spring cloud組件都是基於Netflix的組件進行實現的,這次我們來看下spring cloud 團隊自己創建的一個全新項目:Spring Cloud Config.它用來為分散式系統中的基礎設施和微服務提供集中化的外部配置支持,分為服務端和客戶端兩個部分。 其中服務端也稱 ...
我們前面接觸到的spring cloud組件都是基於Netflix的組件進行實現的,這次我們來看下spring cloud 團隊自己創建的一個全新項目:Spring Cloud Config.
它用來為分散式系統中的基礎設施和微服務提供集中化的外部配置支持,分為服務端和客戶端兩個部分。
其中服務端也稱為分散式配置中心,他是獨立的微服務應用,用來連接配置倉庫併為客戶端提供獲取介面(這些介面返回配置信息、加密、解密信息等);
客戶端是微服務架構中的各個微服務應用或基礎設施,它們通過制定的配置中心來管理應用資源與業務相關的配置內容,併在啟動的時候從配置中心獲取和載入配置信息。
由於配置中心預設採用Git來存儲配置信息,因此我們會用到Git相關的內容,如果沒有用過Git或者忘記怎麼用了,可以參考下廖雪峰老師的Git教程。
另外,我自己用的Git遠程倉庫是碼雲。
====================華麗的分割線===================
接下來看下代碼怎麼實現。
一、準備遠程Git倉庫
- 在Gitee上新建一個項目https://gitee.com/sam-uncle/spring-cloud-learning
- 在項目下新建子目錄spring-cloud-config-file,然後新建三個文件
-
- 內容分別是from=git-dev-1.0、from=git-test-1.0、from=git-1.0
- 新建一個分支config-lable-test,新分支裡面新建三個同名的文件,不過內容分別是from=git-dev-2.0、from=git-test-2.0、from=git-2.0
二、構建配置中心
先給出最終代碼結構:
搭建過程如下:
- 新建maven工程config-server
- 修改POM文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <javaVersion>1.8</javaVersion> </properties> <!-- 使用dependencyManagement進行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 引入config server依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> </project>
- 創建啟動類
/** * @EnableConfigServer * * 開啟Spring Cloud Config 的服務端功能 * */ @SpringBootApplication @EnableConfigServer public class ConfigServerApp { public static void main(String[] args) { SpringApplication.run(ConfigServerApp.class, args); } }
- 配置application.properties文件,指定遠程倉庫信息
server.port=7001 spring.application.name=config-server #配置Git倉庫的地址 spring.cloud.config.server.git.uri=https://gitee.com/sam-uncle/spring-cloud-learning/ #配置倉庫路徑下的相對搜索位置,可以配置多個 spring.cloud.config.server.git.search-paths=spring-cloud-config-file #這裡配置你的Git倉庫的用戶名 spring.cloud.config.server.git.username=用戶名 #這裡配置你的Git倉庫的密碼 spring.cloud.config.server.git.password=密碼
- 啟動並驗證
訪問配置信息的URL與配置文件的映射關係如下:
-
- /{application}/{profile} [/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{appliction}-{profile}.properties
上面的url會映射{application}-{profile}.properties對應的配置文件,其中{label}對應Git上不同的分支,預設是master。
通過瀏覽器訪問http://localhost:7001/sam/dev/config-label-test,結果如下:
三、實現客戶端
最終代碼結構:
搭建過程如下:
- 新建maven工程config-client
- 修改POM文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>config-client</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <javaVersion>1.8</javaVersion> </properties> <!-- 使用dependencyManagement進行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 引入config依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
- 創建啟動類
@SpringBootApplication public class ConfigClientApp { public static void main(String[] args) { SpringApplication.run(ConfigClientApp.class, args); } }
- 配置bootstrap.properties文件,指定config-server位置
server.port=7002 #{application} spring.application.name=sam #{profile} spring.cloud.config.profile=dev #{label} spring.cloud.config.label=master #config server uri spring.cloud.config.uri=http://localhost:7001/
- 創建controller
@RefreshScope @RestController public class TestController { /** * 通過@Value 來講配置文件中的值寫入到代碼中 */ @Value("${from}") private String from; @RequestMapping("/from") public String from() { return from; } }
- 啟動並測試
四、工作原理
Spring Cloud Config配置中心的工作原理如下:
- 客戶端啟動時,根據bootstrap.properties中配置的應用名{application}、環境名{profile}、分支名{label},向Config Server請求獲取配置信息。
- Config Server根據自己維護的Git倉庫信息和客戶傳遞過來的配置定位信息去查找配置信息。
- 通過git clone命令將找到的配置信息下載到本地(Config Server的文件系統中)。在通過頁面訪問或啟動客戶端的時候,我們在服務端能看到如下下載的log:
2018-05-14 22:51:58.055 INFO 3084 --- [nio-7001-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/sam/AppData/Local/Temp/config-repo-8627749771720918793/spring-cloud-config-file/sam-dev.properties 2018-05-14 22:51:58.055 INFO 3084 --- [nio-7001-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/sam/AppData/Local/Temp/config-repo-8627749771720918793/spring-cloud-config-file/sam.properties
- Config Server創建Spring 的ApplicationContext實例,並從Git本地倉庫中載入配置文件,最後將這些配置內容讀取出來返回給客戶端。
- 客戶端在獲取外部配置信息後載入到客戶端的applicationContext實例。