spring cloud bus 消息总线

spring cloud bus 消息总线

spring cloud 学习完整代码:https://github.com/Zzwenm/spring-cloud-config

对于spring cloud config 而言,避免了每次更新配置都要重启客户端微服务。

但是当每个整个系统的微服务变多时,每个微服务都要执行一次post请求,这样的手动刷新很是繁琐。

这里希望可以进行广播,达到一次通知,所有的微服务都生效,并且该更新的微服务进行更新,不需要更新的微服务不进行更新,实现差异化的管理。

可以通过对spring cloud config加强达到广播形的自动版的动态刷新,
使用spring cloud bus 配合 spring cloud config 实现配置的动态刷新。

官网:https://cloud.spring.io/spring-cloud-bus/1.3.x/single/spring-cloud-bus.html

spring cloud bus 是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。

bus目前支持两种消息代理:RabbitMQ 、 Kafka。

一、什么是总线

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。

二、基本原理

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。
结构图

三、RabbitMQ环境配置

参考 https://blog.csdn.net/zhm3023/article/details/82217222

四、Spring Cloud Bus动态刷新全局广播

利用消息总线触发服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置。

4.1、ConfigServer配置中心添加消息总线支持。

4.1.1、导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

4.1.2、修改配置

添加mq的相关配置

#rabbitmq相关配置
spring:
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest
#rabbitmq相关配置
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

4.2、客户端添加总线支持

4.2.1、导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

4.2.2、添加配置文件

#rabbitmq相关配置
spring:
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

4.2.3、Controller修改:

头部添加@RefreshScope
使其具备刷新功能

4.3、启动

依次启动eureka-server、config-server、eureka-client、eureka-consumer

4.4、测试

要确保每个客户端能否正常的通过ConfigServer获取到配置文件

4.4.1、运维工程师修改Github上配置文件增加版本号

github version

4.4.2、发送POST请求

发送请求无需向客户端发送请求,只需要向服务端发送一处请求即可。

cmd命令行操作,发送到config-server处
curl -X POST "http://localhost:3344/actuator/bus-refresh"

curl

4.4.3、再次访问ConfigServer查看结果

config-server:

eureka-client:

eureka-consumer:

客户端的配置也都已经更新了,达到了一次发送,处处生效。

五、定点刷新

当我们只想刷新某个需要更新的配置时可以使用定点数新。

例如:
只想更新eureka-client,不想更新eureka-consumer。

公式:

http://localhost:{配置中心端口号}/actuator/bus-refresh/{destination}

只更新eureka-client:

curl -X POST "http://localhost:3344/actuator/bus-refresh/eureka-client:8762"
eureka-client 为配置文件中设定的spring.application.name
8762 为端口号

spring cloud 学习完整代码:https://github.com/Zzwenm/spring-cloud-config

posted @ 2020-03-22 10:22  Z、悟空  阅读(216)  评论(0编辑  收藏  举报