Bus
Bus 简介
Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。可以使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令,以下是 Bus 适用的场景:
- 一个事件,需要广播或者单独传递给某个接口。
- 配置更新了,但是其他系统不知道是否更新。
SpringCloud 默认使用 RabbitMQ 作为消息队列组件。
分布式配置中心 Config 结合 Bus
部署 MQ 服务
这里基于 Docker 部署 RabbitMQ
docker pull rabbitmq:management #拉取镜像
docker run -d --hostname rabbit-host --name="myrabbitmq" -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 5672:5672 -p 15672:15672 rabbitmq:3-management
访问控制台
http://192.168.31.210:15672/
config-client 配置
引入依赖
<!--配置中心结合消息队列-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
RabbitMQ 连接配置,并且暴露接口(这样 GitHub 才能通过 Hook 去出发 config client 去主动更新最新的配置)
spring: #服务的名称
rabbitmq:
host: 192.168.31.210
port: 5672
username: admin
password: admin
#暴露全部的监控信息
management:
endpoints:
web:
exposure:
include: "*"
验证环节
在 product-server 项目调用方法中引入配置文件的 env 属性,并在方法上添加注解@RefreshScope
@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
@Value("${server.port}")
private String port;
@Value("${env}")
private String env;
@Autowired
private ProductService productService;
/**
* 根据id查找商品详情
* @param id
* @return
*/
@RequestMapping("find")
public Object findById(int id){
Product product = productService.findById(id);
Product result = new Product();
BeanUtils.copyProperties(product,result);
result.setName( result.getName() + " data from port="+port + " env ="+env);
return result;
}
}
在 GitHub 中修改配置文件,将其中的 env 的值改为 test2
server:
port: 8772
env: test2
branch: master
此时访问 config server(已同步)
branch: master
env: test2
server:
port: 8772
此时 config client (env 依然为 test,未同步)
http://localhost:8772/product-service-test.yaml
{
"id": 2,
"name": "冰箱 data from port=8772 evn =test",
"price": 5342,
"store": 19
}
手动触发 config client 暴露的接口(GitHub 等可以设置自动触发 config client 的接口)
需要以 POST 的方式进行访问:http://192.168.31.230:8772/actuator/bus-refresh
![手动触发](https://abc1024.oss-cn-shanghai.aliyuncs.com/Picture/SpringCloud/Post % E6%96% B9% E5% BC %8F % E8% A7% A6% E5%8F %91config %20client % E6%9A % B4% E9%9C % B2% E6%8E % A5% E5%8F % A3.png
)
再次观察 config client (已经同步,env 变为最新的 test2)
{
"id": 2,
"name": "冰箱 data from port=8772 evn =test2",
"price": 5342,
"store": 19
}```