前戏做了那么多,终于到主题了。
如果还没感觉,请先回顾一下zk部署和kafka部署,不然直接来主题会感觉很干涸的(认真脸.jpg 。
anyway,之前说了那么多就是为了建立一个消息平台( ),Config Server 是必备的,还有 Client 也是必备的,所以这里要用到之前搭起的配置中心 (二)。
在之前搭建的配置中心,是很麻烦的,如果 git 的配置有更新,假如有 N
个节点,那是不是要分别在各个节点上调用 N 次 /refresh 接口呢?所以这里引入消息总线,只需要在某个节点调用一次 /bus/refresh 接口即可实现所有节点更新。
然而这也有一个问题,假如有一个属性是横跨多个服务的,那是不是又要去多个服务里面的一个节点内调用一次 /bus/refresh 接口呢?
所以这里直接把 Config Server 也加入消息总线,无论是什么服务,所有节点的配置有问题,找配置中心。
不逼逼,先给配置中心的 pom.xml 加菜:
<!-- kafka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
然后加下下面配置:
spring.cloud.stream.kafka.binder.brokers = kafka-node1
spring.cloud.stream.kafka.binder.defaultBrokerPort = 4100
spring.cloud.stream.kafka.binder.zkNodes = zk-node0:3010,zk-node1:3110,zk-node2:3210
这是我这里配置的情况,具体情况要看你自己。
- spring.cloud.stream.kafka.binder.brokers ---> kafka 实例名称
- spring.cloud.stream.kafka.binder.defaultBrokerPort ---> kafka 实例端口
- spring.cloud.stream.kafka.binder.zkNodes ---> zk实例地址
再强调一次,记得加 management.security.enabled = false
。
接下来到客户端,给 pom.xml 加一样的菜:
<!-- kafka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
其实配置也和配置中心一样的,不过我这里的 kafka 用了不同的实例:
spring.cloud.stream.kafka.binder.brokers = kafka-node2
spring.cloud.stream.kafka.binder.defaultBrokerPort = 4200
spring.cloud.stream.kafka.binder.zkNodes = zk-node0:3010,zk-node1:3110,zk-node2:3210
然后,跑起来吧。
现在刷新不需要再去某个服务的某个节点了。只需要对配置中心调用 /bus/refresh 接口即可实现所有服务所有节点刷新。
当然,这是不合逻辑的,比如灰度发布的时候怎么可以全服务更新?
这个接口还有参数,完整的请求是 /bus/refresh?destination=application-name:port
其中 application-name 指定你要更新的服务名称,如果指定更新该服务下所有节点,port 写 **
,即/bus/refresh?destination=customers:**
。
好啦,到这里你已经搭建起一个小而完整的 spring cloud 消息总线了。