Spring Cloud Bus消息总线
- 1、Bus消息总线
- 2、实现刷新配置原理
- 3、搭建RabbitMQ服务
- 3.0 下载rabbitmq安装包(使用docker安装更方便)
- 3.1 将rabbitmq安装包上传到linux系统中
- 3.2 安装Erlang依赖包
- 3.3 安装RabbitMQ安装包(需要联网)
- 3.4 复制配置文件
- 3.5 查看配置文件位置
- 3.6 修改配置文件(参见下图:)
- 3.7 执行如下命令,启动rabbitmq中的插件管理
- 3.8 启动RabbitMQ的服务
- 3.9 查看服务状态(见下图:)
- 3.10 访问web管理界面
- 3.11 登录管理界面
- 4、配置统一配置中心通过Bus连接到MQ服务
- 4.1 统一配置中心中引入Bus依赖
- 4.2 配置config server配置文件
- 4.3 重启config server
- 5、配置微服务(config client)通过Bus链接MQ服务
- 5.1 在所有微服务中引入Bus依赖
- 5.2 在所有微服务项目中配置MQ连接配置,主要这段配置要放入远端仓库管理
- 5.3 重启所有微服务时出现报错
- 5.4 通过向config server 统一配置发送post方式请求实现自动配置更新
- 6、总结
1、Bus消息总线
Spring Cloud Bus是Spring Cloud体系内的消息总线,支持RabbitMQ和Kafka两种消息中间件。所谓消息总线,简单理解就是一个消息中心,众多微服务实例都可以连接到总线上,实例可以往消息中心发送或接收信息(通过监听)。例如:实例A发送一条消息到总线上,总线上的实例B可以接收到信息(实例B订阅了实例A),消息总线充当一个中间者的角色,使得实例A和实例B解耦,如下图所示。
通俗定义:bus称之为springcloud中消息总线,主要用来在微服务系统中实现远端配置更新时通过广播形式通知所有客户端刷新配置信息,避免手动重启服务的工作。
2、实现刷新配置原理
3、搭建RabbitMQ服务
3.0 下载rabbitmq安装包(使用docker安装更方便)
官方安装包下载:https://www.rabbitmq.com/install-rpm.html#downloads
3.1 将rabbitmq安装包上传到linux系统中
erlang-22.0.7-1.el7.x86_64.rpm
rabbitmq-server-3.7.18-1.el7.noarch.rpm
3.2 安装Erlang依赖包
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
3.3 安装RabbitMQ安装包(需要联网)
yum install -y rabbitmq-server-3.7.18-1.el7.noarch.rpm
注意:默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example目录中,需要
将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config
3.4 复制配置文件
cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
3.5 查看配置文件位置
ls /etc/rabbitmq/rabbitmq.config
3.6 修改配置文件(参见下图:)
vim /etc/rabbitmq/rabbitmq.config
将上图中配置文件中红色部分去掉%%
,以及最后的,
逗号 修改为下图:
3.7 执行如下命令,启动rabbitmq中的插件管理
rabbitmq-plugins enable rabbitmq_management
出现如下说明:
Enabling plugins on node rabbit@localhost:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@localhost...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
set 3 plugins.
Offline change; changes will take effect at broker restart.
3.8 启动RabbitMQ的服务
systemctl start rabbitmq-server
systemctl restart rabbitmq-server
systemctl stop rabbitmq-server
3.9 查看服务状态(见下图:)
前提是要关闭防火墙:systemctl stop firewalld
systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2019-09-25 22:26:35 CST; 7s ago
Main PID: 2904 (beam.smp)
Status: “Initialized”
CGroup: /system.slice/rabbitmq-server.service
├─2904 /usr/lib64/erlang/erts-10.4.4/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -
MBlmbcs…
├─3220 erl_child_setup 32768
├─3243 inet_gethost 4
└─3244 inet_gethost 4
…
3.10 访问web管理界面
这个ip根据你的虚拟机或者主机地址改变一下
192.168.159.22:15672
3.11 登录管理界面
username:guest
password:guest
4、配置统一配置中心通过Bus连接到MQ服务
4.1 统一配置中心中引入Bus依赖
其实所有服务中都应该引入Bus依赖
<!--引入bus依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
4.2 配置config server配置文件
#通过Bus组件连接到mq服务
#mq主机
spring.rabbitmq.host=192.168.159.22
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
4.3 重启config server
5、配置微服务(config client)通过Bus链接MQ服务
5.1 在所有微服务中引入Bus依赖
<!--引入bus依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
5.2 在所有微服务项目中配置MQ连接配置,主要这段配置要放入远端仓库管理
5.3 重启所有微服务时出现报错
错误原因:引入bus依赖启动立即根据配置文件bus配置连接到mq服务器,但是此时mq配置信息都在远端仓库,因此Bus连接不到mq直接报错,阻止了应用启动。
&emsp**;解决方案**:允许项目启动时Bus组件立即连接mq这个失败,因为获取远端配置之后可以再以远端配置初始化bus组件
#启动时当远端配置还没有拉取完整时,项目启动过程中的所有失败都是允许的
spring.cloud.config.fail-fast=true
5.4 通过向config server 统一配置发送post方式请求实现自动配置更新
注意: /actuator/bus-refresh 必须在config server中暴露:
添加配置:
#开启所有web端点暴露
management.endpoints.web.exposure.include=*
刷新所有服务:
http://localhost:8848(configserver地址)/actuator/bus-refresh
刷新指定服务:
http://localhost:8848(configserver地址)/actuator/bus-refresh/服务id
6、总结
这样的实现方式没有问题,但还是有点不足,那就是还需要在远端的配置更新之后,我们还是需要人为发送post请求,能不能做到远端配置更新时自动发送post请求呢?当然是可以的。 请看这篇Bus集成webhook实现自动刷新