SpringCloud(Greenwich版)Bus消息总线

一、Bus简介

是什么:

  Spring Cloud Bus 使用轻量级的消息代理(目前只支持两种,RabbitMQ 和 Kafka)连接分布式系统的节点,这样就可以广播传播状态的更改(例如配置的更新)或者其他的管理指令。可将 Spring Cloud Bus 想象成一个分布式 Spring Boot Actuator,也可以当做微服务间的通信通道。

为什么被称为消息总线:

  在微服务系统架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题(订阅某学校的微信公众号 topic),并让系统中所有微服务实例(可以理解为所有学生 micro-service)都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称之为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。

基本原理:

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

登录RabbitMQ Web页面后,在我们的 Exchanges (RabbitMQ交换机) 中,会有一个默认的名称:springCloudBus

二、设计思想两种通知

第一种方式:利用消息总线触发一个客户端/bus/refresh端点,而刷新所有客户端的配置。

  1. 提交配置出发 POST 请求调用客户端A (Config Client) 的 /bus/refresh 接口
  2. 客户端A (Config Client) 收到请求从配置中心 (Config Server) 更新配置并且发送给 Bus 消息总线
  3. Bus 消息总线接收消息并通知给其他连线在总线上的客户端,所有总线上的客户端均能接收到消息
  4. 其他客户端接收到消息,请求配置中心 (Config Server) 获取最新配置
  5. 全部客户端均获取到最新的配置

存在以下问题:

  破坏了微服务职责的单一性,因为微服务本身就是一个业务模块,它本不应该承担配置刷新的职责。

  破坏了微服务各个节点的对等性,例如有 A、B、C 三个订单模块集群,如果 B、C 服务没有更新功能,只有 A 服务更新功能的话。既增加了额外的负担,又破坏了平衡性,会导致整个集群会产生分裂。

  有一定的局限性。例如微服务正在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。

第二种方式:利用消息总线触发一个服务端Config Server的bus/refresh端点,而刷新所有客户端的配置。

  1. 提交配置触发 POST 请求给配置中心 (Config Server) 的 /bus/refresh 接口
  2. 配置中心 (Config Server) 接收到请求并发送给 Bus 消息总线
  3. Bus 消息总线接收到消息并通知给其他连接的总线的客户端
  4. 其他客户端接收到通知,请求配置中心 (Config Server) 获取最新配置
  5. 全部客户端获取到最新的配置

三、Bus实现动态刷新

  Spring Cloud Bus 是对上一讲 Config分布式统一配置中心 的扩充,好处说明它是广播型的,自动版的动态刷新。是 Spring Cloud Config 的绝配,要用就一起使用,Bus 与 Config 使用可以实现配置的动态刷新功能。

我们通过使用config-server配置中心来通知config-client与config-rabbitmq两个客户端:

为Config Server添加消息总线支持

1)补充build.gradle项目依赖

修改config-server模块并添加消息总线rabbitmq依赖

compile group: ‘org.springframework.cloud‘, name: ‘spring-cloud-starter-bus-amqp‘

2)补充application.yaml配置文件

添加消息总线的支持后需要暴露bus刷新配置的端点和rabbitmq相关的配置信息

server:
  port: 7001
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/wessonshin/config-server.git
          username: your git username
          password: your git password
          clone-on-start: true
          search-paths:
            - config-server
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
management:
  endpoints:
    web:
      exposure:
        include: ‘bus-refresh‘

为Config Client添加消息总线支持

参考上一讲config-client客户端,在创建一个config-rabbitmq工程,代码和config-client相同。

3)补充build.gradle项目依赖

修改config-client和config-rabbitmq两个模块并添加actuator监控与消息总线rabbitmq依赖

compile group: ‘org.springframework.boot‘, name: ‘spring-boot-starter-actuator‘

compile group: ‘org.springframework.cloud‘, name: ‘spring-cloud-starter-bus-amqp‘

4)补充application.yaml配置文件

Config客户端只需要新添加rabbitmq相关配置信息就OK了,其它不变

server:
  port: 7071
spring:
  application:
    name: config-client
  cloud:
    config:
      label: master
      name: config-server
      profile: dev
      uri: http://localhost:7001
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
management:
  endpoints:
    web:
      exposure:
        include: ‘refresh‘

