SpringCloud Bus概述
概述
Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于实现微服务架构中的消息总线。它利用了轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件,实现了在分布式系统中的消息传递和事件广播。
Spring Cloud Bus旨在简化微服务架构中的配置管理和状态同步。它允许将配置更改或状态更新广播到整个分布式系统中的各个微服务实例。通过使用消息总线,微服务可以轻松地获取最新的配置信息,并且能够了解其他微服务的状态变化。
作用
-
配置的集中管理: Spring Cloud Bus与Spring Cloud Config(配置中心)集成,可以实现集中式的配置管理。当配置发生变化时,只需更新配置中心的配置,Spring Cloud Bus会将新的配置信息广播给所有订阅了消息总线的微服务。
-
快速的配置更新: 通过使用消息总线,配置的更新可以迅速传播到整个分布式系统中的所有微服务实例,而无需每个微服务都主动去拉取配置。这样可以减少配置更新的延迟,提高系统的响应速度。
-
系统状态的同步: Spring Cloud Bus不仅可以用于配置的更新,还可以用于系统状态的同步。当一个微服务的状态发生变化时,它可以通过消息总线广播给其他微服务,从而实现微服务之间的状态同步。
-
可扩展的消息传递: Spring Cloud Bus提供了灵活的扩展机制,可以与其他Spring Cloud组件无缝集成。例如,可以与Spring Cloud Stream(消息驱动的微服务)集成,实现更高级的消息传递模式。
基本原理
Spring Cloud Bus的原理是基于消息代理和事件广播机制。
-
消息代理: Spring Cloud Bus使用轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件。消息代理负责接收和分发消息,并确保消息的可靠传递。微服务通过连接到消息代理,可以发送和接收消息。
-
事件广播: 当一个微服务的配置发生变化或状态发生改变时,它会将这些变化作为消息发送到消息代理。消息代理将这些消息广播给所有订阅了消息总线的微服务。这样,其他微服务就能够接收到这些变化,并及时做出相应的响应。
安装RabbitMQ
- *安装Erlang:
下载地址:http://erlang.org/download/otp_win64_21.3.exe,下载完成后点击安装即可。 - 安装RabbitMQ
下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14.exe,下载完成后点击安装。
安装RabbitMQ后进入sbin目录下
执行命令rabbitmq-plugins enable rabbitmq_management
启动mq,如下图就启动成功
访问地址http://localhost:15672/ 如下图
账号密码都为,guest
Demo配置
新建模块cloud-config-client-3366
pom.xml
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></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><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>
bootstrap.yml
server:port: 3366spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.ymluri: http://localhost:3344 #配置中心地址# 暴露监控端点
management:endpoints:web:exposure:include: "*"#服务注册到eureka地址
eureka:instance:# 配置eureka的状态显示hostname: localhostinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}client: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka
启动类
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3366 {public static void main(String[] args) {SpringApplication.run(ConfigClientMain3366.class, args);}}
controller
@RestController
@RefreshScope //Spring Cloud 提供的用于动态刷新配置的注解,会在调用 /actuator/refresh 接口时重新加载配置并更新 configInfo 的值。
public class ConfigClientController {@Value("${spring.cloud.config.info}")private String configInfo;@GetMapping("/configInfo")public String getConfigInfo() {return configInfo;}
}
配置中心3344添加消息总线支持
pom.xml
<!--添加消息总线RabbitMQ支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
bootstrap.yml
##rabbitmq相关配置,暴露bus刷新配置的端点
management:endpoints: #暴露bus刷新配置的端点web:exposure:include: 'bus-refresh'
客户端3355,3366添加消息总线支持
pom.xml
<!--添加消息总线RabbitMQ支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
bootstrap.yml修改后
server:port: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.ymluri: http://localhost:3344 #配置中心地址#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口rabbitmq:host: localhostport: 5672username: guestpassword: guest# 暴露监控端点
management:endpoints:web:exposure:include: "*"#服务注册到eureka地址
eureka:instance:# 配置eureka的状态显示hostname: localhostinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}client: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka
测试
修改gitee上的配置,config info version由2改为3提交
发送POST请求来触发刷新
http://localhost:3344/actuator/bus-refresh
查看客户端结果
3355和3366均已成功更新
动态刷新定点通知
不想全部通知,只想定点通知:只通知3355,不通知3366
简单一句话:指定具体某一个实例生效而不是全部
公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
案例:
我们这里以刷新运行在3355端口上的config-client为例:只通知3355,不通知3366
http://localhost:3344/actuator/bus-refresh/config-client:3355