SpringCloud - Bus服务总线
0. 概述
① SpringCloud Bus结合SpringCloud Config可以实现配置的动态刷新
② Bus的两种广播方式:
一是Bus直接通知给其中一个客户端,由这个客户端开始蔓延,传播给其他所有客户端
二是通知给配置中心的服务端,有服务端广播给所有客户端
③ 什么是总线:
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以称为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
④ 基本原理:
ConfigClient实例都监听MQ中同一个topic(默认是SpringCloud Bus)。当一个服务刷新数据的时候,它会把这个消息放入topic中,这样其他监听同一topic的服务就能得到通知,然后去更新自身的配置。
通过消息队列达到广播的效果,我们要广播每个消息时,主要放到某个topic中,所有监听的节点都可获取到
1. Bus实例
1.1 配置RabbitMQ环境
① 下载安装erlang:http://erlang.org/download/otp_win64_21.3.exe
② 下载安装RabbitMQ:http://www.rabbitmq.com/download.html
③ 进入RabbitMQ的安装目录:执行 rabbitmq-plugins enable rabbitmq_management启动管理功能
④ 在菜单栏找到RabbitMQ start启动RabbitMQ,然后访问RabbitMQ主页:
⑤ 再添加一个配置中心客户端3366,直接复制3355的即可
1.2 使用Bus实现全局广播
Bus广播有两种方式,我们采用第二种方式:
1、利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
2、利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
① 3344(服务端中心配置)的pom文件中添加RabbitMQ的坐标依赖:
<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>
② 3344的yml文件中添加对RabbitMQ的配置:
# rabbitmq的相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露监控端口
management:
endpoints:
web:
exposure:
include: "bus-refresh"
③ 3355(客户端)的pom文件中添加RabbitMQ的坐标依赖:
<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>
④ 3355的yml文件中添加对RabbitMQ的配置:
# rabbitmq的相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
同样对3366做和3355一样的配置
⑤ 测试:启动7001、3344、3355、3366模块
修改GitHub上的配置文件version=10,然后使用postman工具发送post请求:http://localhost:3344/actuator/bus-refresh,此时只需要刷新3344即可让3355、3366动态获取最新的配置文件:
所有客户端都监听了一个rabbitMq的topic,我们将信息放入这个topic,所有客户端都可以送到,从而实时更新
1.3 使用bus实现定点通知
就是只通知部分服务,比如只通知3355,不通知3366
http://localhost:3344/actuator/bus-refresh/{destination}:/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数指向需要配置的服务或实例
①启动3344、3355、3366模块
② 将github的version改为12
③ 只向3355发送通知:使用postman发送post请求:http://localhost:3344/actuator/bus-refresh/config-client:3355
config-client:3355即为:微服务的名称+端口号