5)测试

Step1:运行 eureka-server 启动类,端口为8761

Step2:运行 config-server 启动类,端口为7001

Step3:分别运行两个Config客户端,config-client与config-rabbitmq启动类,端口分别为7071与7072

Step4:先访问http://localhost:8761/,注册到的服务如下图:

Step5:我们继续修改远程 GitHub 仓库版本号为:

Step6:此处刷新的是配置中心服务端,而不是客户端。需要发送Post请求,将windows10的cmd命令窗口打开,输入命令如下:

  • curl -X POST "http://localhost:7001/actuator/bus-refresh"

Step7:使用配置中心访问远程 GitHub 仓库还是能够直接获取到更新版本号:

Step8:接着通过两个Config客户端访问,同样也能够从远程 GitHub 仓库直接获取到更新版本号:

此时仍然不用重启服务,同时客户端可跟着一起更新版本。达到了一次修改,广播通知,处处生效的效果。

原文地址:https://www.cnblogs.com/wessonshin/p/12543137.html

时间: 2024-08-03 02:17:07

SpringCloud(Greenwich版)Bus消息总线的相关文章

Spring Cloud Bus 消息总线

1.继承配置的东西,启动两个config-client,注意需要安装rabbitmq 2.改造config-client pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

JHipster技术栈定制 - JHipster Registry消息总线配置

本文说明了如何定制化JHipster-Registry,增加消息总线功能. 实现的效果就是修改配置中心的文件后,通过消息队列主动推送给微服务而无需重启微服务,实现配置内容热加载. 1 整体规划 1.1 拓扑架构 1.2 基础设置 编号 IP 主机名 B 10.70.24.135 node02 C 10.70.24.136 node03 D 10.70.24.85 node04 E 10.70.24.95 node05 1.3 相关组件 组件名 说明 版本 Jhipster Registry 基于

SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版

前言 在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心(SpringCloud Config)的配置刷新和消息总线(RabbitMQ和Kafka)使用教程. SpringCloud Config Refresh 在上一篇中我们介绍了springcloud配置中心的本地使用和Git使用的用法,但是当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,需

史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)

最新Finchley版本请访问:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/或者http://blog.csdn.net/forezp/article/details/81041062 Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改. 本文还是基于

springcloud(九):配置中心和消息总线(配置中心终结版)

Spring Cloud BusSpring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道.目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中. Spring cloud bus被国内很多都翻译为消息总线,也挺形象的.大家可以将它理解为管理和传播

Spring Cloud(九):配置中心(消息总线)【Finchley 版】

Spring Cloud(九):配置中心(消息总线)[Finchley 版] 发表于 2018-04-19 |  更新于 2018-05-07 | 我们在 Spring Cloud(七):配置中心(Git.Refresh) 中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用 Webhook 的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用 Spring Cloud Bus 可以完美解决这一问题. Sp

第九章 消息总线: Spring Cloud Bus

在微服务架构的系统中, 我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来, 由于该主题中产生的消息会被所有实例监听和消费, 所以我们称它为消息总线. 在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息, 例如配置信息的变更或者其他一些管理操作等 由于消息总线在微服务架构系统中被广泛使用, 所以它同配置中心一样, 几乎是微服务架构中的必备组件. Spring Cloud 作为微服务架构综合性的解决方案,对此自然也有自己的实现, 这

第八篇:消息总线(Spring Cloud Bus)

前面几篇文章我们聊了Spring Cloud Config配置中心,当我们在更新Git上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用webhook的机制每次提交代码发送请求来刷新客户端,客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用Spring Cloud Bus可以完美解决这一问题. 1.消息总线 Spring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核

SpringCloud04 服务配置中心、消息总线、远程配置动态刷新

1 环境说明 JDK:1.8 MAVENT:3.5 SpringBoot:2.0.5.RELEASE SpringCloud:Finchley.SR1 2 创建服务注册中心(Eureka服务端) 说明:本博文仅仅以一个单例的注册中心为例,高可用的服务注册中心请参见 2.1 引入依赖 利用IDEA创建服务注册中心项目时只需要引入 spring-cloud-starter-netflix-eureka-server 一个依赖就可以啦 <dependency> <groupId>org.