一起來學Spring Cloud | 第七章:分散式配置中心(Spring Cloud Config)
上一章節,我們講解了服務閘道器zuul,本章節我們從git和本地兩種儲存配置資訊的方式來講解springcloud的分散式配置中心-Spring Cloud Config。
一、Spring Cloud Config簡介:
Spring Cloud Config專案是一個解決分散式系統的配置管理方案。它包含了Client和Server兩個部分,server提供配置檔案的儲存、以介面的形式將配置檔案的內容提供出去,client通過介面獲取資料、並依據此資料初始化自己的應用。
二、新建springcloud-config-server模組:
1. 參考:一起來學Spring Cloud | 第一章 :如何搭建一個多模組的springcloud專案 來新建一個基本模組結構
2. 修改pom.xml中引入依賴
<?xml version="1.0" encoding="UTF-8"?> <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> <parent> <groupId>com.haly</groupId> <artifactId>springcloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.haly</groupId> <artifactId>springcloud-config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-config-server</name> <description>新建一個config server專案</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3. 新建入口啟動類SpringcloudConfigServerApplication
@EnableConfigServer,表示開啟Config Server
package com.haly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication @EnableDiscoveryClient public class SpringcloudConfigServerApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudConfigServerApplication.class, args); } }
4. 修改application.properties檔案(git方法儲存配置)
在Github上建立一個專案,並在上面新增配置檔案config-client.properties,配置檔案裡新增一個屬性config=NewConfig !
。
在application.properties
中配置服務資訊以及git資訊
spring.application.name=springcloud-config-server server.port=7001 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ spring.cloud.config.server.git.uri=https://github.com/FunriLy/springcloud-study/ spring.cloud.config.server.git.searchPaths=config-repo spring.cloud.config.server.git.username=Username spring.cloud.config.server.git.password=Password
啟動工程 Config Server,瀏覽器輸入:http://localhost:7001/config-client/default/master,得到結果如下
{ "name": "config-client", "profiles": [ "default" ], "label": null, "version": "52b88000fc46a8b1d72a2979f4721d45a3d1f429", "state": null, "propertySources": [ { "name": "https://github.com/FunriLy/springcloud-study//config-repo/config-client.properties", "source": { "configword": "NewConfig !" } } ] }
三、新建springcloud-config模組(可不要):
其實我在工作中喜歡建立一個springcloud-config模組,沒有業務程式碼,只有pom.xml檔案和resources目錄,resources放一下公共的配置檔案,可以給其它模組引用
例如配置:
spring-data-mysql.xml 檔案
spring-data-redis-single.xml 檔案
spring-jdbc-mysql.xml 檔案
bootstrap.yml 配置檔案
1. 新增pom.xml檔案
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.sinaif</groupId> <artifactId>sinaif-weibo-opt</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>com.sinaif</groupId> <artifactId>sinaif-config</artifactId> <name>${project.artifactId}</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </project>
2. 新增bootstrap.yml檔案(可以統一配置config,eureka ,hystrix等待)
(注意這裡是bootstrap.properties而不是appliction.properties
。
因為bootstrap.properties會在應用啟動之前讀取,而spring.cloud.config.uri會影響應用啟動
)
spring: cloud: config: name: config-client profile: default label: master uri: http://localhost:7001/ eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
上面配置config屬性的規則,以及前面我們直接用 http://localhost:7001/config-client/default/master 訪問配置的規則
URL與配置檔案的對映關係
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
application是config-client-dev.properties檔案中的config-client值
,profile是一個active的profile,一般用來表示環境資訊,label是一個可選的標籤,一般用來表示目錄名稱。
比如,我在Github上的檔名是config-client.properties,在Github上都是default環境,預設為master分支。所以就是/config-client/default/master
四、新建springcloud-config-server 的client模組:
我用之前寫過的springcloud-feign-client模組,在FeignController類裡增加一個/testconfig方法充當Client端,springcloud-feign-client模組內容參考:一起來學Spring Cloud | 第四章:服務消費者 ( Feign )
1. 在pom.xml檔案中,增加上面新建的模組的依賴包,這樣我們就能使用springcloud-config模組中的eureka和config配置
<dependency>
<groupId>com.haly</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2. 在FeignController類中增加一個測試方法
@Value("${configword}")
String configword;
@GetMapping(value = "/testconfig") public String testconfig(@RequestParam String name) {
return name +",git配置值:" + configword ;
}
3. 啟動服務,進行測試
依次啟動springcloud-eureka-server模組,啟動springcloud-config-server模組,啟動springcloud-feign-client模組
訪問:http://localhost:9600/testconfig?name=young碼農,返回結果 :
young碼農,git配置值:NewConfig !
五、使用本地配置獲取配置項:
1. 修改springcloud-config-server模組中的application.properties配置如下
spring.application.name=springcloud-config-server server.port=7001 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ # 表示使用本地config配置 spring.profiles.active=native # 表示本地配置讀取的目錄檔案位置 spring.cloud.config.server.native.searchLocations: classpath:/config/
2. 在springcloud-config-server模組resources目錄下新建一個config檔案,在config檔案下新建2個配置檔案,配置項內容如下:
configs-dev.properties:configword: dev-configword
configs-test.properties:configword: test-configword
3. 修改springcloud-config模組的bootstrap.yml配置檔案的config配置
ps: 目前我們設定的profile為dev,所以會從configs-dev.properties配置檔案中讀取資料
spring: cloud: config: name: configs profile: dev label: config uri: http://localhost:7001/ eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
4. 啟動服務,執行結果
依次啟動springcloud-eureka-server模組,啟動springcloud-config-server模組,啟動springcloud-feign-client模組
先訪問config-server,瀏覽器輸入:http://localhost:7001/configs/dev/config
{ "name": "configs", "profiles": [ "dev" ], "label": "config", "version": null, "state": null, "propertySources": [ { "name": "classpath:/config/configs-dev.properties", "source": { "configword": "dev-configword" } } ] }
在訪問config-client,瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農,返回結果如下:
young碼農,git配置值:dev-configword
5. 修改springcloud-config模組的bootstrap.yml配置檔案的profile屬性:
ps: 目前我們設定的profile為dev,所以會從configs-test.properties配置檔案中讀取資料
spring: cloud: config: name: configs profile: test label: config uri: http://localhost:7001/
6. 再次啟動服務,執行結果
依次啟動springcloud-eureka-server模組,啟動springcloud-config-server模組,啟動springcloud-feign-client模組
先訪問config-server,瀏覽器輸入:http://localhost:7001/configs/dev/config
{ "name": "configs", "profiles": [ "test" ], "label": "config", "version": null, "state": null, "propertySources": [ { "name": "classpath:/config/configs-test.properties", "source": { "configword": "test-configword" } } ] }
在訪問config-client,瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農,返回結果如下:
young碼農,git配置值:test-configword
&n