概述

基本介绍

Spring Cloud Bus 目前支持两种消息代理:RabbitMQ、Kafka

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

Spring Cloud Bus 用来将分布式系统的结点与轻量级系统链接起来的框架,它整合了 Java 的事件处理机制和消息中间件的功能

什么是总线?

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

基本原理

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

使用

环境准备

  • 安装 Erlang

  • 安装 RabbitMQ:

    以 windowns 版本为例,下载安装后,进入sbin目录输入以下命令启动管理功能

    浏览器输入http://localhost:15672/ 进入管理页面(用户名密码默认都是 guest)

设计思想

bus 动态刷新全局广播有两种设计思想

  1. 利用消息总线触发一个客户端的 /bus/refresh,进而刷新所有客户端的配置
  2. 利用消息总线触发一个服务端 ConfigServer 的 /bus/refresh,进而刷新所有客户端的配置

我们采用第二种,第一种方式不适合的原因有三:

  1. 打破了微服务的职责单一性。负责业务模块的微服务不应该承担配置刷新的职责
  2. 破坏了微服务各节点的对等性
  3. 有一定的局限性。例如微服务迁移时,它的网络地址常常发生变化,如果想要做到自动刷新,还需要增加更多的配置

动态刷新全局广播配置

1、在配置中心微服务以及所有需要接收消息的客户端中导入 Maven 依赖

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

2、添加对应配置,使其支持消息总线

########添加在配置中心、所有需要接收消息的客户端中#########

spring:
# rabbitmq相关配置,15672是web管理界面的端口,5672是mq访问的接口
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest #############添加在配置中心微服务中################ # rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'

3、测试,修改 github 中的配置,使用 curl 发送请求 curl -X POST http://localhost:3344/actuator/bus-refresh 后,刷新每个微服务的页面发现都已被修改。实现了一次修改,广播通知,处处生效!

动态刷新定点广播配置

如果不想全部通知,只想定点通知,上述的配置都不用变,只需要发送请求的时候在后面指定「微服名:端口」

curl -X POST http://localhost:3344/actuator/bus-refresh/{destination}

以我的为例就是:

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

流程图

1、配置中心微服务通过远程库获取配置信息,同时订阅 RabbitMQ 主题

2、客户端通过配置中心获取配置信息,同时订阅 RabbitMQ 主题

3、当我们修改远程库的配置后

4、发送 POST 请求

5、配置中心向 RabbitMQ 发送刷新事件

6、客户端监听到刷新事件

7、从配置中心拉取新的配置


获取完整代码

SpringCloud-Bus 消息总线的更多相关文章

  1. SpringCloud Bus消息总线

    在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线. SpringCloud中也有对应的解决方案 ...

  2. SpringCloud Bus消息总线简介

    简介: SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新 SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了 ...

  3. 跟我学SpringCloud | 第八篇:Spring Cloud Bus 消息总线

    SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特 ...

  4. SpringCloud之Config配置中心+BUS消息总线原理及其配置

    一.配置中心作用 在常规的开发中,每个微服务都包含代码和配置.其配置包含服务配置.各类开关和业务配置.如果系统结构中的微服务节点较少,那么常规的代码+配置的开发方式足以解决问题.当系统逐步迭代,其微服 ...

  5. SpringCloud(六)Bus消息总线

    Bus 消息总线 概述 分布式自动刷新配置功能 Spring Cloud Bus 配合 Spring Cloud Config使用可以实现配置的动态刷新 Bus支持两种消息代理:RabbitMQ和Ka ...

  6. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    详见:https://www.w3cschool.cn/spring_cloud/spring_cloud-jl8a2ixp.html 上一篇文章,留了一个悬念,Config Client 实现配置的 ...

  7. Spring Cloud 系列之 Bus 消息总线

    什么是消息总线 消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费. 消息代理又是什么?消息代理是一个消息验证.传输.路由的架构模式,主要用来 ...

  8. spring cloud bus 消息总线 动态刷新配置文件 【actuator 与 RabbitMQ配合完成】

    1.前言 单机刷新配置文件,使用actuator就足够了 ,但是 分布式微服务 不可能是单机 ,将会有很多很多的工程 ,无法手动一个一个的发送刷新请求, 因此引入了消息中间件 ,常用的 消息中间件 是 ...

  9. SpringCloud系列——Bus 消息总线

    前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...

  10. SpringCloud学习之Bus消息总线实现配置自动刷新(九)

    前面两篇文章我们聊了Spring Cloud Config配置中心,当我们在更新github上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用webhook的机制每次提交代码发送请求来刷新 ...

随机推荐

  1. Python python 函数参数:关键字参数

    # 关键字参数 '''关键字参数代表传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict ''' def student(name,sex,**keywords): print(' ...

  2. java面试基础篇-List

    一.ArrayList: 底层为数组实现,线程不安全,查询,修改快,增加删除慢, 数据结构:数组以0为下标依次连续进行存储 数组查询元素:根据下标查询就行 数组增加元素:如果需要给index为10的位 ...

  3. Ubuntu虚拟机查看文件,目录颜色详解

    查看文件 查看Home(不是home)目录下文件: [duanyongchun@localhost ~]$ ls 查看根目录下文件: [duanyongchun@localhost ~]$ cd / ...

  4. A 【NOIP2012 day2】疫情控制

    时间限制 : 20000 MS   空间限制 : 128000 KB 评测说明 : 2s,128m 问题描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是 ...

  5. 2288: 【基础】小X转进制

    2288: [基础]小X转进制 时间限制: 1 Sec 内存限制: 256 MB 提交: 1316 解决: 576 [提交] [状态] [讨论版] [命题人:ghost79] 题目描述 小X喜欢研究进 ...

  6. 三角函数在Three.js中的点的移动轨迹应用

    在学习2D文字的时候,看到官网有这样一个示例: https://threejs.org/examples/#css2d_label ![](https://img2018.cnblogs.com/bl ...

  7. Windows命令help的基本使用

  8. 分享一下,PHP实现第四方QQ微信扫码登陆,不接入qq互联以及微信开发者平台就可以实现用户对接鹅厂,phpQQ微信扫码登陆

    自己抓的QQ包以及整合了网上一些已经封装好了的代码具体如下:QQ: <?php class QQ extends Curl_Api { //获取登录验证码 public function QRc ...

  9. LeetCode | 136. 只出现一次的数字Ⅰ Ⅱ

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  10. 【PHP】数组

    一.生活中的数组: a)    教室的座位:第一天来教室的时候,每个座位上都有自己的一个名字,我们可以通过这个名字快速定位到自己的座位在什么位置! b)    电影院的座位:我们买了电影票之后,能够通 ...