1. 程式人生 > >springBoot+springCloud配置同步及自動更新

springBoot+springCloud配置同步及自動更新

一、配置類如何讀取配置

如下圖所示:@Value(“${sourceid}”)讀取的就是application.properties配置檔案中sourceid對應的值。

如果在配置sourceid時需要為其新增預設值,可以使用“:”後面跟上預設值即可@Value(“${sourceid:預設值}”)。

如下圖所示:這是一個讀取手機號碼字首配置項的示例。Msisdn.prefix.cmcc在application.properties配置檔案中存放的值是“139,131,137.......”這種格式的字串。在取值的時候需要的是以逗號分隔後的字串陣列。所以在讀取配置檔案java類中建立了一個String型別的陣列,在對msisdnPrefixCmcc進行set值的同時會對該字串進行逗號分隔並存放到建立的字串陣列中。

二、使用類讀取方式

1、注入讀取:

在需要讀取配置項的java類中通過@AutoWired註解將對應的讀取配置檔案java類注入。呼叫get方法讀取配置項。

2、通過bean名獲取物件讀取:

在靜態方法中無法使用正常@AutoWired註解注入的讀取配置檔案物件來讀取配置項,但是@AutoWired註解注入不支援靜態注入。所以使用通過bean名的方式來獲取spring管理的bean。

工具類名:ApplicationContextxHelper

使用ApplicationContext.getBean()獲取spring管理的bean例項。該類需要加上@Component註解,讓psring在一開始就掃描到該類並創建出例項。

使用方法:

通過指定bean名及bean的型別來例項化出靜態的讀取配置檔案物件。同樣使用get方法進行讀取配置項。

三、配置中心搭建及讀取配置中心配置

Spring Cloud Config專案是一個解決分散式系統的配置管理方案。它包含了Client(客戶)和Server(服務)兩個部分。

1、Server端配置:

Spring Cloud Config Server本質上也是一個Spring Boot的web專案,只需要新增對應的parent,然後加入相關的依賴就可以啟動這個工程了。

Maven的pom.xml中需要新增以下內容:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>

config server的resource目錄下的application.properties:

 在linux目錄/home/migu_ms/normandy-service下建立配置檔案

在配置中心的application.properties檔案中也可以指定“spring.cloud.config.uri”。標明配置中心的地址及埠號,在Client(客戶)端需要指明配置中心的地址及埠號。

spring.cloud.config.server.git.uri=file://Users/whthomas/config-repo指的專案配置倉庫的位置,這個位置可以是:git資料夾、svn資料夾或者github專案位置,任何能訪問到檔案的地方。

環境倉庫(例子中的資料夾中)中提供環境配置物件配資源給Config Server釋出給各個consumer使用。

環境資源的命名規則由以下的三個引數確定:

{application}對映到Config客戶端的spring.application.name屬性

{profile}對映到Config客戶端的spring.profiles.active屬性,可以用來區分環境,比如dev,test,produce等等

{label}對映到Git伺服器的commit id,分支名稱或者tag,預設值為master

主類中使用註解@EnableConfigServer,開啟Config Server功能。

 2、Client端配置:

Maven的pom.xml中需要新增以下內容:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

resource目錄下的bootstarp.properties新增這樣幾個配置:

  • 配置中心服務的地址 spring.cloud.config.uri
  • 要讀取的配置檔案application屬性 spring.cloud.config.name
  • 要讀取的配置檔案profile屬性,預設是dev spring.cloud.config.profile

在這裡“配置中心地址”和“配置中心暴露的服務名”只需要配置其中一個即可。 

以上配置完成之後,在遠端配置中心的對應的配置就會載入到專案中,和本地使用application.properties配置中新增配置是幾乎一樣的效果,使用@Value註解的配置也可以順利讀取到對應的配置。

 四、配置中心同步(方法一)

配置中心新增pom依賴:

<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>

各微服務新增pom依賴:

<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>

各微服務新增bootstrap配置檔案配置:

## 重新整理時,關閉安全驗證 
management.security.enabled=false 
## 開啟訊息跟蹤 
spring.cloud.bus.trace.enabled=true 

spring.rabbitmq.host=172.30.140.168 
spring.rabbitmq.port=5672 

 配置完成後當配置中心修改配置後需要呼叫介面:http://172.20.10.4:9007/bus/refresh

目前測試使用了normandy和flow兩個專案,當同時修改配置中心中normandy、flow的配置。不呼叫http://172.20.10.4:9007/bus/refresh介面獲取的還是未修改時的配置;呼叫http://172.20.10.4:9007/bus/refresh介面後能過載入修改後的配置。

呼叫http://172.20.10.4:9007/bus/refresh介面重新整理配置,配置中心、各微服務(normandy、flow)都不需要重啟。

四、配置中心同步(方法二)

該方法未親身實踐,對於springBoot+springCloud來說這麼常見的問題應該會有內建的解決方案。於是在網上便找到了內建解決方案的文章。

解決辦法就是在需要動態重新整理的配置類上(這裡的配置類就是我這篇文章標題一里講到的讀取配置檔案的類)加上@RefreshScope註解。

加上@RefreshScope註解後和方法一相同,在修改了配置中心的配置後還是需要呼叫一個post介面來告訴各節點配置已經修改。

配置完成後當配置中心修改配置後需要呼叫介面:http://172.20.10.4:9007/refresh

@RefreshScope註解的原理在那篇文章裡有詳細的說明,感興趣的小夥伴可以去看看。

五、配置中心自動同步

在上述兩個方法中都需要手動呼叫一個介面來完成配置的重新整理。如果需要做到完全的自動重新整理可以使用git的webhooks來完成。配置相當簡單,可以參考文章:https://www.cnblogs.com/andyfengzp/p/6835969.html 中的最後內容。