1. 程式人生 > 實用技巧 >【SpringCloud】SpringCloud Bus訊息匯流排

【SpringCloud】SpringCloud Bus訊息匯流排

SpringCloud Bus訊息匯流排

概述

上一講解的加深和擴充,一言以蔽之

  • 分散式自動重新整理配置功能
  • Spring Cloud Bus配合Spring Cloud Config使用可以實現配置的動態重新整理

是什麼

Spring Cloud Bus配合Spring Cloud Config使可以實現配置的動態重新整理。

Spring Cloud Bus是用來將分散式系統的節點與輕量級訊息系統連結起來的框架,它整合了Java的事件處理機制和訊息中介軟體的功能。
Spring Clud Bus目前支援RabbitMQ和Kafka.

能幹嘛

Spring Cloud Bus能管理和傳播分散式系統間的訊息,就像一個分散式執行器, 可於播狀態更改、事件推送等,也可以當作微服務間的通訊通道。

為什麼被稱為匯流排

什麼是匯流排
在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題, 並讓系統中所有微服務例項都連線上來。由於該主題中產生的訊息會被所有例項監聽和消費,所以稱它為訊息匯流排。在總線上的各個例項,都可以方便地廣播-些需要讓其他連線在該主題上的例項都知道的訊息。

基本原理
ConfigClient例項都監聽MQ中同-個topic(預設是springCloudBus)。當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置。

https://www. bilili.com/video/av55976700?from=search&seid= 15010075915728605208

RabbitMQ環境配置

安裝Elang,下載地址

https://www.erlang.org/downloads

安裝RabbitMQ,下載地址

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3.exe

進入RabbitMQ安裝目錄下的sbin目錄

輸入以下命令啟動管理功能

  • rabbitmq-plugins enable rabbitmq_management
  • 視覺化外掛

訪問地址看是否成功安裝

http://localhost:15672

輸入賬號並登入 guest guest

SpringCloud Bus動態重新整理全域性廣播

必須具備良好的RabbitMQ環境

演示廣播效果,增加複雜度,再以3355位模板製作一個3366

只是換個埠,其他與3355一致

設計思想

1.利用訊息匯流排觸發一個客戶端/bus/refresh,從而重新整理所有客戶端配置

2.利用訊息匯流排觸發一個服務端ConfigServer的/bus/refresh端點,從而重新整理所有客戶端配置

圖二的架構顯然更加合適,圖一不合適原因如下

  • 打破了微服務的職責單一性,因為微服務本身是業務模組,它本不應該承擔配置重新整理的職責
  • 破壞了微服務各節點的對等性
  • 有一定的侷限性,例如,微服務在遷移時,它的網路地址常常會發生變化,此時如果想要做到自動重新整理那就會增加更多的修改

給cloud-config-center-3344配置中心服務端新增訊息匯流排支援

POM

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

YML

server:
  port: 3344

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          #uri: [email protected]:EiletXie/config-repo.git #Github上的git倉庫名字
          uri: https://github.com/EiletXie/config-repo.git
          ##搜尋目錄.這個目錄指的是github上的目錄
          search-paths:
            - config-repo
      ##讀取分支
      label: master
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

#rabbitmq相關設定 ,暴露 bus重新整理配置的端點
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

給cloud-config-center-3355配置中心服務端新增訊息匯流排支援

POM

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

YML

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客戶端配置
    config:
      label: master #分支名稱
      name: config #配置檔名稱
      profile: dev #讀取字尾名稱 上訴3個綜合就是 master分支上 config-dev.yml
      uri: http://localhost:3344
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

#暴露監控端點
management:
  endpoints:
    web:
      exposure:
        include: "*"

給cloud-config-center-3366配置中心服務端新增訊息匯流排支援

POM

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

YML

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    #Config客戶端配置
    config:
      label: master #分支名稱
      name: config #配置檔名稱
      profile: dev #讀取字尾名稱 上訴3個綜合就是 master分支上 config-dev.yml
      uri: http://localhost:3344
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

#暴露監控端點
management:
  endpoints:
    web:
      exposure:
        include: "*"

測試

運維工程師

修改Github上配置檔案增加版本號

傳送Post請求

  • curl -X POST "http://localhost:3344/actuator/bus-refresh"
  • 一次傳送,處處生效

配置中心

http://lconfig-3344.com:3344/config-dev.yml

客戶端

  • http://localhost:3355/configInfo
  • http://localhost:3366/configInfo
  • 獲取配置資訊,發現都已經重新整理了

一次修改,廣播通知,處處生效

SpringCloud Bus動態重新整理定點通知

不想全部通知,只想定點通知

  • 只通知3355
  • 不通知3366

簡單一句話

  • 指定某一例項生效而不是全部
  • 公式:http://localhost:3344/actutor/bus-refresh/{destination}
  • /bus/refresh請求不再發送到具體的服務實力上,而是發給config server通過destination引數指定需要更新配置的服務或例項

案例

我們這裡以重新整理3355埠上的config-client為例

  • 只通知3355
  • 不通知3366

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

通知總結All