前言:對于應用,配制檔案通常是放在項目中管理的,它可能有spring、mybatis、log等等各種各樣的配置檔案和屬性檔案,另外你還可能有開發環境、測試環境、生産環境等,這樣的話就得一式三份,若是傳統應用還好說,如果是微服務呢,這樣不光配置檔案有可能備援而且量大,繁重複雜,不好維護,這樣的話就需要一個配置檔案的統一管理了。
一、SpringCloud Config簡介
SpringCloud Config為分布式系統外部化配置提供了伺服器端和用戶端的支援,它包括ConfigServer和ConfigClient兩部分。

Server:
- 執行個體一般多于兩個,以實作HA;
- 配置以檔案形式存儲,快速支援目前以SpringBoot的開發方式的配置檔案;
- 支援GIt,碼雲,SVN,本地檔案等多種形式;
- 支援屬性加密;
Client:即各自的微服務應用;
使用SpringCloud BUS配置和借助Git倉庫的WebHooks自動重新整理;
二、SpringCloud Config基本使用
建立服務端:
1、前面簡單介紹了一下Config,那麼首先要做的準備是先到Git倉庫或者碼雲中建立一個項目并建立一些配置檔案
spring-cloud-repo:
2、建立Maven工程
config-server,添加依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、建立啟動類,并加上開啟Config服務端注解@EnableConfigServer:
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
4、添加application屬性檔案:
server.port=9000
spring.application.name=config-server-9000
spring.cloud.config.server.git.uri=https://gitee.com/lfalex/spring-cloud-repo
5、啟動項目,簡單測試,通路:localhost:9000/application/dev,localhost:9000/application-dev.properties:
通路規則:
/{appication}/{profile}/[{label}]
/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
/{label}/{application}-{profile}.yml
它們都可以映射到對應的配置檔案{application}-{profile}.properties,其中{label}為具體的分支,預設為master;
建立用戶端(一般為具體的微服務):
1、建立Maven項目
config-client<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 實作Config的用戶端配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 實作通過端點refresh手動重新整理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、建立一般啟動類即可,無需添加注解,建立Controller,為測試做準備:
@Value("${version}")
private String version;
@RequestMapping("/getVersion")
public String getVersion() {
return this.version;
}
3、為了更明顯的測試Config是否生效,在application配置檔案中添加:
server.port=9001
4、添加bootstrap.properties配置檔案,bootstrap.properties為預設檔案名,在springcloud中配置檔案有個優先級的概念,當本地application.properties檔案和bootstrap.properties檔案中配置了同樣的屬性不同的值,由于bootstrap的優先級高,則在bootstrap中的屬性不會被application中的覆寫,反而會覆寫掉application中的配置:
#對應着config server所擷取配置檔案的{application}和URL
spring.application.name=application
spring.cloud.config.uri=http://localhost:9000/
#對應着檔案後面的字尾{profile}
spring.cloud.config.profile=dev
#分支
spring.cloud.config.label=master
5、先啟動伺服器,再啟動用戶端,觀察端口和頁面,由于前面在application中添加了端口為9001,而遠端倉庫的配置檔案中也添加了端口9999:
這樣就實作了基本的遠端配置倉庫了,但是一旦有檔案更改還得重新啟動項目,這樣就很有問題了,是以需要重新整理,使用/refresh端點重新整理:
1、在application或遠端檔案中添加:
#由于要使用actuator,是以必須要将安全權限關閉
management.security.enabled=false
2、在controller上添加注解@RefreshScope注解:
@RestController
@RefreshScope //非重新開機項目手動重新整理配置注解
public class ConfigController {
。。。。
}
3、啟動測試,打開,修改version=dev-3.0.0為version=dev-4.0.0,并發送重新整理請求http://localhost:9999/refresh,重新整理測試頁面檢視:
三、SpringCloud Bus自動重新整理配置
前面的基于端點重新整理,隻針對一個服務,若為多個微服務,這樣就很繁瑣,是以需要一個可以集體重新整理或指定重新整理的元件=》SpringCloud Bus;
1、使用SpringCloud Bus需要使用RabbitMQ,未安裝的請
安裝,基于之前的端點重新整理的項目,添加依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2、在bootstrap中增加RabbitMQ的配置:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
3、啟動
config-bus-client測試,打開,修改version=dev-3.0.0為version=dev-4.0.0,并發送重新整理請求http://localhost:9999/bus/refresh,重新整理測試頁面檢視:
還可以通過Git或者碼雲的WebHooks來發送修改重新整理配置請求: