1. 程式人生 > >Spring Cloud Bus整合RabbitMQ ( 17 )

Spring Cloud Bus整合RabbitMQ ( 17 )

轉自 https://blog.csdn.net/u012702547/article/details/77823434

這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持續的更新過來

上篇文章中小夥伴們已經學會了RabbitMQ的基本安裝與使用以及如何在Spring Boot中使用RabbitMQ,整體來說還是比較簡單的。本文我們來看看Spring Cloud Bus和RabbitMQ的整合,看看如何更簡單的實現配置重新整理。


本文是Spring Cloud系列的第二十七篇文章,瞭解前二十六篇文章內容有助於更好的理解本文:

1.使用Spring Cloud搭建服務註冊中心 
2.使用Spring Cloud搭建高可用服務註冊中心 
3.Spring Cloud中服務的發現與消費 
4.Eureka中的核心概念 
5.什麼是客戶端負載均衡 
6.Spring RestTemplate中幾種常見的請求方式 
7.RestTemplate的逆襲之路,從傳送請求到負載均衡 
8.Spring Cloud中負載均衡器概覽 
9.Spring Cloud中的負載均衡策略 
10.Spring Cloud中的斷路器Hystrix 
11.

Spring Cloud自定義Hystrix請求命令 
12.Spring Cloud中Hystrix的服務降級與異常處理 
13.Spring Cloud中Hystrix的請求快取 
14.Spring Cloud中Hystrix的請求合併 
15.Spring Cloud中Hystrix儀表盤與Turbine叢集監控 
16.Spring Cloud中宣告式服務呼叫Feign 
17.Spring Cloud中Feign的繼承特性 
18.Spring Cloud中Feign配置詳解 
19.Spring Cloud中的API閘道器服務Zuul
 
20.Spring Cloud Zuul中路由配置細節 
21.Spring Cloud Zuul中異常處理細節 
22.分散式配置中心Spring Cloud Config初窺 
23.Spring Cloud Config服務端配置細節(一) 
24.Spring Cloud Config服務端配置細節(二)之加密解密 
25.Spring Cloud Config客戶端配置細節 
26.Spring Cloud Bus之RabbitMQ初窺


Spring Cloud Config客戶端配置細節一文中,我們提到過配置檔案動態重新整理的問題,結合RabbitMQ,這一需求可以更加輕鬆的實現。我們先來看下面一張架構圖:

這裡寫圖片描述

整張圖的工作流程我們之前也詳細的說過,當我的微服務A/微服務B啟動的時候,會從Config-Server中載入配置檔案,而Config-Server則會通過git clone命令將配置中心的配置檔案先clone下來在本地儲存一份,然後再返回給微服務A/微服務B。 
這是我們之前的工作流程,現在我們結合Spring Cloud Bus來實現配置檔案的動態更新。使用Spring Cloud Bus來實現配置檔案的動態更新原理很簡單,如上圖,當我的配置檔案更新後,我向Config-Server中傳送一個/bus/refresh請求,Config-Server收到這個請求之後,會將這個請求廣播出去,這樣所有的微服務就都收到這個請求了,微服務收到這個請求之後就會自動去更新自己的配置檔案。在這個系統中,從RabbitMQ的角度來看,所有的微服務都是一樣的,所以這個/bus/refresh請求我們也可以在微服務節點上發出,一樣能夠實現配置檔案動態更新的效果,但是這樣做就破壞了我們微服務的結構,使得微服務節點之間有了區別,所以重新整理配置的請求我們還是放在Config-Server上來做比較合適,好了,下面我們就來看看如何實現這一需求。

當我的微服務需要註冊到eureka註冊中心時,我需要給它新增spring-cloud-starter-eureka依賴,而當我的微服務需要使用Spring Cloud Bus時,我就給它新增spring-cloud-starter-bus-amqp依賴,我們在之前的Config-Server和Config-Client上都新增如下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

OK,新增好依賴之後,由於我們的Config-Server一會要連線到RabbitMQ伺服器上,所以在Config-Server的application.properties中做如下配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=sang
spring.rabbitmq.password=123456

配置好之後,分別啟動我們的Eureka註冊中心、Config-Server和Config-Client(Config-Client啟動兩個例項,方便我們測試),我們在Config-Server和Config-Client的啟動日誌中都可以看到如下內容:

Mapped “{[/bus/refresh],methods=[POST]}” onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpo 
int.refresh(java.lang.String)

這個介面就是在我們添加了spring-cloud-starter-bus-amqp依賴之後具備的,Config-Server和Config-Client都具備這個介面。

此時我們訪問http://localhost:2008/sang,我們看到的內容如下:

這裡寫圖片描述

然後我們通過git工具,修改配置倉庫中檔案的內容,修改之後提交,提交之後如果我們直接訪問http://localhost:2008/sang,內容還是不變,此時我們可以利用POSTMAN或者RestClient傳送一個POST請求到http://localhost:2007/bus/refresh地址,這個時候Config-Server收到通知之後,就會廣播配置檔案改變的訊息,此時再訪問http://localhost:2008/sanghttp://localhost:2009/sang,就能看到改變後的配置檔案了:

這裡寫圖片描述

此時我們發現兩個例項http://localhost:2008/sanghttp://localhost:2009/sang都改變了,如果我們我們只想通知其中一個微服務更新配置,那麼在重新整理請求的時候攜帶上一個引數就行了,比如當我的配置檔案更新後,我只想埠號為2008的例項更新配置,埠號為2009的例項不更新配置,那麼在配置檔案修改之後,我只需傳送如下請求即可:http://localhost:2007/bus/refresh?destination=configClient:2008,destination後面指定要更新的例項的instance-id,小夥伴們注意我這裡的config-client的如下兩條配置:

spring.application.name=configClient
eureka.instance.instance-id=${spring.application.name}:${server.port}

每一個例項的instance-id是spring.application.name和spring.application.name和{server.port}共同組成。

好了我們的Spring Cloud Bus整合RabbitMQ就說到這裡,有問題歡迎小夥伴們留言討論。