1 SpringCloudBus干啥的呢?
由我上一篇文章集中配置組件SpringCloudConfig
我們已經(jīng)知道了配置文件可以在遠端做一個便捷的統(tǒng)一管理,這比較方便我們?nèi)ゲ榭春托薷?br>
但是呢,如果我們更新碼云中的配置文件,那客戶端數(shù)據(jù)查的是未修改狀態(tài)數(shù)據(jù),證明修改服務(wù)器中的配置并沒有更新立刻到工程,只有重新啟動程序才會讀取配置。 那我們?nèi)绻朐诓恢貑⑽⒎?wù)的情況下更新配置如何來實現(xiàn)呢? 我們使用SpringCloudBus來實現(xiàn)配置的自動更新
代碼實現(xiàn) 主要利用了springboot的監(jiān)聽和消息中間件(這里用的rabbitmq)
1. config服務(wù)端
(1)修改config統(tǒng)一配置文件管理微服務(wù)的pom.xml,引用消息總線和rabbit依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
(2)修改application.yml ,添加配置
spring:
rabbitmq:
host: 192.144.144.144
management:
endpoints:
web:
exposure:
include: bus-refresh //config里的消息總線配置
2 修改需要實時監(jiān)聽配置文件更新的微服務(wù)模塊
我們還是以基礎(chǔ)模塊為例,加入消息總線
(1)修改base工程 ,引入依賴
這里發(fā)現(xiàn)導入bus模塊時候與已有mysql版本沖突,具體的是mysql的drive無法識別,高版本的要求的driver不是com.mysql.jdbc.Driver,而我們使用的是dirver:com.mysql.jdbc.Driver,故為了防止引入jar包后由于我們沒有指定mysql的版本號系統(tǒng)自動匹對更高版本的,所以我們這里特別引入了mysql的版本
<dependency> <!--rabbitmq-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency><!-- springboot監(jiān)聽器 監(jiān)聽rabbitmq是否傳入refresh-bus配置文件刷新-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency><!--消息總線bus-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency> //bus版本沖突,這里特別引用了mysql版本
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
(2)在碼云的配置文件中配置rabbitMQ的地址:
rabbitmq:
host: 192.144.144.144
(2)啟動config模塊 ,eureka模塊和base模塊 看是否正常運行
(3)修改碼云上的配置文件 ,將數(shù)據(jù)庫連接IP 改為127.0.0.1 ,在本地部署一份數(shù)據(jù) 庫。
(4)postman測試 Url: http://127.0.0.1:12000/actuator/bus-refresh Method: post
(5)再次觀察輸出的數(shù)據(jù)是否是讀取了本地的mysql數(shù)據(jù)。
這樣就搞定了
我們上面自動刷新的配置信息僅限于框架自己的配置(比如數(shù)據(jù)庫的鏈接地址)我們可以進行更新
如果我們在配置文件中定義了一些自己的自定義信息
比如:
yml文件中寫
zyh: 177
我們在項目中定義
@value("${zyh}")
private String zyh;
這樣搞的話,只能得到zyh的信息,如果我們在碼云中修改,它是無法得到新的值的
如果們向得到新的值
需要在類上定義
@RefreshScope