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
<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>demo2020artifactId>
<groupId>cn.chen.demogroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>config-client3366artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>cn.chen.demogroupId>
<artifactId>api-commonartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
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.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
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添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
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"
springcloud学习系列目录