Spring Cloud 系列之 Bus 消息总线

简介:

Spring Cloud 系列之 Bus 消息总线

1|0什么是消息总线
消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。

消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。

2|0什么是 Spring Cloud Bus

Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。

Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-bus/2.2.1.RELEASE/reference/html/

3|0什么时候使用 Spring Cloud Bus
微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。

总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。

接下来我们通过 Spring Cloud Bus 实现微服务架构的配置刷新。

4|0环境准备
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

5|0Spring Cloud Bus 实现配置刷新
5|1客户端发起通知
点击链接观看:客户端发起通知视频(获取更多请关注公众号「哈喽沃德先生」)

消息总线(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 依赖。

org.springframework.cloudspring-cloud-starter-bus-amqp

配置文件
配置文件需要配置 消息队列 和 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.101 port: 5672 username: guest password: guest virtual-host: / # 度量指标监控与健康检查 management: endpoints: web: base-path: /actuator # 访问端点根路径,默认为 /actuator exposure: include: bus-refresh # 需要开启的端点 #exclude: # 不需要开启的端点

测试
查看端点
访问:http://localhost:9091/actuator 可以看到已经开启了 bus-refresh 自动刷新端点。

访问:http://localhost:9091/namehttp://localhost:9092/name 结果如下:

修改 Git 仓库配置
修改 Git 仓库配置信息如下:

自定义配置 name: order-service-prod-1.0

自动刷新
刷新页面发现结果并未改变,没事正常。

通过 Post 方式调用「任意客户端」的自动刷新端点:http://localhost:9091/actuator/bus-refresh 再次访问结果如下:

查看队列
再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。

该交换机下绑定了两个队列对应我们的两个 Config Client。

客户端发起通知缺陷
打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
破坏了微服务各节点的对等性。
存在一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,就不得不修改Webhook 的配置。
5|2服务端发起通知
点击链接观看:服务端发起通知视频(获取更多请关注公众号「哈喽沃德先生」)

为了解决客户端发起通知缺陷,我们改用服务端发起通知。

Webhook监听被触发,给 ConfigServer 发送 bus-refresh 请求刷新配置
ConfigServer 发送消息给 Bus
Bus 接收消息后广播通知所有 ConfigClient
各 ConfigClient 收到消息重新读取最新配置
添加依赖
Config Server 添加 spring cloud starter bus amqp 依赖。

org.springframework.cloudspring-cloud-starter-bus-amqp

配置文件
配置文件需要配置 消息队列 和 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.101 port: 5672 username: guest password: guest virtual-host: / # 配置 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: # 不需要开启的端点

测试
查看端点
访问:http://localhost:8888/actuator 可以看到已经开启了 bus-refresh 自动刷新端点。

访问:http://localhost:9091/namehttp://localhost:9092/name 结果如下:

修改 Git 仓库配置
修改 Git 仓库配置信息如下:

自定义配置 name: order-service-prod-2.0

自动刷新
刷新页面发现结果并未改变,没事正常。

通过 Post 方式调用「任意服务端」的自动刷新端点:http://localhost:8888/actuator/bus-refresh 再次访问结果如下:

查看队列
再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。

该交换机下绑定了四个队列对应我们的两个 Config Server 和两个 Config Client。

5|3局部刷新
假设有这样一种场景,我们开发了一个新的功能,此时需要对该功能进行测试。我们只希望其中一个微服务的配置被更新,等功能测试完毕,正式部署线上时再更新至整个集群。但是由于所有微服务都受 Spring Cloud Bus 的控制,我们更新了其中一个微服务的配置,就会导致其他服务也被通知去更新配置。这时候局部刷新的作用就体现出来了。

刷新指定服务
修改 Git 仓库配置信息如下:

自定义配置 name: order-service-prod-3.0

通过 Post 方式调用「任意服务端」的自动刷新端点:http://localhost:8888/actuator/bus-refresh/order-service:9091 再次访问结果如下:

9091 端口的客户端已经更新配置。

9092 端口的客户端没有更新配置。

刷新指定集群
假设现在功能测试完毕,需要正式部署线上更新至整个集群。但是由于 Spring Cloud Bus 控制着多个微服务集群(订单微服务、商品微服务等),而我们只想更新指定集群下的配置,这个时候就可以使用 Bus 提供的通配符更新方案。

修改 Git 仓库配置信息如下:

自定义配置 name: order-service-prod-4.0

通过 Post 方式调用「任意服务端」的自动刷新端点:http://localhost:8888/actuator/bus-refresh/order-service:** 再次访问结果如下:

至此 Bus 消息总线所有的知识点就讲解结束了。

EOF

本文作者:哈喽沃德先生
本文链接:https://www.cnblogs.com/mrhelloworld/p/bus.html

相关文章
|
19小时前
|
安全 Java Docker
|
1天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
13 6
|
5天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
5天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
7天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
20 1
|
7天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
13 2
|
7天前
|
监控 Java Sentinel
Spring Cloud Sentinel:概念与实战应用
【4月更文挑战第28天】在分布式微服务架构中,确保系统的稳定性和可靠性至关重要。Spring Cloud Sentinel 为微服务提供流量控制、熔断降级和系统负载保护,有效预防服务雪崩。本篇博客深入探讨 Spring Cloud Sentinel 的核心概念,并通过实际案例展示其在项目中的应用。
16 0
|
7天前
|
Cloud Native Java Nacos
Spring Cloud Nacos:概念与实战应用
【4月更文挑战第28天】Spring Cloud Nacos 是一个基于 Spring Cloud 构建的服务发现和配置管理工具,适用于微服务架构。Nacos 提供了动态服务发现、服务配置、服务元数据及流量管理等功能,帮助开发者构建云原生应用。
14 0
|
10天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
11天前
|
消息中间件 Java 中间件
第十六章 Spring cloud stream应用
第十六章 Spring cloud stream应用
14 0