一、消息总线
在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。
二、spring cloud bus
spring cloud bus整合 java的事件处理机制和消息中间件消息的发送和接受,主要由发送端、接收端和事件组成。针对不同的业务需求,可以设置不同的事件,发送端发送事件,接收端接受相应的事件,并进行相应的处理。
spring cloud bus 通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring Cloud Bus通过分布式的启动器对 Spring Boot 应用进行扩展,如果它在类路径上检测到自己的工作。所有您需要做的是启用总线是将spring-cloud-starter-bus-amqp或spring-cloud-starter-bus-kafka添加到您的依赖关系管理中,Spring Cloud负责其余部分。
三、简单实战
本文采用消息中间件Rabbit MQ,其它参考文档:
中文文档:https://springcloud.cc/spring-cloud-bus.html"
四、config-client整合spring cloud bus
改造上一节的config-client项目实现自动刷新
4.1 pom添加依赖
pom文件中添加spring-cloud-starter-bus-amqp和spring-boot-starter-actuator依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.2 更改配置文件
在配置文件application.properties中加上RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码。并需要加上spring.cloud.bus的三个配置,具体如下:
#Enable spring cloud bus 默认是true
spring.cloud.bus.enabled=true
# 开启消息跟踪 默认是flase
spring.cloud.bus.trace.enabled=true
#加入actuator依赖,并管理endpoint
management.endpoints.web.exposure.include=bus-refresh
# rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
4.3 更改ConfigClientApplication
添加RefreshScope注解
@SpringBootApplication
@RestController
@EnableEurekaClient
@RefreshScope
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${name}")
private String name;
@RequestMapping(value = "/hi")
public String hi(){
return "I am "+name;
}
}
4.4 验证结果
依次启动eureka-server、confg-cserver,启动两个config-client,端口为:8087、8088。
访问http://localhost:8087/hi 或者http://localhost:8088/hi 浏览器显示:
I am Payne Yu
这时我们去代码仓库将name的值改成另外一个值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:
http://localhost:8887/actuator/bus-refresh,通过控制台日志可以看到config-client会重新读取配置文件
Fetching config from server at : http://localhost:8086/
注意: Spring boot 2.0版本访问地址是**/actuator/bus-refresh**
Spring boot 2.0的改动较大,/bus/refresh全部整合到actuator里面了,变成了/actuator/bus-refresh,所以之前1.x的management.security.enabled全部失效,不适用于2.0
再次访问http://localhost:8087/hi 或者http://localhost:8088/hi ,我们将会获取git仓库更新后的值,不需要重启服务
另外,/actuator/bus-refresh接口可以指定服务,即使用"destination"参数,比如 “/actuator/bus-refresh**?destination**=customers:**” 即刷新服务名为customers的所有服务。
4.5 流程图分析
GitHub项目地址:https://github.com/PayneYu/spring-cloud-study