关键词:
参考技术A 消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。
什么是 Spring Cloud Bus
Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。
Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
什么时候使用 Spring Cloud Bus
微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。
总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。
接下来我们通过 Spring Cloud Bus 实现微服务架构的配置刷新。
环境准备
RibbitMQ v3.8.2 地址:192.168.10.101
bus-demo 聚合工程 SpringBoot 2.2.4.RELEASE、Spring Cloud Hoxton.SR1。
eureka-server:注册中心
eureka-server02:注册中心
config-server:配置中心服务端
config-server02:配置中心服务端
order-service:订单服务(配置中心客户端)
order-service02:订单服务(配置中心客户端)
配置文件 order-service-prod.yml
spring:
application:
name: order-service # 应用名称
# 配置 Eureka Server 注册中心
eureka:
instance:
prefer-ip-address: true # 是否使用 ip 地址注册
instance-id: $spring.cloud.client.ip-address:$server.port # ip:port
client:
service-url: # 设置服务注册中心地址
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
# 自定义配置
name: order-service-prod
password: root
Spring Cloud Bus 实现配置刷新
客户端发起通知
消息总线(Bus)的典型应用场景就是配置中心客户端刷新。
我们在学习 Spring Cloud Config 配置中心时给大家讲了基于 Actuator 的配置刷新,当时的案例只有一个 Config Client,我们可以使用 Webhook,设置手动刷新都不算太费事,但是如果客户端比较多的情况下,一个一个去手动刷新未免有点复杂,这种方案就不太适合了。使用 Spring Cloud Bus 可以完美解决这一问题。
借助 Spring Cloud Bus 的广播功能,让 Config Client 都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus 就把此事件广播到其他订阅客户端,以此来达到批量更新。
Webhook 监听被触发,给 ConfigClient A 发送 bus-refresh 请求刷新配置
ConfigClient A 读取 ConfigServer 中的配置,并且发送消息给 Bus
Bus 接收消息后广播通知其他 ConfigClient
其他 ConfigClient 收到消息重新读取最新配置
添加依赖
Config Client 添加 spring cloud starter bus amqp 依赖。
<!-- spring cloud starter bus amqp 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置文件
配置文件需要配置 消息队列 和 bus-refresh 自动刷新端点。/actuator/bus-refresh 端点会清除 @RefreshScope 缓存重新绑定属性。
Config Client 的 bootstrap.yml 核心配置。
spring:
cloud:
config:
name: order-service # 配置文件名称,对应 git 仓库中配置文件前半部分
label: master # git 分支
profile: prod # 指定环境
discovery:
enabled: true # 开启
service-id: config-server # 指定配置中心服务端的 service-id
# 消息队列
rabbitmq:
host: 192.168.10.106
# 度量指标监控与健康检查
management:
endpoints:
web:
base-path: /actuator # 访问端点根路径,默认为 /actuator
exposure:
include: bus-refresh # 需要开启的端点
#exclude: # 不需要开启的端点
测试
查看端点
可以看到已经开启了 bus-refresh 自动刷新端点。
修改 Git 仓库配置
修改 Git 仓库配置信息如下:
# 自定义配置
name: order-service-prod-1.0
自动刷新
刷新页面发现结果并未改变,没事正常。
通过 Post 方式调用 任意客户端 的自动刷新端点:再次访问结果如下:
查看队列
再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。
该交换机下绑定了两个队列对应我们的两个 Config Client。
客户端发起通知缺陷
打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
破坏了微服务各节点的对等性。
存在一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,就不得不修改Webhook 的配置。
服务端发起通知
为了解决客户端发起通知缺陷,我们改用服务端发起通知。
Webhook监听被触发,给 ConfigServer 发送 bus-refresh 请求刷新配置
ConfigServer 发送消息给 Bus
Bus 接收消息后广播通知所有 ConfigClient
歌 ConfigClient 收到消息重新读取最新配置
添加依赖
Config Server 添加 spring cloud starter bus amqp 依赖。
<!-- spring cloud starter bus amqp 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置文件
配置文件需要配置 消息队列 和 bus-refresh 自动刷新端点。/actuator/bus-refresh 端点会清除 @RefreshScope 缓存重新绑定属性。
Config Server 的 application.yml 核心配置。
spring:
application:
name: config-server # 应用名称
cloud:
config:
server:
git:
uri: https://github.com/imrhelloworld/config-repo # 配置文件所在仓库地址
#username: # Github 等产品的登录账号
#password: # Github 等产品的登录密码
#default-label: master # 配置文件分支
#search-paths: # 配置文件所在根目录
# 消息队列
rabbitmq:
host: 192.168.10.106
# 配置 Eureka Server 注册中心
eureka:
instance:
prefer-ip-address: true # 是否使用 ip 地址注册
instance-id: $spring.cloud.client.ip-address:$server.port # ip:port
client:
service-url: # 设置服务注册中心地址
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
# 度量指标监控与健康检查
management:
endpoints:
web:
base-path: /actuator # 访问端点根路径,默认为 /actuator
exposure:
include: bus-refresh # 需要开启的端点
#exclude: # 不需要开启的端点
bus:消息总线(代码片段)
SpringCloudBus:消息总线一、消息总线简介1.什么是SpringCloudBusSpringCloudBus集成了市面上常见的RabbitMQ和Kafka等消息代理。其会连接微服务系统中所有拥有Bus总线机制的节点,当有数据变更的时候,会通过消息中间件使用消息广播的... 查看详情
springcloudbus消息总线(代码片段)
目录一、概述简介1.1.Bus是什么1.2.Bus能干嘛1.3.为何被称为总线二、RabbitMQ环境配置2.1.windows下载与安装2.2.使用RabbitMQ三、Bus动态刷新全局广播3.1.Bus设计思想3.2.代码实现3.2.1.调整3344config服务端3.2.2.调整3355config客户端3.2.3.搭建3366con... 查看详情
springcloud集成bus消息总线(代码片段)
SpringCloudBus消息总线Bus消息总线是什么能干嘛为何被称为总线Bus之RabbitMQ环境配置Bus动态刷新全局广播的设计思想和选型设计思想Bus动态刷新全局广播配置实现Bus动态刷新定点通知通知总结原理探究核心流程整合bus后的原理分析... 查看详情
第九章消息总线:springcloudbus
在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。在总线上的各个实... 查看详情
springcloud学习-消息总线(springcloudbus)
1、简介 SpringCloudBus将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用SpringCloudBus实现通知微服务架构的配置文件的更改。SpringCloudBus可选... 查看详情
springcloud(greenwich版)bus消息总线
一、Bus简介是什么: SpringCloudBus使用轻量级的消息代理(目前只支持两种,RabbitMQ和Kafka)连接分布式系统的节点,这样就可以广播传播状态的更改(例如配置的更新)或者其他的管理指令。可将SpringCloudBus想象成一个分布式S... 查看详情
springcloud-2.0-周阳(14.消息总线-springcloudbus)
...录文章目录1.概述1.1简介1.2作用1.3总线2.RabbitMQ环境配置3.SpringCloudBus动态刷新全局广播3.1添加一个Config- 查看详情
springcloud学习记录08springcloudbus服务总线(代码片段)
Bus服务总线SpringCloudBus是轻量的消息代理,将分布式节点连接,用于广播配置文件的更新或监控管理补充说明&优点Bus是轻量级消息代理Bus主要实现配置的自动更新(无需配置)Bus底层基于RabbitMQ实现广播配置文... 查看详情
springcloud教程|第八篇:消息总线(springcloudbus)(代码片段)
一、安装rabbitmq二、pom父文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven. 查看详情
业余草springcloud教程|第八篇:消息总线(springcloudbus)(finchley版本)
SpringCloudBus将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用SpringCloudBus实现通知微服务架构的配置文件的更改。一、准备工作本文还是基于... 查看详情
史上最简单的springcloud教程|第八篇:消息总线(springcloudbus)
.../08/30/sc-f8-bus/或者http://blog.csdn.net/forezp/article/details/81041062SpringCloudBus将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要 查看详情
springcloud构建微服务架构消息总线(续:kafka)
SpringCloudBus除了支持RabbitMQ的自动化配置之外,还支持现在被广泛应用的Kafka。在本文中,我们将搭建一个Kafka的本地环境,并通过它来尝试使用SpringCloudBus对Kafka的支持,实现消息总线的功能。由于本文会以之前Rabbit的实现作为基... 查看详情
springboot2.0消息总线(springcloudbus)高可用分布式配置中心实例
...再不重启服务的情况下就能获取到修改的属性值只要开启SpringCloudBus后,不管是对config-server还是config-client执行/actuator/bus-refresh都是可以更新配置的,如果有多个客户端,多个客户端都会接收到刷新配置的消息,并刷新配置。某... 查看详情
springcloudspringcloudbus服务总线(二十二)
SpringCloudBus介绍 总线,在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以称他为消息总... 查看详情
springcloudbus
springCloudBus 是什么? springCloudBus是用来将分布式系统的节点与轻量级消息系统连接起来的框架,它整合了java的事件处理机制和消息中间件的功能。Bus支持两种消息代理:RabbitMQ和Kafka。作用: Bus可以管理... 查看详情
消息总线(代码片段)
SpringCloudBus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与SpringCloudConfig联合实现热部署。在上一篇写出了springcloud对微服务的集中配置,那么就出现了一个问题,如果修改配置了怎么实现不需重启... 查看详情
sringcloud学习成长之路八消息总线(代码片段)
SpringCloudBus将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用SpringCloudBus实现通知微服务架构的配置文件的更改。一、准备工作本文还是基于... 查看详情
springcloudbus
SpringCloud总线用轻量级消息链接分布式系统的节点代理。然后,可以使用此代理广播状态更改(例如配置变更)或其他管理说明。一个关键的想法是,公共汽车就像一个用于横向扩展的Spring引导应用程序的分布式执行器。但是,... 查看详情