??各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛
💡Bus知識點速覽
- 🍹 springcloud Bus
- 🍸 什么是springcloud Bus?
- 🍷 什么是消息總線?
- 🍷 Bus實現自動刷新的原理
- 🍹 RabbitMQ的下載配置
- 🍸 Erlang
- 🍸 RabbitMQ
- 🍹 Bus動態刷新
- 🍸 全局廣播通知代碼實現
- 🍸 定點通知代碼實現
🍹 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,地址:http://erlang.org/download/otp_win64_21.3.exe,安裝除了自定義安裝路徑外,一路next即可
??第二步: 配置環境變量,新建一個環境變量命名為ERLANG_HOME,值為Erlang的安裝路徑
path環境中添加 %ERLANG_HOME%\bin
??第三步: win + R 輸入cmd回車,鍵入命令erl測試配置是否成功
🍸 RabbitMQ
??第一步: 這里以RabbitMQ 3.7.14為例,地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.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: localhostport: 5672username: guestpassword: 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: localhostport: 5672username: guestpassword: guest
以3366為例,配置文件的縮進如下
server:port: 3366spring:application:name: config-clientcloud:config:uri: http://localhost:3344 #配置中心的地址label: master #分支名稱name: config #配置文件名稱profile: dev #讀取后綴名稱 上述三個綜合http://localhost:3344/master/config-dev.yml#rabbitmq相關配置rabbitmq:host: localhostport: 5672username: guestpassword: 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: "*"
??🚩值得注意的是,之前rabbitmq的web訪問端口是15672,但是在代碼中連接rabbitmq使用的端口是5672,這里很容易踩坑
??完成前面的配置,使用以下鏈接訪問配置中心服務端3344、客戶端3355、客戶端3366的配置信息
http://localhost:3344/master/config-dev.yml
http://localhost:3355/configInfo
http://localhost:3366/configInfo
??然后修改gitee上的遠程配置,仍然使用上面鏈接訪問,會發現只有配置中心服務端獲取的配置是最新的,但是配置客戶端的配置還是修改前的,需要使用win+R輸入命令刷新,再訪問的話配置客戶端就是最新的配置了
curl -X POST "http://localhost:3344/actuator/bus-refresh"
🍸 定點通知代碼實現
??bus除了可以一個命令刷新總線上的所有微服務之外,還可以支持定點刷新,命令如下
定點通知一個
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
定點通知多個
curl -X POST "http://localhost:3344/actuator/bus-refresh/{config-client:3355,config-client:3366}"