- 前言
在很多场景下,需要运行期间动态调整配置。如果配置发生了修改,微服务如何获取配置的刷新。
在需在微服务客户端添加以下依赖配置
提供了/refresh端点用于配置的刷新。当配置修改了
每个微服务只需运行http://ip:port/refresh 就会刷新配置
(通过webhook运行)
思考:
上面使用/refresh端点手动刷新配置,但如果所有微服务客户端的配置都需要手动去刷新,工作量是很大的。
那么,我们也可以利用webhook的机制每次提交代码发送请求刷新微服客户端,当服务越来越多,需要每个客户端都执行,这样就不合适了。
随着系统的不断扩展会越来越难维护。消息代理是解决该问题最为合适的方案。消息代理中间件可以将消息路由到一个或多个
目的地。
- Spring Cloud Bus
Spring Cloud Bus使用轻量级的消息消息代理(RabbitMQ Kafka)连接分布式系统的节点,这样就可以广播传播状态的更改(如配置的更改)
第一种通过刷新微服务端点获取配置中心最新配置
大体思路如下图,webHook也可以用postman代替
根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:
1、提交代码触发post给客户端A发送bus/refresh
2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus
3、Spring Cloud bus接到消息并通知给其它客户端
4、其它客户端接收到通知,请求Server端获取最新配置
5、全部客户端均获取到最新的配置
演示
Config-Client
1.pom.xml
application.properties
bootstrap.properties
3.测试类
config-server配置
分别启动注册中心,config-server,config-client.
先分别测试一下服务端和客户端是否正确运行,访问:http://localhost:8779/niugang/dev,返回信息:
说明服务端正常。
依次访问http://localhost:8081/profile,http://localhost:8082/profile 返回git-dev-9.0
然后更新niugang-dev.properties 中git-dev-9.0的值为git-dev-10.0并提交到代码库中,访问:http://localhost:8081/profile 依然返回git-dev-9.0。我们对端口为8082的客户端发送一个/bus/refresh的post请求,更新到最新的配置,发送过程中可以看项目打印日志.(使用postman也可以直接在git的webhook中设置)。
然后在依次访问http://localhost:8081/profile,http://localhost:8082/profile 则返回git-dev-10.0
第二种通过刷新Config-Server端点获取配置中心最新配置
在上面的演示例子中,通过请求某个微服务/bus/refresh端点的方式来实现配置的刷新,但这并不优雅灰更加运维的工作。原因如下:
- 打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
- 破坏了微服务各节点的对等性。
- 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就不得不修改WebHook的配置。
框架改进如下:
Config-Server
1.pom.xml
增加如下配置
2.application.properties配置
启动注册中心,启动最新配置的Config-Server,启动两个Config-Client(带RabbitMQ配置的,配置如上不变).进行验证。
postman发送的http请求:
http://localhost:8779/bus/refresh
微信公众号