跟我學SpringCloud | 第八篇:Spring Cloud Bus 消息匯流排

来源:https://www.cnblogs.com/babycomeon/archive/2019/07/08/11141160.html
-Advertisement-
Play Games

SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息匯流排 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面兩篇文章我們聊了Spring Cloud Config配置中心 ...


SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息匯流排

Springboot: 2.1.6.RELEASE

SpringCloud: Greenwich.SR1

如無特殊說明,本系列教程全採用以上版本

前面兩篇文章我們聊了Spring Cloud Config配置中心,當我們在更新github上面的配置以後,如果想要獲取到最新的配置,需要手動刷新或者利用webhook的機制每次提交代碼發送請求來刷新客戶端,客戶端越來越多的時候,需要每個客戶端都執行一遍,這種方案就不太適合了。使用Spring Cloud Bus(國人很形象的翻譯為消息匯流排,我比較喜歡叫消息公車)可以完美解決這一問題。

1. Spring Cloud Bus

Spring cloud bus通過輕量消息代理連接各個分佈的節點。這會用在廣播狀態的變化(例如配置變化)或者其他的消息指令。Spring bus的一個核心思想是通過分散式的啟動器對spring boot應用進行擴展,也可以用來建立一個多個應用之間的通信頻道。目前唯一實現的方式是用AMQP消息代理作為通道,同樣特性的設置(有些取決於通道的設置)在更多通道的文檔中。

大家可以將它理解為管理和傳播所有分散式項目中的消息既可,其實本質是利用了MQ的廣播機制在分散式的系統中傳播消息,目前常用的有Kafka和RabbitMQ。利用bus的機制可以做很多的事情,其中配置中心客戶端刷新就是典型的應用場景之一,我們用一張圖來描述bus在配置中心使用的機制。

根據此圖我們可以看出利用Spring Cloud Bus做配置更新的步驟:

  1. 提交代碼觸發post給客戶端A發送bus/refresh
  2. 客戶端A接收到請求從Server端更新配置並且發送給Spring Cloud Bus
  3. Spring Cloud bus接到消息並通知給其它客戶端
  4. 其它客戶端接收到通知,請求Server端獲取最新配置
  5. 全部客戶端均獲取到最新的配置

2. 項目示例

我們使用上一篇文章中的config-server和config-client來進行改造,mq使用rabbitmq來做示例。

2.1 客戶端config-client

2.1.1 添加依賴

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

需要多引入spring-cloud-starter-bus-amqp包,增加對消息匯流排的支持

2.1.2 配置文件 bootstrap.properties

spring.application.name=spring-cloud-config-client
server.port=8081

spring.cloud.config.name=springcloud-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=spring-cloud-config-server

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

management.endpoints.web.exposure.include=*

## 開啟消息跟蹤
spring.cloud.bus.trace.enabled=true

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=
spring.rabbitmq.password=

配置文件需要增加RebbitMq的相關配置,這樣客戶端代碼就改造完成了。

2.1.3 測試

依次啟動eureka,config-serve,config-client。

修改config-client啟動配置,同時在8081和8082埠啟動服務。

啟動完成後,瀏覽器分別訪問連接:http://localhost:8081/hellohttp://localhost:8082/hello, 可以發現頁面顯示的內容都是:hello dev update1,說明客戶端都已經讀取到了server端的內容。

現在我們更新github上的配置文件,將配置內容改為hello dev update,先訪問一下http://localhost:8081/hello,可以看到頁面依然顯示為:hello dev update1。

我們對埠為8081的服務發送一個/actuator/bus-refresh的POST請求,在win10下使用下麵命令來模擬webhook。

curl -X POST http://localhost:8081/actuator/bus-refresh

註意: 在springboot2.x的版本中刷新路徑為:/actuator/bus-refresh,在springboot1.5.x的版本中刷新路徑為:/bus/refresh。

執行完成後,我們先訪問http://localhost:8082/hello,可以看到頁面列印內容已經變為:hello dev update,這樣說明,我們8081埠的服務已經把更新後的信息通過rabbitmq推送給了8082埠的服務,這樣我們就實現了圖一中的示例。

2.2 改進版

上面的流程中,雖然我們做到了利用一個消息匯流排觸發刷新,而刷新所有客戶端配置的目的,但是這種方式並不合適,如下:

  • 打破了微服務的職責單一性。微服務本身是業務模塊,它本不應該承擔配置刷新的職責。
  • 破壞了微服務各節點的對等性。
  • 如果客戶端ip有變化,這時我們就需要修改WebHook的配置。

