1.消息总线Bus简介
(1)消息总线Bus的作用
<1>在没有使用消息总线的时候,如果需要修改某个配置
1.1.如果涉及修改的微服务节点比较多,需要手动的逐个节点的刷新非常麻烦
1.2.在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题
1.3.让系统中所有微服务实例都连接上来
(2)于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线
<1>在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息
1.1.例如:配置信息的变更或者其他一些管理操作等
<2>它同配置中心一样,几乎是微服务架构中的必备组件
<3>配合SpringCloud Config实现微服务应用配置信息的动态更新等
2.准备工作
(1)目前版本,Spring Cloud Bus仅支持两款中间件产品,RabbitMQ和Kafka
(2)已RabbitMQ为例
<1>需要在配置文件中配置 spring-cloud-starter-bus-amqp
1.1.需要装rabbitMq
(3)已Kafka为例
<1>如果使用了默认配置,就可以从RabbitMQ无缝切换过来
<2>只需要修改一下之前ConfigServer和ConfigClient的依赖
<3>将spring-cloud-starter-bus-amqp改为spring-cloud-starter-bus-kafka
3.改造ConfigClient
(1)在配置文件添加依赖,示例代码如下:
<1>在pom文件加上起步依赖spring-cloud-starter-bus-amqp,配置文件如下:
<!-- 已RabbitMQ为例 -->
<dependency>
<groupId></groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<2>在pom文件加上起步依赖pring-cloud-starter-bus-kafka,配置文件如下:
<!-- 已Kafka为例 -->
<dependency>
<groupId></groupId>
<artifactId>pring-cloud-starter-bus-kafka</artifactId>
</dependency>
(2)在配置文件中加配置,示例如下:
<1>已RabbitMQ为例:加RabbitMQ的配置,包括地址、端口,用户名、密码
=localhost
=5672
#默认用户名密码都是guest
=guest
=guest
=true
=true
=bus-refresh
<2>已Kafka为例:加Kafka的配置信息
#Kafka的服务端列表,指定kafka代理地址可以多个,默认localhost
=localhost
#Kafka服务端的默认端口,当brokers属性中没有配置端口信息时,就会使用这个默认端口,默认9092
=9092
#Kafka服务端连接的ZooKeeper节点列表,默认localhost
=localhost
#ZooKeeper节点的默认端口,当zkNodes属性中没有配置端口信息时,就会使用这个默认端口,默认2181
=2181
<3>Kafka配置注意事项:
3.1.如果在启动Kafka时均采用了默认配置
3.2.那么不需要再做任何其他配置就能在本地实现从RabbitMQ到Kafka的切换
3.3.把搭建的ZooKeeper、Kafka启动起来
3.3.1.虽然最新版本的Kafka已经集成了Zookeeper
3.3.2.但是作为分布式开发,一般需要Kafka和Zookeeper独立部署
3.3.3.因此建议实际开发中单独下载一个Zookeeper,自己测试可以用集成的
3.3.4.不管集成的或单独下载的Zookeeper使用Kafka前都必须先启动Zookeeper
(3)修改ConfigClientApplication启动类:
<1>已RabbitMQ为例,代码示例如下:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RestController
//当有变更时,配置文件自动刷新不用重启服务
@RefreshScope
public class ConfigClientApplication {
public static void main(String[] args) {
(, args);}
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi(){return foo;}}
1.1.依次启动EurekaServer、Confg-Server,ConfigClient,端口为:8006
1.2.访问http://localhost:8007/hi,浏览器显示:foo version 3
1.3.这时去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值
1.3.1.如果是传统的做法,需要重启服务,才能达到配置文件的更新
1.3.2.此时,只需要发送post请求:http://localhost:8006/actuator/bus/refresh
1.3.3.会发现ConfigClient会重新读取配置文件,无需重启服务
(4)架构分析
<1>当git文件更改的时候,通过pc端用post
1.1.向端口为8007的ConfigClient发送请求/bus/refresh
1.2.此时8007端口会发送一个消息,由消息总线向其他服务传递
1.3.从而使整个微服务集群都达到更新配置文件
4.相关知识总结
(1)消息总线Bus,需要结合消息中间件
<1>目前默认支持的消息中间件有RabbitMQ,Kafka
<2>需要现在对应的消息中间件,并在中添加相应依赖
(2)参考文档:
<1>源码:/forezp/SpringCloudLearning/tree/master/sc-f-chapter8
<2>/springcloud/2018/08/08/
<3>/p/730d86030a41