1. 概述
老话说的好:会休息的人才更会工作,身体是革命的本钱,身体垮了,就无法再工作了。
言归正传,之前我们聊了 SpringCloud 的 分布式配置中心 Config,文章里我们聊了config配置的动态刷新,但这个动态刷新,一次只能刷新一个 Config Client 节点,如果服务节点少还好,如果业务多了,有成百上千个服务节点,再一台一台刷新,就不合适了。
因此,今天我们来聊聊 SpringCloud的消息总线组件 Bus,Bus 组件可以借助MQ中间件,向所有的 Config Client 发送刷新广播,只需要调用一个接口,就可以刷新整个集群的Config 配置。
我们使用 RabbitMQ 作为中间件,关于 RabbitMQ 集群的搭建,可参见我的另一篇文章《RabbitMQ 3.9.7 镜像模式集群的搭建》(https://www.cnblogs.com/w84422/p/15356202.html)。
闲话不多说,直接上代码。
2. Git 准备
1)创建一个 repository,用于放置配置文件,例如:my-config-repo
2)创建 my-bus-client 文件夹
3)在 my-bus-client 文件夹下,新建 my-bus-client-dev.yml 配置文件,内容如下:
info:
profile: dev
name: zhuifengren
desc: hello dev
3. Config Server 引入 Bus 组件
3.1 主要依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-starter-bootstrap 3.0.2 org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.boot spring-boot-starter-actuator
3.2 application.yml 配置
server: port: 42000 spring: application: name: my-bus-server rabbitmq: addresses: 192.168.1.22:5672,192.168.1.12:5672,192.168.1.11:5672 # rabbitmq 集群的地址 username: guest password: guest virtual-host: / connection-timeout: 16000 cloud: config: server: git: uri: https://github.com/w84422/my-config-repo.git # git地址 force-pull: true # 强制拉取资源文件 default-label: main # 默认拉取的分支 search-paths: '{application}' # 将配置文件放到接入方服务名称对应的文件夹下,这种写法,只在config组件设置生效 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always eureka: client: service-url: defaultZone: http://zhuifengren1:35000/eureka/,http://zhuifengren2:35001/eureka/ # Eureka Server的地址
3.3 启动类增加注解
@SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class MyBusServerApplication { public static void main(String[] args) { SpringApplication.run(MyBusServerApplication.class, args); } }
3.4 启动 Config Server
启动 Config Server
4. Config Client 引入 Bus 组件
4.1 主要依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-config 3.0.4 org.springframework.cloud spring-cloud-starter-bootstrap 3.0.2 org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-bus-amqp
4.2 bootstrap.yml 配置
server: port: 43000 spring: application: name: my-bus-client rabbitmq: addresses: 192.168.1.22:5672,192.168.1.12:5672,192.168.1.11:5672 username: guest password: guest virtual-host: / connection-timeout: 16000 cloud: config: profile: dev # 拉取的配置文件 label: main # 拉取的分支 name: my-bus-client # 指定远程获取配置文件的 application,默认会取 spring.application.name discovery: enabled: true service-id: my-bus-server # config服务的服务名称 myDesc: ${desc} eureka: client: service-url: defaultZone: http://zhuifengren1:35000/eureka/,http://zhuifengren2:35001/eureka/ # Eureka Server的地址 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
4.3 启动类增加注解
@SpringBootApplication @EnableDiscoveryClient public class MyBusClientApplication { public static void main(String[] args) { SpringApplication.run(MyBusClientApplication.class, args); } }
4.4 增加用于实验的 Controller 类
@RefreshScope @RestController public class MyBusClientRefreshController { @Value("${info.profile}") private String profile; @Value("${name}") private String name; @Value("${myDesc}") private String desc; @RequestMapping("/refresh-info") public String getInfo() { String info = "profile:" + profile + "
"; info += "name:" + name + "
"; info += "desc:" + desc + "
"; return info; } }
4.5 启动 Config Client 服务,并进行验证
4.5.1 启动 Config Client 服务
启动两个或多个 Config Client 服务
4.5.2 访问 Controller 接口,获取配置信息
GET http://localhost:43000/refresh-info
4.5.3 修改 Git 上的配置
将 name 改为 zhangsan
4.5.4 执行bus配置刷新接口
在 Config Server 或 任意 Config Client 节点,执行 bus 配置刷新接口
POST http://localhost:42000/actuator/busrefresh
4.5.5 在所有 Config Client 节点调用 Controller 接口,重新获取信息
GET http://localhost:43000/refresh-info
5. 综述
今天聊了一下 SpringCloud 的 Bus 组件,希望可以对大家的工作有所帮助。
欢迎帮忙点赞、评论、转发、加关注 :)
关注追风人聊Java,每天更新Java干货。
6. 个人公众号
追风人聊Java,欢迎大家关注