此文章主要講解springcloud中的消息總線Bus(不推薦)的相關知識。
Spring Cloud Bus
Spring Cloud Bus是什麼?
-
Spring Cloud Bus配置Spring Cloud Config使用可以實作配置的動态重新整理。
- Spring Cloud Bus是用來分布式系統的節點和輕量級消息系統連接配接起來的架構,它整合了Java事件處理機制和
的功能。消息中間件
- Spring Cloud Bus目前支援
和RabbitMQ
。Kafka
Spring Cloud Bus能幹嘛?
Spring Cloud Bus能管理和傳播分布式系統間的消息,就像一個分布式執行器,可用于廣播狀态更改、事件推送等,也可以當做微服務間的通信通道。
為什麼稱為總線?
什麼是總線
- 在微服務架構的系統中,通常會使用輕量級的消息代理來建構一個共用的消息主題,并讓系統中所有微服務執行個體都連接配接上來。由于該主題中産生的消息會被所有執行個體監聽和消費,是以稱其為消息總線。
- 在總線上的各個執行個體,都可以友善的傳播一些需要讓其他連接配接在該主題上的執行個體都知道的消息。
基本原理
- Config Client執行個體都監聽MQ中的同一個Topic(預設是SpringCloudBus)。當一個服務重新整理資料的時候,其他監聽到這個主題的服務就會得到通知,然後去更新自身的配置。
設計思想
根據上圖我們可以看出Spring Cloud Bus做配置更新的步驟:
- 送出代碼觸發POST請求給bus/refresh。
- Server端接收到請求并發送給Spring Cloud Bus。
- Spring Cloud Bus接收到消息并通知給其他用戶端。
- 其他用戶端接收到通知,請求Server端擷取最新配置。
- 全部用戶端擷取到最新的配置。
安裝RabbitMQ
windows安裝
- 安裝RabbitMQ的依賴環境 Erlang 下載下傳位址: http://erlang.org/download/otp_win64_21.3.exe
- 安裝RabbitMQ,下載下傳位址: http://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
- 進入 rabbitMQ安裝目錄的sbin目錄下,打開cmd視窗,執行以下指令,啟動管理功能:
rabbitmq-plugins enable rabbitmq_management
- 通路【 http://localhost:15672/ 】,輸入賬号和密碼:預設都為 guest
- 在電腦服務清單裡,将RabbitMQ啟動方式改為手動
docker方式安裝
docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root -p 15672:15672 -p 5672:5672 rabbitmq:management # 這裡設定了預設賬号密碼都是root,可以自定義
動态重新整理全局廣播
必須先具備良好的RabbitMQ環境
還是在之前的 3344(config server)和 3355(config client)兩個項目來改進。
建立子產品
以 3355 為模闆建立一個子產品:cloud-config-client-3366
服務端修改
cloud-config-center3344
POM添加依賴
<!-- 添加rabbitMQ的消息總線支援包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML配置
application.yml 增加如下内容
# rabbitMq的相關配置
rabbitmq:
host: localhost
port: 5672 # # 15672是管理界面端口,5672是連接配接端口
username: guest
password: guest
# rabbitmq 的相關配置2 暴露bus重新整理配置的端點
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
用戶端修改
POM添加依賴
<!-- 添加rabbitMQ的消息總線支援包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML配置
bootstrap.yml
server:
port: 3366
spring:
application:
name: config-client
cloud:
# config 用戶端配置
config:
label: master # 分支名稱
name: config # 應用名稱,需要對應git中配置檔案名稱的前半部分
profile: dev # 開發環境,需要對應git中配置檔案名稱的後半部分
uri: http://config-3344.com:3344 # config Server 的請求位址
# 綜合上面四個 即讀取配置檔案位址為: http://config-3344.com:3344/master/config-dev.yml
# rabbitMq的相關配置,注意縮進
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
測試
啟動相關微服務,7001/3344/3355/3366。
修改Github或Gitee上的yml檔案,并送出。
向
config server
發送POST請求
curl -X POST "http://localhost:3344/actuator/bus-refresh"
注意,
之前是向 config client 一個個發送請求
,但是這次是
向 config server 發送請求
,而所有的config client 的配置也都全部更新,
一次發送,處處生效
。
動态重新整理定點通知
概述
有的時候,不需要在重新整理服務端的時候,将與之對應的所有用戶端都動态重新整理,而是隻需要重新整理具體的某個用戶端即可。
方法
發送POST請求到
http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
即可。
{destination}為
用戶端微服務名稱:端口号
,微服務名稱小寫。