天天看点

11.SpringCloud Bus消息总线

SpringCloud系列文章列表

0. SpringCloud实战专栏介绍准备

1. SpringCloud父工程搭建

2. 服务注册中心之Eureka(单机+集群+Ribbon调用)

3. 服务注册中心之Zookeeper

4. 服务注册中心之Consul

5. eureka、zookeeper和consul三种注册中心之间的区别

6. 负载均衡服务调用之Ribbon

7. 服务调用之OpenFeign

8. Hystrix断路器全面实战总结

9. SpringCloud Gateway网关

10. SpringCloud Config配置中心

11. SpringCloud Bus消息总线

12. SpringCloud Stream消息驱动

13. SpringCloud Sleuth分布式请求链路追踪

目录

      • **SpringCloud系列文章列表**
      • 1 Bus消息总线介绍
        • 1.1 是什么?
        • 1.2 能干嘛?
        • 1.3 为何成为总线?
        • 1.4 设计思想
      • 2 项目实战
        • 2.1 搭建RabbitMQ服务
        • 2.2 SpringCloud Bus动态刷新全局广播
          • 2.2.1 项目代码
            • 2.2.1.1 修改配置中心cloud-config-center3344
            • 2.2.1.2 修改客户端cloud-config-client3355
            • 2.2.1.3 修改客户端cloud-config-client3366
          • 2.2.2 案例测试
        • 2.3 SpringCloud Bus动态刷新定点通知
          • 2.3.1 实现方式
          • 2.3.2 案例测试

前言

建议先阅读上一章 SpringCloud Config配置中心

本章是对上一章的加深和扩充,实现分布式自动刷新配置功能;

SpringCloud Bus配合SpringCloud Config使用,可以实现配置的动态刷新。

1 Bus消息总线介绍

官方文档:

https://spring.io/projects/spring-cloud-bus#learn

中文 https://www.springcloud.cc/spring-cloud-bus.html

1.1 是什么?

Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。

Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,

它整合了Java的事件处理机制和消息中间件的功能。

当前唯一的实现是使用AMQP代理作为传输,Spring Clud Bus目前支持RabbitMQ和Kafka。

对应的依赖为spring-cloud-starter-bus-amqp或spring-cloud-starter-bus-kafka

1.2 能干嘛?

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

1.3 为何成为总线?

  • 什么是总线

    在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播─些需要让其他连接在该主题上的实例都知道的消息。

  • 基本原理

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

1.4 设计思想

主要有两种

  • 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
    11.SpringCloud Bus消息总线
  • 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置(更加推荐)
    11.SpringCloud Bus消息总线

为什么第一种不合适?

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新职责
  • 破坏了微服务各节点的对等性
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

2 项目实战

本文以RabbitMQ来演示

2.1 搭建RabbitMQ服务

直接用docker安装,不会装docker的可以私聊我,回头再出个教程。

# rabbitmq 3.8.9版本(带界面)
docker run -d  --name some-rabbit -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest -p 5672:5672 -p 15672:15672 rabbitmq:3.8.9-management

           

访问http://服务器ip:15672

输入guest 、 guest登录

11.SpringCloud Bus消息总线
11.SpringCloud Bus消息总线

2.2 SpringCloud Bus动态刷新全局广播

首先以cloud-config-client3355为模板,新建个cloud-config-client3366项目

11.SpringCloud Bus消息总线
2.2.1 项目代码

2.2.1.1 修改配置中心cloud-config-center3344

  • pom.xml
<!--消息总线-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
           
  • application.yml
spring:
  rabbitmq:  #在spring下级,  完整路径 spring.rabbitmq
    host: 106.75.254.233
    port: 5672
    username: guest
    password: guest
#暴露端口
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'
           

2.2.1.2 修改客户端cloud-config-client3355

  • pom.xml
<!--消息总线-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
           
  • bootstrap.yml
spring:
  rabbitmq:
    host: 106.75.254.233
    port: 5672
    username: guest
    password: guest
           

2.2.1.3 修改客户端cloud-config-client3366

同 cloud-config-client3355

2.2.2 案例测试

启动cloud-eureka-server7001、cloud-config-center3344、cloud-config-client3355、cloud-config-client3366

分别访问如下图:

  • http://localhost:3344/config-dev.yml
    11.SpringCloud Bus消息总线
  • http://localhost:3355/configInfo
    11.SpringCloud Bus消息总线
  • http://localhost:3366/configInfo
    11.SpringCloud Bus消息总线
    当前version都是2,改动配置中心(gitee仓库)的version由2改成3
    11.SpringCloud Bus消息总线
    执行 curl -X POST “http://localhost:3344/actuator/bus-refresh” 刷新配置中心3344配置
    11.SpringCloud Bus消息总线
    浏览器再次访问客户端
    11.SpringCloud Bus消息总线
    在这里插入图片描述

可见,实现了一次修改,广播通知,处处生效。

2.3 SpringCloud Bus动态刷新定点通知

如果是不想全部通知,只想通知个别客户端,实现定点通知。例如只通知3355,不通知3366

2.3.1 实现方式

实现方式:

curl -X POST “http://localhost:配置中心端口号/actuator/bus-refresh/{destination}”

其中destination是客户端对应的服务名称 {spring.application.name}:{server.port}

如config-client:3305;

11.SpringCloud Bus消息总线
2.3.2 案例测试

案例测试,再次修改配置服务器的version为4

11.SpringCloud Bus消息总线

执行 curl -X POST “http://localhost:3344/actuator/bus-refresh/config-client:3355”

11.SpringCloud Bus消息总线
11.SpringCloud Bus消息总线
11.SpringCloud Bus消息总线

可见实现了定点通知刷新;

点赞+评论+关注

本文源码地址: https://gitee.com/shuaidawang/SpringCloudDemo.git

有错误的地方欢迎各位大佬指正!可以加入qq交流群: 700637673

继续阅读