springcloud之bus微服务消息总线

springcloud学习笔记,第9章,Bus服务总线。

概述:

我们前一章学习了config配置中心,需要去探索如何实现分布式自动刷新配置功能?spring cloud bus配合spring cloud config使用可实现配置的自动动态刷新。

bus支持两种消息代理中间件:RabbitMQ和kafka

下面两张图实现原理并不同,注意看

图一如下:利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置。

springcloud bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当做微服务间的通信通道。

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

为什么会被称为消息总线?

所以要结合消息中间件一起使用。


进行实例演示之前,需要先安装好RabbitMQ或kafka消息中间件,配置好环境。

springcloud Bus动态刷新全局广播:

新建一个3366客户端模块:

  1. 新建模块,cloud-config-client-3366

  2. POM

  3. bootstrap.yml

  4. 主启动

  5. controller:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @RestController
    @RefreshScope
    public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/configInfo")
    public String getConfigInfo(){
    return "serverPort:"+serverPort+"\n"+"configInfo:"+configInfo;
    }
    }

设计思想:

之前的图一利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置。

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

图二的架构显然更加适合该动态刷新全局广播,图一不适合的原因如下:

给cloud-config-center-3344配置中心服务端添加消息总线支持:

  1. POM:

    1
    2
    3
    4
    5
    <!--添加消息总线RabbitMQ支持-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
  2. YML:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # rabbitMQ相关配置
    rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest


    # rabbitMQ相关配置,暴露bus刷新配置的端点
    management:
    endpoints:
    web:
    exposure:
    include: 'bus-refresh'

给cloud-config-client-3355客户端添加消息总线支持:

  1. POM:

    1
    2
    3
    4
    5
    <!--添加消息总线RabbitMQ支持-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
  2. YML:

    1
    2
    3
    4
    5
    rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

给cloud-config-client-3366客户端添加消息总线支持:

和3355一致。

测试:

  1. 修改github上的版本号,给3344发送curl -X POST "http://localhost:3344/actuator/bus-refresh"

    就不用还给3355和3366发了。

  2. 浏览器测试:http://localhost:3344/config-dev.yml

  3. 客户端测试:http://localhost:3355/configInfohttp://localhost:3366/configInfo

  4. 获取配置,发现都已经刷新了。

实现一次修改、广播通知,处处生效。

所以这里就是运维人员给3344推送一次刷新就可以实现全部的刷新。完美解决了config的动态刷新问题。

springcloud Bus动态刷新定点通知:

要求:还是以上述实验为例,我们不想通知3366,只通知3355更新信息。

那么上述的话实现就是:

1
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

下一篇博客讲解stream消息驱动模块,见!

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信