我們可以將上面的流程改進一下:

這時Spring Cloud Bus做配置更新步驟如下:

  1. 提交代碼觸發post給Server端發送bus/refresh
  2. Server端接收到請求併發送給Spring Cloud Bus
  3. Spring Cloud bus接到消息並通知給其它客戶端
  4. 其它客戶端接收到通知,請求Server端獲取最新配置
  5. 全部客戶端均獲取到最新的配置

這樣的話我們在server端的代碼做一些改動,來支持/actuator/bus-refresh

和上面的client端的改動基本一致

2.2.1 添加依賴

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

需要多引入spring-cloud-starter-bus-amqp包,增加對消息匯流排的支持

2.2.2 配置文件application.yml

server:
  port: 8080
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/meteor1993/SpringCloudLearning
          search-paths: chapter6/springcloud-config
          username: 
          password: 
  rabbitmq:
    host: 217.0.0。1
    port: 5672
    username: 
    password: 
management:
  endpoints:
    web:
      exposure:
        include: "*"
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

配置文件需要增加RebbitMq的相關配置,actuator開啟所有訪問。

2.2.3 測試

依次啟動eureka,config-serve,config-client。

修改config-client啟動配置,同時在8081和8082埠啟動服務。

按照上面的測試方式,訪問兩個客戶端測試均可以正確返回信息。同樣修改配置文件,將值改為:hello im dev update並提交到倉庫中。在win10下使用下麵命令來模擬webhook。

curl -X POST http://localhost:8081/actuator/bus-refresh

執行完成後,依次訪問兩個客戶端,返回:hello im dev update。說明三個客戶端均已經拿到了最新配置文件的信息,這樣我們就實現了上圖中的示例。

示例代碼-Github

參考:http://www.ityouknow.com/springcloud/2017/05/26/springcloud-config-eureka-bus.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果已經在元素中標識了class或id,就可以在選擇器中使用這個標準,從而只對已標識的元素進行格式化。不過推薦使用類選擇器,一會兒我會解釋理由。 要在class選擇器和id選擇器之間作出選擇的時候,建議儘可能地使用class選擇器。這主要是因為我們可以復用class選擇器。有人提議完全不使用id選擇 ...
  • 什麼是 canvas 按例是要介紹一下 canvas 的,在沒有 canvas 之前,我們為了網頁的效果,很多情況下是使用了圖片來實現,不過用圖片就需要載入,而且圖片的體積也是一個問題,所以在 html5 的規範里新增了一個 canvas 元素(畫布) 那麼其實在 html5 中有兩個 2d 圖形技 ...
  • 整理 Kindle 標註、書簽和筆記從未如此簡單! Kindle 標註管理應用 "Kindle Mate" 只支持 Windows,不支持 Mac。標註只是解析 我的剪貼 文本文件,配合 "FileReader" API,寫個 Chrome 擴展解析文本文件就好了。 <! more "Chrome ...
  • 使用new關鍵字調用函數 test.js 代碼如下 function Person(name, age, obj) { var o = new Object(); o.name = name; o.age=age; o.obj=obj; o.sayName=function(){ alert(thi ...
  • 由於筆記比較雜,本身學習程度並不理想,所以暫時沒有整理這些繁雜的筆記。 ps:博客園markdown用起來和看起來都舒服太多了,這才是我瞭解的那個markdown,又回來了! 筆記 DOM對象 document object model DOM 中節點種類一共有三種 註:在JS中所有的節點都是對象 ...
  • 重新建立引用關係: 導出多個成員(必須在對象中): 方法一(使用 exports): exports.a = 123; exports.b = 'hello'; exports.c = () => { console.log('ccc'); }; exports.d = { foo: 'bar' } ...
  • 在http://www.w3school.com.cn/ 學習前端知識,利用暑假,自主學習以拓展知識面 DAY 1 HTML 不是一種編程語言,而是一種標記語言 (markup language) 標記語言是一套標記標簽 (markup tag) HTML 使用標記標簽來描述網頁 HTML 文檔描述 ...
  • 這裡總結一下上次使用bootstrap-select的過程中遇到的一些問題。至於bootstrap-select的具體使用方法這裡就不介紹了,網上有很多例子。 地址: 官方插件地址:https://developer.snapappointments.com/bootstrap-select Git ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...