前言:對於應用,配制文件通常是放在項目中管理的,它可能有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來發送修改刷新配置請求:
參考書籍:《SpringCloud與Docker微服務架構實戰》周力著
代碼示例:https://gitee.com/lfalex/springcloud-example( config-server、 config-client、 config-bus-client)