SpringCloud入門(十): Config 統一配置中心
SpringCloud Config 簡介
在分散式系統中,由於服務元件過多,為了方便爭對不通的環境下的服務配置檔案統一管理,實時更新,所以出現了分散式配置中心元件。市面上開源的配置中心有很多,360的QConf、淘寶的diamond、百度的disconf都是解決這類問題。國外也有很多開源的配置中心Apache的Apache Commons Configuration等。SpringCloud中選用的是SpringCloud Config。
SpringCloud Config分為Config Server和Config Client兩部分,為分散式系統外部化配置提供了支援。 由於Config Server和Config Client都實現了對Spring Environment和PropertySource抽象的對映,因此SpringCloud Config非常適合Spring應用程式,當然也可與其他語言應用程式配合使用。
Config Server是一個可橫向擴充套件、集中式的配置伺服器,它用於集中管理應用程式各個環境下的配置(開發,測試,生產,灰度),預設使用Git儲存配置內容(也可使用Subversion、本地檔案系統或Vault儲存配置),因此可以方便的實現對配置的版本控制與內容審計。 Config Client 是Config Server的客戶端,用於操作儲存在Config Server中的配置屬性。
SpringCloud Config帶來的便利
1、集中管理配置,通過Config來對叢集中所有元件服務的配置資訊進行集中管理;
2、爭對不同的環境進行不同的配置(開發,聯調,測試,灰度,生產);
3、執行期間可動態調整,根據伺服器的負載情況動態的設定連線池資訊或者熔斷閾值;
4、配置修改後,不需要關閉服務可自動更新配置;
SpringCloud Config入門
1、申請一個自己的git倉庫,將測試專案得yml或properties檔案上傳至Git目錄;
2、構建Config Service
<!-- 1、引入Jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- 2、配置屬性資訊 --> server: port: 9005 spring: application: name: ms-cfg-service cloud: config: server: git: uri: https://gitee.com/******/springcloudconfig.git username: ****** password: ******
<!-- 3、加註解@EnableConfigServer -->
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
備註:配置檔案有三種訪問方式,分別是:
1)通過application-{profiles}.yml來訪問,eg:http://localhost:8080/application-dev.yml
2)通過/application/{profiles}/{lable}來訪問, eg:http://localhost:8080/application/dev/master
3)通過/{lable}/application-{profiles}.yml來訪問,eg:http://localhost:8080/master/application-dev.yml
3、構建Config Client
<!-- 1. 引入Jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- 2. 建立配置檔案bootstrap.yml --> spring: application: name: application cloud: config: uri: http://localhost:8080/ profile: dev label: master
備註: spring.application.name 對應訪問規則中的{application}
spring.cloud.config.profile 對應訪問規則中的{profiles}
spring.cloud.config.label 對應訪問規則中的{lable}
SpringCloud config的常規用法
我們定義一個openTest開關,來控制業務邏輯程式碼走新的邏輯分支還是走老的業務邏輯分支
方法一:
<!-- 1、在屬性檔案中定義一個變數 --> ycdhz.openTest=dev <!-- 2、在程式碼中通過@Value註解引用 --> @Value("${ycdhz.openTest}") private String openTest; public void findInfo(){ if(openTest.equal("dev")){ System.out.print("開發環境") } else if (openTest.equal("test")){ System.out.print("測試環境") } else { System.out.print("生產環境") } } <!-- 3、修改屬性檔案,重啟生效-->
方法二:
<!-- 1、再Client端工程,引入jar包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 2、再Client端工程,開啟refresh的監控端點 --> management: endpoints: web: exposure: include: "*" 開啟所有的端點 <!-- 3、在讀取配置檔案中的類上加入@RefreshScope --> @RestController @RequestMapping("/order") @RefreshScope public class OrderController { @Value("${openTest}") private String openTest; } <!-- 4、在git上修改openTest的配置檔案 --> 通過Post請求,執行http://localhost:8001/actuator/refresh重新整理介面
備註:不在需要重啟,只需要通過Post執行重新整理方法即可。但是當需要在叢集中大面積修改的情況下依舊很繁瑣,需要對每一個服務進行重新整理。
方法三:
配置Config Client
<!-- 1、在client端工程,引入jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 2、在client端工程,配置屬性 --> spring: application: name: application cloud: config: uri: http://localhost:9000/ label: master rabbitmq: host: ****IP地址**** port: ****埠號**** virtual-host: ****host名**** username: root password: root connection-timeout: 10000 template: mandatory: true management: endpoints: web: exposure: include: "*" server: port: 8080
配置 config Service
<!-- 1、在Service端工程,引入jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 2、在Service端工程,配置屬性 --> server: port: 9000 spring: application: name: ms-cfg-service cloud: config: server: git: uri: https://gitee.com/******/springcloudconfig.git username: ****** password: ****** rabbitmq: host: ****IP地址**** port: ****埠號**** virtual-host: ****host名**** username: root password: root connection-timeout: 10000 template: mandatory: true <!-- 3、在Git上更新配置資訊,訪問bus-refresh重新整理服務配置 --> 訪問監控端點http://localhost:9000/actuator/bus-refresh重新整理所有服務的配置資訊
備註:使用訊息匯流排bus來實現,不再需要去爭對一個個服務元件做重新整理。原理如圖:
&n