前面我们聊了Spring Cloud Config配置中心,当我们在更新github上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用webhook的机制每次提交代码发送请求来刷新客户端,客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了。使用Spring Cloud Bus(国人很形象的翻译为消息总线,我比较喜欢叫消息巴士)可以完美解决这一问题。(了解源码可+求求: 1791743380)
1. Spring Cloud Bus
Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。
大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。
根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:
- 提交代码触发post给客户端A发送bus/refresh
- 客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus
- Spring Cloud bus接到消息并通知给其它客户端
- 其它客户端接收到通知,请求Server端获取最新配置
- 全部客户端均获取到最新的配置
2. 项目示例
2.1 客户端config-client
2.1.1 添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
需要多引入spring-cloud-starter-bus-amqp包,增加对消息总线的支持
2.1.2 配置文件 bootstrap.properties
- spring.application.name=spring-cloud-config-client
- server.port=8081
- spring.cloud.config.name=springcloud-config
- spring.cloud.config.profile=dev
- spring.cloud.config.label=master
- spring.cloud.config.discovery.enabled=true
- spring.cloud.config.discovery.serviceId=spring-cloud-config-server
- eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
- management.endpoints.web.exposure.include=*
- ## 开启消息跟踪
- spring.cloud.bus.trace.enabled=true
- spring.rabbitmq.host=127.0.0.1
- spring.rabbitmq.port=5672
- spring.rabbitmq.username=
- spring.rabbitmq.password=
配置文件需要增加RebbitMq的相关配置,这样客户端代码就改造完成了。
2.1.3 测试
依次启动eureka,config-serve,config-client。
修改config-client启动配置,同时在8081和8082端口启动服务。
启动完成后,浏览器分别访问连接:http://localhost:8081/hello, http://localhost:8082/hello, 可以发现页面显示的内容都是:hello dev update1,说明客户端都已经读取到了server端的内容。
现在我们更新github上的配置文件,将配置内容改为hello dev update,先访问一下http://localhost:8081/hello,可以看到页面依然显示为:hello dev update1。
我们对端口为8081的服务发送一个/actuator/bus-refresh的POST请求,在win10下使用下面命令来模拟webhook。
注意: 在springboot2.x的版本中刷新路径为:/actuator/bus-refresh,在springboot1.5.x的版本中刷新路径为:/bus/refresh。
执行完成后,我们先访问http://localhost:8082/hello,可以看到页面打印内容已经变为:hello dev update,这样说明,我们8081端口的服务已经把更新后的信息通过rabbitmq推送给了8082端口的服务,这样我们就实现了图一中的示例。
2.2 改进版
上面的流程中,虽然我们做到了利用一个消息总线触发刷新,而刷新所有客户端配置的目的,但是这种方式并不合适,如下:
- 打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
- 破坏了微服务各节点的对等性。
- 如果客户端ip有变化,这时我们就需要修改WebHook的配置。
我们可以将上面的流程改进一下:
这时Spring Cloud Bus做配置更新步骤如下:
- 提交代码触发post给Server端发送bus/refresh
- Server端接收到请求并发送给Spring Cloud Bus
- Spring Cloud bus接到消息并通知给其它客户端
- 其它客户端接收到通知,请求Server端获取最新配置
- 全部客户端均获取到最新的配置
这样的话我们在server端的代码做一些改动,来支持/actuator/bus-refresh
和上面的client端的改动基本一致
2.2.1 添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
需要多引入spring-cloud-starter-bus-amqp包,增加对消息总线的支持
2.2.2 配置文件application.yml
- server:
- port: 8080
- spring:
- application:
- name: spring-cloud-config-server
- cloud:
- config:
- server:
- git:
- uri: https://github.com/meteor1993/SpringCloudLearning
- search-paths: chapter6/springcloud-config
- username:
- password:
- rabbitmq:
- host: 217.0.0。1
- port: 5672
- username:
- password:
- management:
- endpoints:
- web:
- exposure:
- include: "*"
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8761/eureka/
配置文件需要增加RebbitMq的相关配置,actuator开启所有访问。
2.2.3 测试
依次启动eureka,config-serve,config-client。
修改config-client启动配置,同时在8081和8082端口启动服务。
按照上面的测试方式,访问两个客户端测试均可以正确返回信息。同样修改配置文件,将值改为:hello im dev update并提交到仓库中。在win10下使用下面命令来模拟webhook。
执行完成后,依次访问两个客户端,返回:hello im dev update。说明三个客户端均已经拿到了最新配置文件的信息,这样我们就实现了上图中的示例。
相关推荐
Spring Cloud Bus正是这样一种工具,它利用轻量级的消息代理来连接分布式系统中的节点,实现了配置更改的广播功能以及服务之间的通信。本文详细介绍了Spring Cloud Bus的架构原理和使用方法。 首先,Spring Cloud ...
在微服务架构中,Spring Cloud Bus 是一个非常重要的组件,它起到了消息总线的作用,能够有效地连接各个微服务节点,并且结合轻量级的消息代理,如 RabbitMQ 或 Kafka,实现跨服务的通信和同步更新。下面我们将深入...
Spring Cloud Bus 是一个重要的组件,它在微服务架构中起到了消息总线的作用,允许服务间的通信和状态更新的广播。消息总线的概念是基于轻量级的消息代理,如 RabbitMQ 或 Kafka,它允许将消息从一个服务传递到所有...
在 Spring Cloud Config/Bus 中,Bus 是一个事件总线,负责传输配置事件。在 Bus 中,事件是通过 AMQP 协议传输的。Bus 事件可以是配置文件的变化、添加或删除等。 五、结论 本文对 Spring Cloud Config/Bus 的...
2. Spring Cloud Bus:用于在分布式系统中传播状态变化(比如配置文件的修改)的事件总线,可以与Spring Cloud Config配合使用,实现配置的热更新。 3. Spring Cloud Netflix:集成了Netflix提供的多个组件,例如:...
6. **Spring Cloud Bus**: 控制总线,用于广播事件到所有的服务实例,例如配置更新。它通常与 Spring Cloud Config 结合使用,实现在运行时的配置更新。 7. **Ribbon**: Ribbon 是一个客户端负载均衡器,它提供了...
SpringCloud Bus 消息总线 SpringCloud Stream 消息驱动 SpringCloud Sleuth 分布式请求链路跟踪 SpringCloud Alibaba入门简介 SpringCloud Alibaba Nacos 服务注册和配置中心 SpringCloud Alibaba Sentinel ...
6. **Spring Cloud Bus**:Bus是一个事件、消息总线,常用于配置更改的广播,可以与Config结合,实现配置的实时刷新。 7. **Spring Cloud Gateway**:Spring Cloud的最新版本中,Zuul已被Gateway取代,Gateway提供...
6. Spring Cloud Bus:事件、消息总线,用于在微服务间传播状态变化。 7. Spring Cloud Gateway:Spring Cloud的新一代API网关,替代了Zuul,提供了更强大和灵活的路由功能。 三、关键组件解析 1. Eureka源码:研究...
5. **消息总线**:通过Spring Cloud Bus实现消息的广播机制,可以用于实时更新配置。 6. **API Gateway**:通过Zuul实现服务路由。 7. **分布式跟踪**:通过Sleuth和Zipkin实现请求的追踪和监控。 ### Spring Cloud...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具包,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
6. **SpringCloud Bus**:消息总线,通常结合Config一起使用,当配置发生改变时,通过消息驱动的方式通知各个服务实例进行配置的同步更新。 7. **SpringCloud Gateway**:相较于Zuul,SpringCloud Gateway是更现代...
6. **Spring Cloud Bus**:事件、消息总线,可用于广播配置更改或同步服务状态。 7. **Spring Cloud Data Flow**:数据流处理工具,用于构建、部署和管理数据流任务。 8. **Spring Cloud Gateway**:新一代API网关,...
SpringCloud Alibaba的Data Bus模块,就是基于RabbitMQ或者RocketMQ实现的一种轻量级消息总线,它使得微服务之间的数据变更可以实时广播到其他服务,从而实现数据的一致性。 三、Data Bus的实现原理 Data Bus的...
7. **Spring Cloud Bus**:用于在集群中传播事件,比如更新配置信息,可以通过消息总线实时推送到各个微服务实例。 在学习SpringCloud的过程中,你需要理解这些组件的作用,以及它们如何协同工作。配合SpringCloud....
SpringCloud作为微服务解决方案的集大成者,为基于SpringBoot的应用提供了构建分布式系统所需的工具,如服务发现、配置管理、断路器、智能路由、微代理、控制总线等。它使得开发者能够轻松地在SpringBoot应用中实现...
第八课: 消息总线(Spring Cloud Bus) 第九课: 服务链路追踪(Spring Cloud Sleuth) 第十课: 高可用的服务注册中心 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: ...
最后,SpringCloud Bus可以看作是一个事件、消息总线,它常被用来刷新配置或者广播其他事件。开发者需要学习如何利用SpringCloud Bus实现配置的动态更新。 除此之外,尚硅谷周阳老师的笔记可能还涵盖了SpringCloud ...
Springcloud是Java领域一款强大的微服务治理框架,它基于Spring Boot进行快速构建,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...
7. **Spring Cloud Bus**:事件、消息总线。用于广播配置更改,或者实现服务间的通信。 此外,教程可能还会涉及Spring Cloud Data Flow(数据流处理)、Spring Cloud Stream(消息驱动的微服务间通信)以及Spring ...