BUS介紹
Spring Cloud Bus將分佈式系統的節點與輕量級消息代理鏈接。這可以用於廣播狀態更改(例如配置更改)或其他管理指令。一個關鍵的想法是,Bus就像一個擴展的Spring Boot應用程序的分佈式執行器,但也可以用作應用程序之間的通信渠道。當前唯一的實現是使用AMQP代理作爲傳輸,但是相同的基本功能集(還有一些取決於傳輸)在其他傳輸的路線圖上。
簡單點來說,就是動態刷新配置中心配置文件,讓服務可以不用重啓就能讓配置文件生效,bus在配置中心通過廣播的形式來告訴所有訂閱者刷新配置文件,目前這種機制採用消息隊列實現,支持rabbitmq、Kafka消息隊列,我將用rabbitmq介紹一下bus的具體使用。
搭建環境
1.新建eureka
請參考:springcloud(一)註冊中心eureka
2.新建config配置中心
請參考:springcloud(二)配置中心config
3.在cloud-config服務端
引入bus服務端依賴
<!--健康檢查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--消息總線bus-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
bootstrap.yml配置文件引入rabbitmq以及放開權限:
server:
port: 9100 #端口
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #註冊中心地址
spring:
application:
name: cloud-config #服務名
profiles:
# active: native #拉取本地配置
active: git #拉取git配置
# active: subversion
cloud:
bus:
trace:
enabled: true
enabled: true
config:
server:
# native:
# search-locations: file:F:\git\springcloud\config #本地拉起
git:
uri: https://github.com/361426201/cloud-config.git #git地址 需要注意一點,我拉取的是公共倉庫,不需要用戶名和密碼,如果你拉取的是私有倉庫,需要加上用戶名密碼
# username: xxxx
# password: xxxx
label: master #指定拉取git的那個分支
# svn:
# uri: xxxxxxxxxxxxx #svn的地址
# username: xxx #用戶名
# password: xxx #密碼
# default-label: trunk #類似git中的分支
# search-paths: {application} #可有可無
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: '*'
新增配置:
4.配置客戶端1:cloud-user 2:cloud-order
引入依賴:
<!--消息總線bus-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
啓動cloud-eureka、cloud-config、cloud-user、cloud-order
cloud-user測試controller:
cloud-order測試controller:
第一次訪問分別訪問localhost:8800/test、localhost:8900/test
現在修改git上面的配置文件
現在再次訪問,你會發現name並沒有發生改變,那是因爲bus需要手動刷新,所以還需要一步
5.訪問接口:localhost:9100/actuator/bus-refresh POST請求方式
再次訪問:你會發現配置文件還是沒有發生變化
name還是張三,並沒有變成tom,這是爲什麼呢? 這個坑讓我好找,這是因爲我們還缺少一個註解,那就是在使用配置的類中加入:@RefreshScope
重啓cloud-user、cloud-order
不過,我們還需要再次修改一下git上面的配置文件
刷新配置文件:localhost:9100/actuator/bus-refresh
再次訪問:localhost:8800/test、localhost:8900/test
漂亮,name已經加載到最新的配置文件,這樣配置後,以後修改配置文件就無需再次重啓服務,是不是不要太爽?