1.什么是总线?
我们在微服务的项目中,通常会构建一个共同的消息主题,然后需要的服务可以连接上来,该主题中产生的消息会被监听和消费,这种我们称为消息总线。
SpringCloud Bus 配合SpringCloud Config使用可以实现配置的动态刷新。
2.两种实现方式
Bus目前支持RabbitMQ和Kafka。
第一种就是我们利用/bus/refresh先触发一个客户端获取最新配置,然后由此客户端发送消息给总线,从而传播去修改其他的客户端配置。
第二种就是利用/bush/refresh去触发服务端(Config Server)配置的暴露bus刷新配置的端点('bus-refresh'),然后由服务端发送消息给总线,从而传播去刷新所有客户端的配置。
显然我们最好选择第二种,原因有以下两点:
-
客户端服务模块本身是业务模块,不应该承担发送消息的职责。
-
破坏了客户端各微服务的对等性。
3.整体流程梳理
初始架构就是服务端连接git,要从git上读配置,客户端服务连接服务端服务,要从服务端上读配置,然后服务端和客户端都要添加消息总线的支持,这是上图的(1)(2)。此时运维人员在git上修改了配置(3),并发送POST请求总线刷新给服务端(4):
此时服务端就发送消息给消息总线(5),所有客户端就监听到了事件消息(6),然后去服务端读取最新的配置即可(7)。
如果我们不想通知全部的客户端,只想定点通知某一个客户端,我们只需要修改Post请求即可,例如: