前面兩篇文章我們聊了Spring Cloud Config配置中心,當(dāng)我們在更新github上面的配置以后,如果想要獲取到最新的配置翔横,需要手動刷新或者利用webhook的機制每次提交代碼發(fā)送請求來刷新客戶端癞谒,客戶端越來越多的時候,需要每個客戶端都執(zhí)行一遍鳖粟,這種方案就不太適合了社裆。
Spring Cloud Bus的一個功能就是讓這個過程變得簡單,當(dāng)遠程Git倉庫的配置更改后向图,只需要向其中的一個微服務(wù)實例發(fā)送一個Post請求泳秀,通過消息組件通知其它微服務(wù)實例重新拉去配置文件即可。
一榄攀、 SpringCloud Bus簡介
Spring Cloud Bus 將分布式的節(jié)點用輕量的消息代理連接起來嗜傅。它可以用于廣播配置文件的更改或者服務(wù)之間的通訊,
也可以用于監(jiān)控航攒。本文要講述的是用Spring Cloud Bus實現(xiàn)通知微服務(wù)架構(gòu)的配置文件的更改磺陡。Spring Cloud Bus可選的消息代理組件包括RabbitMQ,AMQP和Kafka等。
整體實現(xiàn)架構(gòu)圖:
架構(gòu)圖分析
架構(gòu)圖的簡單分析:
⑴Eureka-Server服務(wù)
這個服務(wù)主要是用來服務(wù)的注冊和發(fā)現(xiàn)的漠畜,它是一個注冊中心币他,我們會將Config Server,Config Client這些服務(wù)都注冊進去憔狞。
⑵ Config Server服務(wù)
這個是一個分布式配置中心Config Server蝴悉,通過它我們可以從遠處Git倉庫讀取我們需要的配置文件,所以瘾敢,
Config Client 服務(wù)可以通過連接它來獲取自己需要的配置信息拍冠。
⑶ Config Client服務(wù)
這個服務(wù)是ConfigClient客戶端,它需要從ConfigServer服務(wù)端獲取自己的配置文件信息簇抵。
⑷ 消息總線
可以理解為一個消息代理庆杜,它可以將分布式的節(jié)點都連接起來,也可以完成各個應(yīng)用程序節(jié)點間的相互通信碟摆, 這里我們主要用來廣播配置文件的更改晃财,
并且消息總線的可選消息代理組件包括RabbitMQ,AMQP和Kafka等,這 里我們選中的是RabbitMQ組件典蜕。
⑸/bus/refresh
這個是用來刷新配置的請求断盛,當(dāng)遠程倉庫的配置文件修改后罗洗,我們不需要重新啟動各個子節(jié)點,只需向某一個 子節(jié)點發(fā)送一個Post請求即可钢猛,
消息總線會自動通知其它各個節(jié)點進行配置文件的刷新伙菜。
二、 SpringCloud Bus 使用
1. 準備工作
本文還是基于上一篇文章來實現(xiàn)命迈。按照官方文檔贩绕,我們只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;這就是說我們需要裝rabbitMq壶愤,已在本機上安裝丧叽。安裝教程:https://blog.csdn.net/qq_41307443/article/details/80865409
2. 改造 cloud_13_config_client_high 模塊
復(fù)制子模塊 cloud_13_config_client_high 該名稱 cloud_14_config_client_bus ,修改子模塊的pom公你,并引入父模塊。
在父模塊 引入 子模塊:
3. 在 子模塊的pom中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
完整依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 服務(wù)注冊中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--config-config 的服務(wù)依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 消息總線 Bus -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
4. 修改配置文件
修改 bootstrap.yml 假瞬,修改如下:
server:
port: 9105
## spring cloud eureka
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9090/eureka/
# spring config
spring:
application:
####注冊中心應(yīng)用名稱
name: config-client
cloud:
config:
# github 上的 配置文件前綴名稱
name: config-client
label: master
profile: dev
####讀取config-server注冊地址
discovery:
#指定server端的name,也就是server
service-id: config-server
#開啟Config服務(wù)發(fā)現(xiàn)支持
enabled: true
# 新添加 Bus 配置
bus:
enabled: true
trace:
enabled: true
# 新添加 RabbitMQ
rabbitmq:
host: 192.168.1.107
port: 5672
username: root
password: 123456
management:
endpoint:
endpoints:
web:
exposure:
include: bus-refresh
注意:這里我一開始使用了http的端口 15672陕靠,發(fā)生了上述異常。后面改成了 5672 可以成功連接脱茉。映射2個RabbitMQ有2個端口:5672端口是客戶端和RabbitMQ及通信的接口剪芥,15672端口為管理界面訪問web界面的端口。
5. 修改啟動類
在啟動類上添加注解
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class CloudClientBusApplication {
public static void main(String[] args) {
SpringApplication.run(CloudClientBusApplication.class, args);
}
}
6. 控制類讀取配置文件
@RefreshScope
@RestController
public class ConfigClientController {
// 果獲取不到冒號前的配置琴许,則使用冒號后作為默認值
//@Value("${yaosy:yaosy default}")
@Value("${yaosy}")
private String yaosy;
@Value("${github}")
private String github;
@GetMapping("/yaosy")
public String getYaosy(){
return yaosy ;
}
}
注意:注解 @RefreshScope //配置文件自動刷新
7. 啟動服務(wù)并測試
依次啟動eureka-cloud_eureka_01税肪、 cloud_12_config_server_high, cloud_14_config_client_bus,端口為:9106榜田。
啟動成功后會自動添加RabbitMQ隊列益兄,如圖:
在瀏覽器中訪問:http://127.0.0.1:9106/yaosy 頁面顯示:
進入 github 將yaosy的值改為 : “yaosy version 2.0.0”,即改變配置文件 yaosy 的值箭券。如果是傳統(tǒng)的做法净捅,需要重啟cloud_14_config_client_bus服務(wù),才能達到配置文件的更新辩块。
然而通過Bus蛔六,我們只需要發(fā)送post請求:http://127.0.0.1:9106/actuator/bus-refresh,你會發(fā)現(xiàn)cloud_14_config_client_bus會重新讀取配置文件废亭。
在這里我使用 postman 進行post請求發(fā)送国章,http://127.0.0.1:9106/actuator/bus-refresh .
請求發(fā)送后 cloud_14_config_client_bus 進行重新讀取配置文件。
刷新瀏覽器頁面: