目录
1 简介
- Bus用轻量的消息代理将分布式的节点连接起来,可以用于“广播配置文件的更改”、“服务的监控管理”
- Bus可以为微服务做监控,也可以实现应用程序之间的互相通信
- Bus可选的消息代理(消息队列):RabbitMQ、Kafka
2 实践
目标:安装RabbitMQ,将消息总线整合到微服务系统中,实现更新配置后不需要重启微服务的功能。为了实现这个目的需要分别改造配置中心和微服务。
2.1 Docker安装RabbitMQ
- 下载镜像
docker pull rabbitmq:management
- 创建容器
docker run -di --name=changgou_rabbitmq -p 5671:5617 -p 5672:5672 -p4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management
- 访问后台
- 可选择设置容器开机自启动
docker update --restart=always 容器ID
2.2 改造配置中心
步骤
- 在config_server中,加入Bus和RabbitMQ的依赖
- 修改配置文件:RabbitMQ服务地址,触发配置文件更改接口
1 在config_server中,加入Bus和RabbitMQ的依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
2 在config_server中,修改application.yml
# 端口
server.port: 12000
# 应用名称
spring.application.name: config-server
# git仓库地址
spring.cloud.config.server.git.uri: https://gitee.com/frankmy/lmy-spring-cloud-config-file.git
# 注册中心地址
eureka.client.service-url.defaultZone: http://127.0.0.1:10086/eureka
# RabbitMQ的服务地址
spring.rabbitmq.host: 192.168.1.171
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
# 触发配置文件广播的地址actuator的 endpoint,此时会发送配置文件到服务
management.endpoints.web.exposure.include: bus-refresh
2.3 改造微服务
步骤
- 在user-service中,加入Bus和RabbitMQ的依赖
- 修改配置文件:RabbitMQ服务地址
- 在需要刷新配置的类上加@RefreshScope注解
- 测试
1 在微服务provider中加入Bus相关依赖
<!--消息总线依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
2 修改provider项目的bootstrap.yml
# RabbitMQ的服务地址
spring.rabbitmq.host: 192.168.1.171
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
3 在需要刷新配置的类上加@RefreshScope注解
/**
* 用户服务,提供查询用户信息的接口
*/
@RestController
@RefreshScope //刷新配置
public class UserController {
@Autowired
private UserService userService;
@Value("${server.port}")
private String port;
@Value("${lmy.hello}")
private String hello;
/**
* 请求参数绑定,举例:假如现在有Http请求:localhost:8080/user/findById?id111123
* 那么 @RequestParam("id") Integer id 注解的意思是:把id变量和请求参数中的的那个id变量进行绑定
*/
@RequestMapping("/user/findById")
public User findById(@RequestParam("id") Integer id) {
if (id == 1) {
throw new RuntimeException("异常");
}
User user = userService.findById(id);
user.setNote("负载均衡后使用的端口是:" + port + " 从码云中提取配置文件参数为:" + hello);
return user;
}
}
4 测试
- 目标:在GIt仓库中更新配置后,微服务在不重启的情况下就能获取配置信息
- 注意启动顺序:配置中心一定要先于微服务启动,否则无法拉取配置!其他顺序随意。
- 在这里,我的启动顺序是:注册中心、配置中心、网关、服务消费者、服务提供者
- 启动之后效果和原来仍然一样,此时需要触发消息总线发广播给正在运行的服务
- 即:使用Postman发送POST请求 http://127.0.0.1:12000/actuator/bus-refresh,返回1
发上述请求的目的是让配置中心触发消息总线向微服务进行配置文件更新广播,最终达到更新配置信息的目的,在配置中心的控制台中打印出更新配置信息的状态如下:
3 强烈注意
一定要注意配置中心微服务中SpringCloud的版本问题:
2020版本以后的SpringBoot发生了一些改动造成我上述的操作不能正常执行,使用Postman发送POST请求 http://127.0.0.1:12000/actuator/bus-refresh时,总是返回405错误,网上几乎所有的方法全都是试过了都不行。
最后不得已只能调整配置中心微服务的Spring Cloud版本为:Greenwich.SR3,对应SpringBoot版本为:2.1.9.RELEASE,调整过后,一切恢复正常,晚安~