SpringCloud消息总线

SpringCloud Bus

解决配置中心相关问题,实现配置自动更新。

注意:SpringCloudBus基于RabbitMQ实现,默认使用本地的消息队列服务,所以需要提前安装并启动RabbitMQ。

Bus简介

Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。

Bus可以为微服务做监控,也可以实现应用程序之间互相通信。Bus可选的消息代理RabbitMQ和Kafka。

广播出去的配置文件服务会进行本地缓存。

整合案例

目标:消息总线整合入微服务系统,实现配置中心的配置自动更新。不需要重启微服务。

改造配置中心

改造步骤:

  1. 在config-server项目中加入Bus相关依赖
  2. 修改application.yml,加入RabbitMQ的配置信息,和暴露触发消息总线地址

实现过程

(1)引入依赖

修改config-server的pom.xml引入依赖:

<!--消息总线依赖-->
<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)修改application.yml配置文件

修改config-server的application.yml,如下配置的rabbit都是默认值,其实可以完全不配置,代码如下:

1563277655450

上图配置如下:

# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/skllll/config.git
# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露触发消息总线的地址
management:
endpoints:
web:
exposure:
# 暴露触发消息总线的地址
include: bus-refresh

# Eureka服务中心配置
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:7001/eureka
# com.jwang 包下的日志级别都为Debug
logging:
level:
com: debug

改造用户服务

改造步骤:

1. 在用户微服务user_service项目中加入Bus相关依赖
2. 修改user_service项目的bootstrap.yml,加入RabbitMQ的配置信息
3. UserController类上加入@RefreshScope刷新配置注解
4. 测试

实现过程:

(1)引入依赖

修改user-provider引入如下依赖:

<!--消息总线依赖-->
<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>
<!--健康监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(2)添加bootstrap.yml文件

user-provider的resources目录下添加bootstrap.yml,添加rabbitmq配置,代码如下:

# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka

(3)添加刷新配置

修改user-providercom.jwang.controller.LoadConfigController,添加一个@RefreshScope注解刷新配置信息,代码如下:

1563278214919

@RefreshScope:用于启用刷新配置文件的信息。

测试

目标:当我们修改Git仓库的配置文件,用户微服务是否能够在不重启的情况下自动更新配置文件信息。

测试步骤:

(1)启动eureka-server

(2)启动config-server

(3)启动user-provider

(4)访问测试

访问<http://localhost:18081/config/load>,效果如下:

1563278362302

(5)修改码云配置

修改码云的配置,修改后并提交,修改如下:

1563278440773

(6)刷新配置

使用Postman以POST方式请求http://localhost:18085/actuator/bus-refresh

1563278498743

请求地址中actuator是固定的,bus-refresh对应的是配置中心的config-server中的application.yml文件的配置项include的内容

(7)刷新测试

访问<http://localhost:18081/config/load>,效果如下:

1563278633611

消息总线实现消息分发过程:

  • 请求地址访问配置中心的消息总线
  • 消息总线接收到请求
  • 消息总线向消息队列发送消息
  • user-service微服务会监听消息队列
  • user-service微服务接到消息队列中消息后
  • user-service微服务会重新从配置中心获取最新配置信息