spring cloud bus自動重新整理配置
1. spring cloud bus 自動重新整理配置的原理
、
2. 在config-server中匯入依賴
<!--自動重新整理配置--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-monitor</artifactId> </dependency>
在config-client 中匯入
<!--自動重新整理配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3. 啟動專案後,在rabbitmq 中可以看到兩個例項
4. 在github 中配置config-server的外網地址
5. 修改github 上配置檔案的內容
6. 檢視config-server的後臺日誌
顯示重新載入配置檔案
7. 可以看到rabbitmq 中的訊息已經送達
8. 檢視config-client 端的後臺日誌,顯示為重新拉取配置,載入配置,重啟專案
顯示從遠端上拉取配置的日誌:
Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://github.com/springcloud-wxsell/config-repo.git/order-test.yml'}]}
9. 當你的專案後臺打印出這些日誌時,說明自動重新整理配置構建完成,可以進行訪問了
不用重啟專案,也可以動態的重新整理配置,這就是spring-cloud-bus的優秀所在,在這裡恭喜自己堅持不懈吧!
@Data
@Component
@ConfigurationProperties("boy")
@RefreshScope // 動態重新整理相關值
public class BoyConfig {
// 姓名
private String name;
// 年齡
private Integer age;
}
@RestController
@RequestMapping("/boy")
public class BoyController {
@Autowired
private BoyConfig boyConfig;
@GetMapping("/print")
public String print() {
return "name:" + boyConfig.getName() + "; age:" + boyConfig.getAge();
}
}
10. 重點來了,spring-cloud-bus的爬坑思路和啟示,看到這裡的小夥伴,你們才真正是最成功的
往往不要太在意結果,更多的關注應該放在找bug和解決bug的過程上來,希望小夥伴學到這個思路之後,遇到其他問題,可以舉一反三。
問題發現:
我在github上修改了相關配置之後,config-server後臺日誌,就開始打印出從遠端拉取最新配置的日誌,載入配置重啟專案,一切都是我所期望的那樣,然後再檢視rabbitmq, 訊息的圖線也顯示為折線圖,說明訊息在mq中傳遞是沒有問題的,而config-client端的後臺日誌也列印了,只是缺少拉取配置檔案,和重啟專案的日誌,仔細分析後,覺得是config-client在接收mq訊息的地方出了問題,甚至懷疑已經接收到了訊息,我第一個猜測是spring-cloud-bus的元件的判斷出了問題。
那這個元件,spring-cloud-bus監聽訊息的入口在哪裡,首先我想到可以通過檢視日誌
問題解決:
第1步:增加spring-cloud-bus的日誌記錄
第2步:修改配置檔案,並檢視config-client的後臺日誌
可以看到要匹配order:test: 和 order:8090: ,很明顯,匹配不上。
於是,我又猜測,是否可以將埠號8090 修改為test,應該就可以匹配上了,開始驗證
我想到的是從獲取埠號的源頭開始,
第3步:下載spring-cloud-bus的原始碼(我用到的spring-cloud-bus的版本是2.0.0.RELEASE),並匯入進來
# down下來
git clone https://github.com/spring-cloud/spring-cloud-bus.git
# 強制reset 到2.0.0.RELEASE 提交的節點
git reset --hard 1974b23
選擇根目錄下的pom.xml檔案,將專案匯入進來
判斷專案是否成功引入,可以點選
看看是不是直接跳到原始碼
如果跳不到,請檢查依賴的版本和原始碼版本是否一致
第4步:檢視相關類和方法
private String getDefaultServiceId(ConfigurableEnvironment environment) {
return "${vcap.application.name:${spring.application.name:application}}:${vcap.application.instance_index:${spring.application.index:${local.server.port:${server.port:0}}}}:${vcap.application.instance_id:${random.value}}";
}
該方法的作用就是獲取配置資訊
In match: order:test:**,
order:8090:fc4fc7f19d834b9c1d2e56936b341057
return "${vcap.application.name:${spring.application.name:application}}:${vcap.application.instance_index:
${spring.application.index:${local.server.port:${server.port:0}}}}:${vcap.application.instance_id:${random.value}}";
第5步:修改原始碼(我們想獲取的配置資訊是test)
修改為: ${spring.cloud.config.profile}
我的配置檔案中配置資訊為:
就可以將test值拿到
修改後需要返回的引數為
return "${vcap.application.name:${spring.application.name:application}}:${vcap.application.instance_index:${spring.cloud.config.profile:${local.server.port:${server.port:0}}}}:${vcap.application.instance_id:${random.value}}";
編譯,重啟動專案,檢視日誌.
再次對比一下修改前後的後臺日誌
修改本地的spring-cloud-bus 相關原始碼後,顯示的日誌為
修改原始碼之前,顯示的日誌
完成!過程很重要,歡迎指點!
ps: 個人不建議修改原始碼直接使用,配置自動重新整理在生產上先不要使用,坐等官方釋出新版本之後修復bug之後自然會有解決方案