Spring Cloud Bus 是用來將分佈式系統的節點與輕量級消息系統鏈接起來的框架,整合了java的事件處理機制和消息中間件功能。
目前支持RabbitMQ和Kafka兩種消息代理。
能管理和傳播分佈式系統間的消息,就像是一個分佈式執行器,可用於廣播狀態更改、事件推送等,也可以當做微服務間的通信通道。
1.分佈式自動刷新配置功能
2.Spring Cloud Bus配合Spring Cloud Config使用可以實現配置的動態刷新
3.Bus支持兩種消息代理:RabbitMQ和Kafka
rabbitMQ環境配置
1.下載安裝erlang。(因爲rabbitmq服務器是由erlang語言編寫的,所以需要先安裝erlang環境)
鏈接: https://pan.baidu.com/s/1aky1SZqcHuNkQBkMbQVCyA 提取碼: j6qm
2.下載安裝rabbitMQ。
https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
3.進入RabbitMQ安裝目錄下的sbin目錄,輸入以下命令啓動管理功能
【E:\DevSoftWare\RabbitMQ Server\rabbitmq_server-3.7.14\sbin】
rabbitmq-plugins enable rabbitmq_management
4.可視化插件,rabbitMQservice - start 點擊啓動服務
訪問地址查看是否安裝成功:http://localhost:15672/
默認賬號密碼都是 guest
Bus動態刷新全局廣播
一、在原有的基礎上,增加3366(直接copy3355就行了)
1.新建module: config-client3366
2.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo2020</artifactId>
<groupId>cn.chen.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-client3366</artifactId>
<dependencies>
<!-- spring cloud config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--公共模塊-->
<dependency>
<groupId>cn.chen.demo</groupId>
<artifactId>api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.yml
server:
port: 3366
spring:
application:
name: config-client
cloud:
config: # config客戶端配置
label: master # 分支名稱
name: config # 配置文件名稱
profile: dev # 讀取後綴名稱
# 上述三個:master分支上的config-dev.yml的配置文件
uri: http://config-3344.com:3344 # 配置中心地址
#uri: http://localhost:3344 # 配置中心地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
management:
endpoints:
web:
exposure:
include: "*"
4.主啓動
@SpringBootApplication
public class ConfigClientApplication3366 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication3366.class, args);
}
}
5.業務類
@RestController
@RefreshScope
@RequestMapping("/configClient")
public class ConfigClientController {
@Value("${server.port}")
private String port;
@Value("${config.info}")
private String configInfo;
@GetMapping("/info")
public String getConfigInfo(){
String result = "來自 " + port + " 端的配置信息:" + configInfo;
return result;
}
}
3355也更改一下,方便看信息是來自哪個端的
二、設計思想
兩種方式:
1.利用消息總線觸發一個客戶端/bus/refresh,從而刷新所有客戶端的配置
2.利用消息總線觸發一個服務端ConfigServer的/bus/refresh端點,而刷新所有客戶端的配置(更加推薦)
第一種方式不適合的原因:
1.打破了微服務的職責單一性,因爲微服務本身是業務模塊,它本不應該承擔配置刷新職責
2.破壞了微服務各節點的對等性
3.有一定的侷限性。例如,微服務在遷移時,它的網絡地址常常會發生變化,此時如果想要做到自動刷新,那就會增加更多的修改
三、給cloud-config-center-3344配置中心服務端添加消息總線支持
1.pom文件引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2.yml增加 ①rabbitmq配置(在spring下面) ②暴露端口
#消息中間件rabbitmq
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#暴露端口
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
四、給cloud-config-center-3355客戶端添加消息總線支持
1.pom添加依賴
<!-- bus-amqp -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2.yml文件添加rabbitmq配置
#消息中間件rabbitmq
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
五、給cloud-config-center-3366客戶端添加消息總線支持(同上)
六、測試啦啦啦
1.啓動7001、3344、3355、3366
2.改github上配置文件
3.發送post請求:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
一次發送,處處生效
4.訪問
http://config-3344.com/config-dev.yml
http://localhost:3355/configClient/info
http://localhost:3366/configClient/info
總結:一次修改,廣播通知,處處生效
SpringCloud Bus動態刷新定點通知:不需要全部通知,局部通知
1.公式:http://localhost:配置中心的端口號/actuator/bus-refresh/{destination}
server並通過destination參數類指定需要更新配置的服務或實例:服務名:端口號
2.只通知3355:
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"