SpringCloud系列文章列表
0. SpringCloud实战专栏介绍准备
1. SpringCloud父工程搭建
2. 服务注册中心之Eureka(单机+集群+Ribbon调用)
3. 服务注册中心之Zookeeper
4. 服务注册中心之Consul
5. eureka、zookeeper和consul三种注册中心之间的区别
6. 负载均衡服务调用之Ribbon
7. 服务调用之OpenFeign
8. Hystrix断路器全面实战总结
9. SpringCloud Gateway网关
10. SpringCloud Config配置中心
11. SpringCloud Bus消息总线
12. SpringCloud Stream消息驱动
13. SpringCloud Sleuth分布式请求链路追踪
目录
-
-
- **SpringCloud系列文章列表**
- 1 Bus消息总线介绍
-
- 1.1 是什么?
- 1.2 能干嘛?
- 1.3 为何成为总线?
- 1.4 设计思想
- 2 项目实战
-
- 2.1 搭建RabbitMQ服务
- 2.2 SpringCloud Bus动态刷新全局广播
-
- 2.2.1 项目代码
-
- 2.2.1.1 修改配置中心cloud-config-center3344
- 2.2.1.2 修改客户端cloud-config-client3355
- 2.2.1.3 修改客户端cloud-config-client3366
- 2.2.2 案例测试
- 2.3 SpringCloud Bus动态刷新定点通知
-
- 2.3.1 实现方式
- 2.3.2 案例测试
-
前言
建议先阅读上一章 SpringCloud Config配置中心
本章是对上一章的加深和扩充,实现分布式自动刷新配置功能;
SpringCloud Bus配合SpringCloud Config使用,可以实现配置的动态刷新。
1 Bus消息总线介绍
官方文档:
https://spring.io/projects/spring-cloud-bus#learn
中文 https://www.springcloud.cc/spring-cloud-bus.html
1.1 是什么?
Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。
Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,
它整合了Java的事件处理机制和消息中间件的功能。
当前唯一的实现是使用AMQP代理作为传输,Spring Clud Bus目前支持RabbitMQ和Kafka。
对应的依赖为spring-cloud-starter-bus-amqp或spring-cloud-starter-bus-kafka
1.2 能干嘛?
Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道。
1.3 为何成为总线?
-
什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播─些需要让其他连接在该主题上的实例都知道的消息。
-
基本原理
ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。
1.4 设计思想
主要有两种
- 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
- 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置(更加推荐)
为什么第一种不合适?
- 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新职责
- 破坏了微服务各节点的对等性
- 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改
2 项目实战
本文以RabbitMQ来演示
2.1 搭建RabbitMQ服务
直接用docker安装,不会装docker的可以私聊我,回头再出个教程。
# rabbitmq 3.8.9版本(带界面)
docker run -d --name some-rabbit -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest -p 5672:5672 -p 15672:15672 rabbitmq:3.8.9-management
访问http://服务器ip:15672
输入guest 、 guest登录
2.2 SpringCloud Bus动态刷新全局广播
首先以cloud-config-client3355为模板,新建个cloud-config-client3366项目
2.2.1 项目代码
2.2.1.1 修改配置中心cloud-config-center3344
- pom.xml
<!--消息总线-->
<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>
- application.yml
spring:
rabbitmq: #在spring下级, 完整路径 spring.rabbitmq
host: 106.75.254.233
port: 5672
username: guest
password: guest
#暴露端口
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
2.2.1.2 修改客户端cloud-config-client3355
- pom.xml
<!--消息总线-->
<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>
- bootstrap.yml
spring:
rabbitmq:
host: 106.75.254.233
port: 5672
username: guest
password: guest
2.2.1.3 修改客户端cloud-config-client3366
同 cloud-config-client3355
2.2.2 案例测试
启动cloud-eureka-server7001、cloud-config-center3344、cloud-config-client3355、cloud-config-client3366
分别访问如下图:
- http://localhost:3344/config-dev.yml
- http://localhost:3355/configInfo
- http://localhost:3366/configInfo 当前version都是2,改动配置中心(gitee仓库)的version由2改成3 执行 curl -X POST “http://localhost:3344/actuator/bus-refresh” 刷新配置中心3344配置 浏览器再次访问客户端 在这里插入图片描述
可见,实现了一次修改,广播通知,处处生效。
2.3 SpringCloud Bus动态刷新定点通知
如果是不想全部通知,只想通知个别客户端,实现定点通知。例如只通知3355,不通知3366
2.3.1 实现方式
实现方式:
curl -X POST “http://localhost:配置中心端口号/actuator/bus-refresh/{destination}”
其中destination是客户端对应的服务名称 {spring.application.name}:{server.port}
如config-client:3305;
2.3.2 案例测试
案例测试,再次修改配置服务器的version为4
执行 curl -X POST “http://localhost:3344/actuator/bus-refresh/config-client:3355”
可见实现了定点通知刷新;
点赞+评论+关注
本文源码地址: https://gitee.com/shuaidawang/SpringCloudDemo.git
有错误的地方欢迎各位大佬指正!可以加入qq交流群: 700637673