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 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目前支持RabbitMQKafka
对应的依赖为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,而刷新所有客户端的配置
    在这里插入图片描述

  • 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置(更加推荐)
    在这里插入图片描述

为什么第一种不合适?

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

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登录
在这里插入图片描述

在这里插入图片描述

2.2 SpringCloud Bus动态刷新全局广播

首先以cloud-config-client3355为模板,新建个cloud-config-client3366项目
在这里插入图片描述

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
    在这里插入图片描述

  • http://localhost:3355/configInfo
    在这里插入图片描述

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

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

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;

在这里插入图片描述

2.3.2 案例测试

案例测试,再次修改配置服务器的version为4
在这里插入图片描述
执行 curl -X POST “http://localhost:3344/actuator/bus-refresh/config-client:3355”

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可见实现了定点通知刷新;

点赞+评论+关注
本文源码地址: https://gitee.com/shuaidawang/SpringCloudDemo.git
有错误的地方欢迎各位大佬指正!可以加入qq交流群: 700637673

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臭小子帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值