首頁 > 軟體

Springcloud Bus訊息匯流排原理是實現詳解

2022-09-14 22:06:37

springcloud Bus

什麼是springcloud Bus

  上一章的springcloud Bus是對分散式微服務的遠端設定,但是有一個遺留的問題就是,Config使用者端對遠端設定的重新整理需要手動使用post請求來完成,這就使得Config使用者端動態重新整理變得十分麻煩。於是訊息匯流排springcloud Bus就是來解決這個問題的

什麼是訊息匯流排

  在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題,並讓系統中所有微服務範例都連結上來。由於該主題中產生的訊息都會被所有範例監聽和消費,所以稱它為訊息匯流排。

Bus實現自動重新整理的原理

  所有的Config使用者端都監聽MQ中同一個topic(預設是SpringCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其他監聽同一Topic的服務就能得到通知,然後去更新自身的設定。

  由於springcloud Bus支援兩種訊息的代理(RabbitMQ和kafka),於是接下來的demo選擇使用RabbitMQ 3.7.14,其他的訊息中介軟體Bus暫不支援

RabbitMQ的下載設定

Erlang

  第一步: 下載安裝Erlang,地址:傳送門,安裝除了自定義安裝路徑外,一路next即可

  第二步: 設定環境變數,新建一個環境變數命名為ERLANG_HOME,值為Erlang的安裝路徑

path環境中新增 %ERLANG_HOME%bin

  第三步: win + R 輸入cmd回車,鍵入命令erl測試設定是否成功

RabbitMQ

  第一步: 這裡以RabbitMQ 3.7.14為例,地址:傳送門,頁面的最下方有下載的地方,安裝除了自定義安裝路徑外,一路next即可

  第二步: 設定環境變數,新建一個環境變數命名為RABBITMQ_SERVER,值為RabbitMQ的安裝路徑

path環境中新增 %RABBITMQ_SERVER%sbin

  第三步: 安裝管理工具RabbitMQ-Plugins,win + R 輸入cmd回車,鍵入命令

rabbitmq-plugins enable rabbitmq_management

  第四步: 第三部安裝的管理工具會安裝幾個RabbitMQ的管理快捷方式,可以點選win鍵檢視,點選即可執行對應操作

  第五步: 測試是否安裝成功,瀏覽器http://localhost:15672(預設賬號:guest,密碼:guest),登入RabbitMQ的管理頁就表示已經安裝成功

Bus動態重新整理

  Bus動態重新整理有兩種設計思想,第一種利用訊息匯流排觸發一個使用者端的bus/refresh,從而重新整理這條匯流排上的所有使用者端設定;第二種利用訊息匯流排觸發一個伺服器端ConfigServer的bus/refresh,從而重新整理這個設定中心(伺服器端)上註冊的所有使用者端設定。

  以上兩種思想並不是都有應用,而是選擇了第二種,因為第一種設計思想會使得被選中的伺服器端節點在設定獲取職責之外新增設定重新整理的職責,這會打破微服務的職責單一性和各節點之間的對等性。且一旦被選中的節點失效,設定重新整理也將會隨之失效,這條匯流排上的伺服器端依舊無法實時獲取到最新的設定。

全域性廣播通知程式碼實現

  此時設定相關微服務一共有三個,它們是設定中心伺服器端3344、使用者端3355、使用者端3366,全域性廣播的程式碼實現需要對三個微服務都進行設定

  設定中心3344: pom檔案和組態檔

<!--新增訊息匯流排RabbitMQ支援-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

spring:
    #rabbitmq相關設定
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest
##rabbitmq相關設定,暴露bus重新整理設定的端點 SpringCloud Bus動態重新整理全域性廣播
management:
  endpoints: #暴露bus重新整理設定的端點
    web:
      exposure:
        include: 'bus-refresh'

  使用者端3355、3366: pom檔案和組態檔

<!--新增訊息匯流排RabbitMQ支援-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

spring:
    #rabbitmq相關設定
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

以3366為例,組態檔的縮排如下

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    config:
      uri: http://localhost:3344  #設定中心的地址
      label: master  #分支名稱
      name: config  #組態檔名稱
      profile: dev  #讀取字尾名稱   上述三個綜合http://localhost:3344/master/config-dev.yml
  #rabbitmq相關設定
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
#服務註冊到eureka地址
eureka:
  client:
    service-url:
      #設定與eureka server互動的地址查詢服務和註冊服務都需要依賴這個地址
      defaultZone: http://localhost:7001/eureka #單機版

# 暴露監控端點 否則 curl -X POST "http://localhost:3355/actuator/refresh" 不可使用
management:
  endpoints:
    web:
      exposure:
        include: "*"

  


IT145.com E-mail:sddin#qq.com