最近兩天在鼓搗Spring Cloud Bus消息總線的刷新機制問題,探索的路程老是坎坷的,一些坑是逃不掉的,總算將其大概瞭解和配置成功了一番,整體來講仍是不錯的,下面和你們分享一下吧。java
Spring cloud bus經過輕量消息代理鏈接各個分佈的節點,用在廣播狀態的變化(例如配置變化)或者其餘的消息指令,本質是利用了MQ的廣播機制在分佈式的系統中傳播消息,目前經常使用的有Kafka和RabbitMQ。下面說下使用bus後的兩種架構,來看看二者之間的不一樣:git
(1)利用消息總線觸發一個客戶端/bus/refresh,而刷新全部客戶端的配置:github
(2)使用Config Server的/bus/refresh端點,而刷新全部客戶端的配置:web
上面兩張圖均可以實現消息自動刷新的功能,但惟一的不一樣在於一個更利於操做、更加優雅。圖二的架構顯然更加適合,圖一不適合的緣由以下:spring
因此下面咱們按照圖二的架構進行配置吧。windows
1、環境和工具準備bash
開發環境:Windows網絡
開發工具:Eclipse_oxygen、Maven、Git(本地倉庫和遠程倉庫)、rabbitMq架構
(1)rabbitMq下載安裝app
下載地址:http://www.rabbitmq.com/,這裏須要注意的是:rabbitMq的http訪問地址是http://localhost:15672/,注意端口是15672,安裝成功後,可使用默認用戶登陸:
username=guest
userpassword=guest
登陸成功後能夠看到裏面有一項叫Listening ports,其中端口5672就是接下來配置文件中須要用到的,而不是15672,以下圖所示:
(2)Git下載安裝、本地倉庫和遠程倉庫配置
各操做系統下載地址:https://git-scm.com/downloads
Windows下載地址:http://gitforwindows.org/
Git詳細教程地址:http://blog.csdn.net/free_wind22/article/details/50967723
遠程gitHub帳號註冊地址:https://github.com/
固然,在安裝配置以上工具時,可能會出現一些小情況,不過問題不大,有問題能夠提出來,你們一塊兒看看解決。
2、服務搭建
(1) 這裏我添加了服務註冊,你們能夠根據本身須要,服務EurekaServer的建立我就很少說,相信你們應該不陌生了,若是不清楚的能夠參考:http://www.javashuo.com/article/p-qzetofar-mq.html。
(2)config-server建立
具體建立過程能夠參考:http://www.javashuo.com/article/p-howjmlgj-bm.html
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <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>
這裏spring-cloud-starter-bus-amqp是對消息總線的支持,spring-boot-starter-actuator是監控,spring-cloud-starter-eureka是服務註冊(若是沒有建立服務註冊就沒必要添加)。
二、application.properties配置:
spring.application.name=config-server server.port=8888 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #配置git倉庫地址 spring.cloud.config.server.git.uri=https://github.com/CycoolRisk/testgit/ #配置倉庫路徑 #spring.cloud.config.server.git.searchPaths=respo #配置倉庫的分支 spring.cloud.config.label=master #訪問git倉庫的用戶名(公共倉庫可不填) #spring.cloud.config.server.git.username= #訪問git倉庫的用戶密碼(公共倉庫可不填) #spring.cloud.config.server.git.password= management.security.enabled=false #RabbitMq的地址、端口,用戶名、密碼 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
配置中注意spring.rabbitmq.port=5672,https://github.com/CycoolRisk/testgit/是我建立的公共的遠程倉庫,能夠放心使用,也能夠本身新建。
(3)config-client建立
同config-server建立,具體建立過程能夠參考:http://www.javashuo.com/article/p-howjmlgj-bm.html。
一、pom.xml添加依賴項:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <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>
一樣加上必要的消息總線的支持依賴包,spring-cloud-starter-eureka是服務註冊(若是沒有建立服務註冊就沒必要添加)。
二、application.properties配置:
spring.application.name=test-rabbitmq server.port=8889 #配置服務中心網址 spring.cloud.config.uri=http://localhost:8888/ #dev開發環境配置文件,test測試環境,pro正式環境 spring.cloud.config.profile=dev #遠程倉庫的分支 spring.cloud.config.label=master #服務註冊地址 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #是否從配置中心讀取文件 spring.cloud.config.discovery.enable=true #配置中心的servieId,即服務名 spring.cloud.config.discovery.serviceId=config-server management.security.enabled=false #RabbitMq的地址、端口,用戶名、密碼 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
這裏和上面的配置大同小異。
三、Application.java代碼:
@SpringBootApplication @RestController @EnableDiscoveryClient @RefreshScope public class ConfigClientApplication{ public static void main(String[] args){ SpringApplication.run(ConfigClientApplication.class, args); } @Value("${foo}") String foo; @RequestMapping(value="/hi") public String hi() { return foo; } }
省略import。這裏要注意@RefreshScope註解,千萬不能忘了,否則後面的刷新會出現問題,使用該註解的類,會在接到SpringCloud配置中心配置刷新的時候,自動將新的配置更新到該類對應的字段中。類裏的方法的寫法是對配置信息的讀取,可參考:http://www.javashuo.com/article/p-howjmlgj-bm.html。
四、運行Application:
依次運行config-server,config-client,若是有eureka-server服務註冊的話先運行該項。運行成功後先訪問 http://localhost:8888/test-rabbitmq/dev,讀取配置信息,結果以下
{"name":"test-rabbitmq","profiles":["dev"],"label":null,"version":"6f41772ba693825d1f5db40bc8071aecf6f762f1", "state":null,"propertySources":[{"name":"https://github.com/CycoolRisk/testgit/test-rabbitmq.properties", "source":{"foo":"foo version 15"}}]}
接着訪問 http://localhost:8889/hi,結果以下:
foo version 15
(4)bus/refresh刷新
這裏可使用上面安裝的Git工具,點擊 Git Bash,在彈出的命令界面進入本地倉庫中須要修改的配置信息目錄,以下:
打開配置信息test-rabbitmq.properties,修改foo值爲20,並提交到本地和同步到遠程服務倉庫,在修改完值後操做命令界面,即完成提交,以下:
最後,發送post請求,執行命令 curl -X POST http://localhost:8888/bus/refresh,以下:
此時訪問 http://localhost:8889/hi,能夠看到值已經更新了:
foo version 20
經過上面的操做,基本完成了消息自動刷新,固然能夠多建立幾個config-client,來查看是否所有更新,好了,以上是個人一些理解,但願你們喜歡。