1. 程式人生 > >spring cloud bus自動重新整理配置

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之後自然會有解決方案