Spring Cloud Bus
解决的问题
疑问:
当我们更新
GitHub
中的配置文件内容后,
Config
客户端服务是否会及时更新的配置内容呢?
测试:
修改一下
GitHub
中
microservice
-
config
-
product.yml
配置文件中
profile: dev
(
开发环境
)
的数据库端口号,然后访问
http://localhost:8001/product/get/1
一样可以查询出数据,说明更新
GitHub
服务器中的配置并没有立刻更新到服务中,只有重启 Config
客户端服务才会读取新配置。
解决:
如果希望在不重启微服务的情况下更新配置如何来实现呢
?
我们使用
Spring Cloud Bus
来实现置的自动更新。
Spring Cloud Bus
使用机制
Spring Cloud Bus
被国内很多都翻译为消息总线。大家可以将它理解为管理和传播所有分布式项目中的消息即可,其实本质是利用了MQ
的广播机制在分布式的系统中传播消息,目前常用的
Kafka
和
RabbitMQ
。利用
Bus
的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述Bus
在配置中心使用的机制。
根据此图我们可以看出利用
Spring Cloud Bus
做配置更新的步骤
:
1
、提交配置后发送
post
方式的
/bus-refresh
请求给
Config
客户端
2
、
Config
客户端接收到请求从
Server
端更新配置并且发送消息给消息总线
3
、消息总线接到消息并通知给其它客户端
4
、其它客户端接收到通知,请求
Server
端获取最新配置
5
、全部客户端均获取到最新的配置
Spring Cloud Bus
实战
Postman
测试工具安装
Postman
是款强大网页调试的
windows
客户端工具,提供功能强大的
Web API & HTTP
请求调试。软件功能
非常强大,界面简洁明晰、操作方便快捷,设计得 很人性化。
Postman
中文版能够发送任何类型的
HTTP
请
求
(GET, DELETE, POST, PUT..)
, 附带任何数量的请求参数。
Postman
安装包在课程资料中已提供:
参考资料
\Postman
测试工具
\Postman
-
win64
-
6.0.10
-
Setup.exe
安装:双击
Postman
-
win64
-
6.0.10
-
Setup.exe
就会自动安装,桌面就会有一个
Postman
图标
注册账号
采用的是
RabbitMQ
消息队列进行传播消息,所以需要安装
RabbitMQ
配置
Config
客户端
修改
microservice-cloud-14-product-config-8001
工程的
pom.xml
文件,添加依赖:
在
bootstrap.properties
中添加配置内容
在
microservice-cloud-14-product-config-8001
的
bootstrap.properties
配置文件新增
RabbitMQ
配置以及消息总线配置
添加配置
完整配置
:
功能测试
首先启动Config
服务端:
microservice-cloud-11-config-server-5001
依次启动Eureka服务端:
microservice-cloud-13-eureka-config-6001
最后启动Product
提供者服务:
microservice-cloud-14-product-config-8001
访问Eureka
管理页面
:
http://eureka6001.com:6001/
显示服务名是
microservice-product-config
修改GitHub
上的
microservice
-
config
-
product.yml 配置文件,将
profile: dev
(
开发环境
)
的 服务名 改为
microservice-product-config-bus
访问
Eureka
管理页面
:
http://eureka6001.com:6001/
查看效果依然还是
microservice-product-config
使用
postman
工具发送
POST
请求
:
http://localhost:8001/actuator/bus-refresh
发送请求后,会向 rabbitmq
队列发送数据,就会被监听到进行更新服务配置信息
再次访问
http://eureka6001.com:6001/
,发现服务名变为
microservice-product-config-bus
自定义类中读取配置实战
修改
GitHub
上的配置
修改
GitHub
上的
microservice
-
config
-
product.yml
配置文件,增加自定义配置信息:
获取配置信息
在
microservice-cloud-14-product-config-8001
中的
ProductController
类中获取配置
功能实现与测试
重新运行
microservice-cloud-14-product-config-8001
访问
http://localhost:8001/hello
可以获取配置信息
修改
GitHub
上的
microservice
-
config
-
product.yml
配置文件信息:
使用
postman
工具发送
POST
请求
:
http://localhost:8001/actuator/bus-refresh
访问
http://localhost:8001/hello
发现并没有更新配置信息
是因为需要在
ProductController
上添加
@RefreshScope
注解 ,用于刷新配置
添加后重新上述测试
总结 :如果需要在自定义类中获取更新配置内容
,
则需要在此类上添加
@RefreshScope
才会获得更新的内容
刷新
Druid
数据源配置实战
前言
先访问
http://localhost:8001/product/get/1
,发现当前获取了
springcloud_db01
库的数据
修改
GitHub
上的
microservice
-
config
-
product.yml
配置文件,将
profile: dev
(
开发环境
)
的 库名改为 springcloud_db
02
使用
postman
工具发送
POST
请求
:
http://localhost:8001/actuator/bus-refresh
访问
http://localhost:8001/product/get/1
,发现依然是
springcloud_db01
库的数据
,
发现并没有刷新配置。
如果数据源采用的是
Druid
,目前更新
GitHub
中的数据源配置,只有重启服务才能获取新配置,不然获取不到。
10.5.2
自定义
Druid
配置类
在
microservice-cloud-14-product-config-8001
工程中创建
DruidConfig
配置类
在方法上添加
@RefreshScope
刷新数据源
功能测试
首先启动
Config
服务端:
microservice-cloud-11-config-server-5001
依次启动
Eureka
服务端:
microservice-cloud-13-eureka-config-6001
最后启动
Product
提供者服务:
microservice-cloud-14-product-config-8001
访问
http://localhost:8001/product/get/1
,发现当前获取了
springcloud_db01
库的数据
修改
GitHub
上的
microservice
-
config
-
product.yml
配置文件,
将
profile: dev
(
开发环境
)
的 库名 改为
springcloud_db
02
使用
postman
工具发送
POST
请求
:
http://localhost:8001/actuator/bus-refresh
访问
http://localhost:8001/product/get/1
,已经变为
springcloud_db02
库的数据
总结:发送
post
请求刷新后,服务器不用重启,新的数据源就会生效。