书接上回:

SpringCloud专题之一:Eureka

Spring Cloud专题之二:OpenFeign

Spring Cloud专题之三:Hystrix

Spring Cloud 专题之四:Zuul网关

Spring Cloud专题之五:config

在上一篇文章中,我们说到了如果config server的配置文件发生了修改,config client可以通过执行/actutor/refresh来实现热刷新。但是这也做的弊端也很明显,如果有几十上百个config client,需要一个服务一个服务地发送请求,可能会被运维兄弟打死。。。。。。那么在微服务项目中,Spring Cloud Bus这个必备组件就不得不出场了。

Spring Cloud Bus,俗称消息总线,通过使用轻量级的消息代理来构建一个公共地消息主题让系统中所有的微服务实例都连接上来,在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上地实例都知道消息,例如配置信息的变更或者其他一些管理操作等。

消息代理

消息代理是一种消息验证、传熟、路由的架构模式,他在应用程序之间起到通信调度并最小化应用之间的依赖的作用,是的应用程序可以高效的解耦通信过程。他的核心是一个消息的路由程序,用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。

常用的使用场景:

  • 将消息路由到一个或多个目的地
  • 消息转化为其他的表现方式
  • 执行消息的聚集、消息的分解,并将结果发送到他们的目的地,然后重新组合响应返回给消息用户
  • 调用web服务来检索数据
  • 响应事件或错误
  • 使用发布-订阅模式来提供内容或基于主题的消息路由

目前支持Spring Cloud Bus的消息中间件只有这两个:RabbitMQ和Kafka。

RabbitMQ实现消息总线

关于RabbitMQ,欢迎查看我之间的博客:消息队列之RabbitMQ

消息总线bus是基于Actuator对外提供热刷新服务。

1.扩展之前的config-client项目

因为我这边用config-client做测试,引入spring-cloud-starter-bus-amqp会下图这个错,

所以在引入bus-amqp的依赖的时候,改了spring boot的版本,我其他spring cloud组件所用的spring boot版本都是2.3.10.RELEASE,在引入bus组件后spring cloud的版本修改为2.1.4.RELEASE,spring cloud的版本修改为Greenwich.SR1。

<?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"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.charon</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <!-- 添加spring cloud bus的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

2.配置文件的信息

spring.application.name=config-client
server.port=9011 spring.cloud.compatibility-verifier.enabled=false # 需要配置spring cloud config server位置和要加载的相关参数
# spring cloud config server的连接地址
spring.cloud.config.uri=http://localhost:8888
# 要加载的配置文件主体命名
spring.cloud.config.name=config
# 要加载的配置文件的profile,默认为default
spring.cloud.config.profile=default
# 要加载的配置文件所在的分支命名,默认为null,相当于master
spring.cloud.config.label=master eureka.client.serviceUrl.defaultZone=http://eureka-server1:9001/eureka/ # 配置rabbitMQ的相关信息
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest # 设置应用是否连接到消息总线上
spring.cloud.bus.enabled=true
management.endpoints.web.exposure.include=info,health,refresh,bus-refresh

3.打包成jar,然后使用java -jar命令启动两个服务,9011,9012

如下图所示,访问9011和9012得到的配置信息如下:

访问rabbitmq的页面,可以看到默认创建了一个exchange:springCloudBus

4.修改git上的值,并使用postman发送post请求。

5.查看

如此这样,只需要发送一次bus-refresh请求,两个config client服务的配置都发生了修改。

详细说明

在本示例中,我使用的架构图如下所示:

其中包含了Git仓库,config server以及几个config client服务,config client服务都引入了Spring Cloud Bus,所以他们都连接到了RabbitMQ的消息总线上。

当我们将系统启动起来之后,图中“Service A”的三个实例会请求Config Server 以获取配置信息,Config Server根据应用配置的规则从Git仓库中获取配置信息并返回。

此时,若我们需要修改“Service A”的属性。首先,通过Git管理工具去仓库中修改对应的属性值,但是这个修改并不会触发“Service A”实例的属性更新。我们向“Service A”的实例3发送POST请求,访问/bus/refresh(本示例中为/actuator/bus-refresh)接口。此时,“Service A”的实例3就会将刷新请求发送到消息总线中,该消息事件会被“Service A”的实例1和实例2从总线中获取到,并重新从Config Server中获取它们的配置信息,从而实现配置信息的动态更新。

