Springcloud Bus消息總線原理是實(shí)現(xiàn)詳解
springcloud Bus
什么是springcloud Bus
上一章的springcloud Bus是對(duì)分布式微服務(wù)的遠(yuǎn)程配置,但是有一個(gè)遺留的問題就是,Config客戶端對(duì)遠(yuǎn)程配置的刷新需要手動(dòng)使用post請(qǐng)求來完成,這就使得Config客戶端動(dòng)態(tài)刷新變得十分麻煩。于是消息總線springcloud Bus就是來解決這個(gè)問題的
什么是消息總線
在微服務(wù)架構(gòu)的系統(tǒng)中,通常會(huì)使用輕量級(jí)的消息代理來構(gòu)建一個(gè)共用的消息主題,并讓系統(tǒng)中所有微服務(wù)實(shí)例都鏈接上來。由于該主題中產(chǎn)生的消息都會(huì)被所有實(shí)例監(jiān)聽和消費(fèi),所以稱它為消息總線。
Bus實(shí)現(xiàn)自動(dòng)刷新的原理
所有的Config客戶端都監(jiān)聽MQ中同一個(gè)topic(默認(rèn)是SpringCloudBus)。當(dāng)一個(gè)服務(wù)刷新數(shù)據(jù)的時(shí)候,它會(huì)把這個(gè)信息放入到Topic中,這樣其他監(jiān)聽同一Topic的服務(wù)就能得到通知,然后去更新自身的配置。
由于springcloud Bus支持兩種消息的代理(RabbitMQ和kafka),于是接下來的demo選擇使用RabbitMQ 3.7.14,其他的消息中間件Bus暫不支持
RabbitMQ的下載配置
Erlang
第一步: 下載安裝Erlang,地址:傳送門,安裝除了自定義安裝路徑外,一路next即可
第二步: 配置環(huán)境變量,新建一個(gè)環(huán)境變量命名為ERLANG_HOME,值為Erlang的安裝路徑
path環(huán)境中添加 %ERLANG_HOME%\bin
第三步: win + R 輸入cmd回車,鍵入命令erl測(cè)試配置是否成功
RabbitMQ
第一步: 這里以RabbitMQ 3.7.14為例,地址:傳送門,頁面的最下方有下載的地方,安裝除了自定義安裝路徑外,一路next即可
第二步: 配置環(huán)境變量,新建一個(gè)環(huán)境變量命名為RABBITMQ_SERVER,值為RabbitMQ的安裝路徑
path環(huán)境中添加 %RABBITMQ_SERVER%\sbin
第三步: 安裝管理工具RabbitMQ-Plugins,win + R 輸入cmd回車,鍵入命令
rabbitmq-plugins enable rabbitmq_management
第四步: 第三部安裝的管理工具會(huì)安裝幾個(gè)RabbitMQ的管理快捷方式,可以點(diǎn)擊win鍵查看,點(diǎn)擊即可執(zhí)行對(duì)應(yīng)操作
第五步: 測(cè)試是否安裝成功,瀏覽器http://localhost:15672(默認(rèn)賬號(hào):guest,密碼:guest),登入RabbitMQ的管理頁就表示已經(jīng)安裝成功
Bus動(dòng)態(tài)刷新
Bus動(dòng)態(tài)刷新有兩種設(shè)計(jì)思想,第一種利用消息總線觸發(fā)一個(gè)客戶端的bus/refresh,從而刷新這條總線上的所有客戶端配置;第二種利用消息總線觸發(fā)一個(gè)服務(wù)端ConfigServer的bus/refresh,從而刷新這個(gè)配置中心(服務(wù)端)上注冊(cè)的所有客戶端配置。
以上兩種思想并不是都有應(yīng)用,而是選擇了第二種,因?yàn)榈谝环N設(shè)計(jì)思想會(huì)使得被選中的服務(wù)端節(jié)點(diǎn)在配置獲取職責(zé)之外新增配置刷新的職責(zé),這會(huì)打破微服務(wù)的職責(zé)單一性和各節(jié)點(diǎn)之間的對(duì)等性。且一旦被選中的節(jié)點(diǎn)失效,配置刷新也將會(huì)隨之失效,這條總線上的服務(wù)端依舊無法實(shí)時(shí)獲取到最新的配置。
全局廣播通知代碼實(shí)現(xiàn)
此時(shí)配置相關(guān)微服務(wù)一共有三個(gè),它們是配置中心服務(wù)端3344、客戶端3355、客戶端3366,全局廣播的代碼實(shí)現(xiàn)需要對(duì)三個(gè)微服務(wù)都進(jìn)行配置
配置中心3344: pom文件和配置文件
<!--添加消息總線RabbitMQ支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
spring:
#rabbitmq相關(guān)配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
##rabbitmq相關(guān)配置,暴露bus刷新配置的端點(diǎn) SpringCloud Bus動(dòng)態(tài)刷新全局廣播
management:
endpoints: #暴露bus刷新配置的端點(diǎn)
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相關(guān)配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
以3366為例,配置文件的縮進(jìn)如下
server:
port: 3366spring:
application:
name: config-client
cloud:
config:
uri: http://localhost:3344 #配置中心的地址
label: master #分支名稱
name: config #配置文件名稱
profile: dev #讀取后綴名稱 上述三個(gè)綜合http://localhost:3344/master/config-dev.yml
#rabbitmq相關(guān)配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#服務(wù)注冊(cè)到eureka地址
eureka:
client:
service-url:
#設(shè)置與eureka server交互的地址查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址
defaultZone: http://localhost:7001/eureka #單機(jī)版# 暴露監(jiān)控端點(diǎn) 否則 curl -X POST "http://localhost:3355/actuator/refresh" 不可使用
management:
endpoints:
web:
exposure:
include: "*"
??值得注意的是,之前rabbitmq的web訪問端口是15672,但是在代碼中連接rabbitmq使用的端口是5672,這里很容易踩坑
完成前面的配置,使用以下鏈接訪問配置中心服務(wù)端3344、客戶端3355、客戶端3366的配置信息
http://localhost:3344/master/config-dev.yml
http://localhost:3355/configInfo
http://localhost:3366/configInfo
然后修改gitee上的遠(yuǎn)程配置,仍然使用上面鏈接訪問,會(huì)發(fā)現(xiàn)只有配置中心服務(wù)端獲取的配置是最新的,但是配置客戶端的配置還是修改前的,需要使用win+R輸入命令刷新,再訪問的話配置客戶端就是最新的配置了
curl -X POST "http://localhost:3344/actuator/bus-refresh"
定點(diǎn)通知代碼實(shí)現(xiàn)
bus除了可以一個(gè)命令刷新總線上的所有微服務(wù)之外,還可以支持定點(diǎn)刷新,命令如下
定點(diǎn)通知一個(gè)
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
定點(diǎn)通知多個(gè)
curl -X POST "http://localhost:3344/actuator/bus-refresh/{config-client:3355,config-client:3366}"
到此這篇關(guān)于Springcloud Bus消息總線原理是實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Springcloud Bus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java編程實(shí)現(xiàn)基于UDP協(xié)議傳輸數(shù)據(jù)的方法
這篇文章主要介紹了java編程實(shí)現(xiàn)基于UDP協(xié)議傳輸數(shù)據(jù)的方法,較為詳細(xì)的分析了UDP協(xié)議的原理及Java編程實(shí)現(xiàn)數(shù)據(jù)傳輸客戶端與服務(wù)器端的相關(guān)技巧,需要的朋友可以參考下2015-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(2)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07