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"springcloud学习系列目录