在本教程第三講Spring Cloud 入門教程(三): 配置自動重新整理中,通過POST方式向客戶端傳送/refresh請求, 可以讓客戶端獲取到配置的最新變化。但試想一下, 在分散式系統中,如果存在很多個客戶端都需要重新整理改配置,通過這種方式去重新整理也是一種非常痛苦的事情。那有沒有什麼辦法讓系統自動完成呢? 之前我們提到用githook或者jenkins等外部工具來觸發。現在說另外一種思路, 如果refresh命令可以傳送給config server,然後config server自動通知所有config client, 那麼就可以大大簡化配置重新整理工作。這樣,雖然仍然需要通過refresh命令觸發, 但通過webhook等鉤子方式, 我們只需要將關聯的命令掛到配置中心上,而不需要每個配置客戶端都去關聯。
現在,我們通過整合訊息佇列Rabbitmq來完成這件事。我們的目標是, 當git倉庫中的配置一旦更改,將refresh命令傳送給配置中心,然後配置中心通過訊息佇列,自動通知所有使用了該配置的重新整理各自配置。
Spring Cloud Netflix Bus是Spring Cloud的訊息機制,當Git Repository 改變時,通過POST請求Config Server的/bus/refresh,Config Server 會從repository獲取最新的資訊並通過amqp傳遞給client,如圖所示.
1. RabbitMQ的安裝和配置的過程,這裡就不贅述了。
2. 以第三節的程式為基礎, config Server和config client兩個專案中均新增一些內容, 在pom.xml中增加
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
2. 在配置檔案bootstrap.yml(config client裡面是application.yml)中增加關於RabbitMQ的連線和使用者資訊:
- spring:
- rabbitmq:
- host: localhost
- port: 5672
- username: springcloud
- password: 123456
3. 以上配置高好後,配置重新整理,就只需要向config server傳送 /bus/refresh的POST請求就可以了.
4. 如果用poster等傳送POST請求是出現錯誤:“Full authentication is required to access this resource.", 那麼可以在yml配置檔案中加入以下內容禁止Config server的許可權攔截。
- management:
- security:
- enabled: false #忽略許可權攔截