而从Git仓库中配置的修改到发起/bus/refresh的 POST请求这一步可以通过Git仓库的Web Hook来自动触发。由于所有连接到消息总线上的应用都会接收到更新请求,所以在 Web Hook中就不需要维护所有节点内容来进行更新,从而解决了上一章中仅通过Web Hook来逐个进行刷新的问题。

RabbitMQ使用的为topic交换器,配合#路由键做广播消息处理。

指定刷新范围

Spring Cloud Bus也支持在bus-refresh接口中提供一个destination的参数,用来定位具体要刷新的服务。

将git残酷中的age值从100改为101,在postman中指定刷新9011的服务

这样就是有9011服务的值修改了,而9012服务的值并没有修改。

参考文章:

翟永超老师的《Spring Cloud微服务实战》

https://forezp.blog.csdn.net/article/details/70148235

Spring Cloud 专题之六:bus的更多相关文章

  1. Spring Cloud 专题之七:Sleuth 服务跟踪

    书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...

  2. Spring Cloud专题之三:Hystrix

    在微服务架构中,我们将系统拆分成很多个服务单元,各单位的应用间通过服务注册与订阅的方式相互依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问 ...

  3. Spring Cloud 专题之四:Zuul网关

    书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix 经过前面三章对Spring Cloud ...

  4. Spring Cloud专题之五:config

    书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...

  5. spring cloud 专题一 (spring cloud 入门搭建 之 Eureka注册中心搭建)

    一.前言 本文为spring cloud 微服务框架专题的第一篇,主要讲解如何快速搭建spring cloud微服务及Eureka 注册中心 以及常用开发方式等. 本文理论不多,主要是傻瓜式的环境搭建 ...

  6. spring cloud 专题二(spring cloud 入门搭建 之 微服务搭建和注册)

    一.前言 本文为spring cloud 微服务框架专题的第二篇,主要讲解如何快速搭建微服务以及如何注册. 本文理论不多,主要是傻瓜式的环境搭建,适合新手快速入门. 为了更好的懂得原理,大家可以下载& ...

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

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

  8. 【Spring Cloud学习之六】断路器-Hystrix

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.服务雪崩1.什么是服务雪崩分布式系统中经常会出现某个基础服务不可用造成整个系统不 ...

  9. Spring Cloud Config 使用Bus的动态配置中心

    server端配置 POM文件 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

随机推荐

  1. (1)Canal入门

    1.前言 在我们系统开发过程中,根据业务场景很多数据库数据并不会直接给用户访问的,需要同步保存到ElasticSearch.Redis等存储应用当中(例如最常见的是搜索页面的ElasticSearch ...

  2. 基于 electron 实现简单易用的抓包、mock 工具

    背景 经常我们要去看一些页面所发出的请求时,经常会用到 Charles 做为抓包工具来进行接口抓取,但一方面市面是很多抓包工具都是收费或者无法二次开发的.当前我们团队大多数用的也都是 Charles, ...

  3. QT 之 ODBC连接人大金仓数据库

    QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...

  4. Docker 优雅终止方案

    作为一名系统工程师,你可能经常需要重启容器,毕竟Kubernetes的优势就是快速弹性伸缩和故障恢复,遇到问题先重启容器再说,几秒钟即可恢复,实在不行再重启系统,这就是系统重启工程师的杀手锏.然而现实 ...

  5. python之set集合,基础篇

    集合:set 特点:1>.无序 ,因为集合是无序的,所以不可用下标值查询,也不可切片2>.去重 ,一个集合内不能有两个相同的元素3>.可添加,可删除,不可修改等等4>.集合内的 ...

  6. CentOS-配置YUM源加速(阿里云、Nexus3)

    备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6(aliyun ...

  7. Linux alias 或者 unalias 设置别名

    设置别名 查看别名:alias 设置别名: 临时设置: alias show='ls -al' 上述设置方法存在一个问题,即设置的命令别名只针对当前回话有效,一旦连接断开并重连之前设置的别名别不在有效 ...

  8. Python—IP地址与整数之间的转换

    1. 将整数转换成IP: 思路:将整数转换成无符号32位的二进制,再8位进行分割,每8位转换成十进制即可. 方法一:#!usr/bin/python 2 #encoding=utf-8 3 #1. 将 ...

  9. ARTS第十周

     之前忘了发布 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的 ...

  10. python使用笔记19--网络操作

    1.get请求 1 import requests 2 import datetime 3 #get请求 4 url = 'http://api.nnzhp.cn/api/user/stu_info' ...