Spring Cloud Bus + RabbitMq 自動刷新

    最近兩天在鼓搗Spring Cloud Bus消息總線的刷新機制問題,探索的路程老是坎坷的,一些坑是逃不掉的,總算將其大概瞭解和配置成功了一番,整體來講仍是不錯的,下面和你們分享一下吧。java

    Spring cloud bus經過輕量消息代理鏈接各個分佈的節點,用在廣播狀態的變化(例如配置變化)或者其餘的消息指令,本質是利用了MQ的廣播機制在分佈式的系統中傳播消息,目前經常使用的有Kafka和RabbitMQ。下面說下使用bus後的兩種架構,來看看二者之間的不一樣:git

    (1)利用消息總線觸發一個客戶端/bus/refresh,而刷新全部客戶端的配置:github

    (2)使用Config Server的/bus/refresh端點,而刷新全部客戶端的配置:web

    上面兩張圖均可以實現消息自動刷新的功能,但惟一的不一樣在於一個更利於操做、更加優雅。圖二的架構顯然更加適合,圖一不適合的緣由以下:spring

  • 打破了微服務的職責單一性。微服務自己是業務模塊,它本不該該承擔配置刷新的職責。
  • 破壞了微服務各節點的對等性。
  • 有必定的侷限性。例如,微服務在遷移時,它的網絡地址經常會發生變化,此時若是想要作到自動刷新,那就不得不修改WebHook的配置。

    因此下面咱們按照圖二的架構進行配置吧。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

    一、pom.xml添加依賴項:

<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,來查看是否所有更新,好了,以上是個人一些理解,但願你們喜歡。

    源碼下載地址:https://github.com/CycoolRisk/testgit

相關文章
相關標籤/搜索