`
6696
  • 浏览: 15330 次
社区版块
存档分类
最新评论

SpringCloud:Spring Cloud Bus 消息总线

 
阅读更多

 

前面我们聊了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在配置中心使用的机制。

 

SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线
 

 

根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:

  1. 提交代码触发post给客户端A发送bus/refresh
  2. 客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus
  3. Spring Cloud bus接到消息并通知给其它客户端
  4. 其它客户端接收到通知,请求Server端获取最新配置
  5. 全部客户端均获取到最新的配置

2. 项目示例

2.1 客户端config-client

2.1.1 添加依赖

Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.springframework.cloud</groupId>  
  3.     <artifactId>spring-cloud-starter-bus-amqp</artifactId>  
  4. </dependency>  

 需要多引入spring-cloud-starter-bus-amqp包,增加对消息总线的支持

2.1.2 配置文件 bootstrap.properties

Java代码  收藏代码
  1. spring.application.name=spring-cloud-config-client  
  2. server.port=8081  
  3.   
  4. spring.cloud.config.name=springcloud-config  
  5. spring.cloud.config.profile=dev  
  6. spring.cloud.config.label=master  
  7. spring.cloud.config.discovery.enabled=true  
  8. spring.cloud.config.discovery.serviceId=spring-cloud-config-server  
  9.   
  10. eureka.client.service-url.defaultZone=http://localhost:8761/eureka/  
  11.   
  12. management.endpoints.web.exposure.include=*  
  13.   
  14. ## 开启消息跟踪  
  15. spring.cloud.bus.trace.enabled=true  
  16.   
  17. spring.rabbitmq.host=127.0.0.1  
  18. spring.rabbitmq.port=5672  
  19. spring.rabbitmq.username=  
  20. 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。

Java代码  收藏代码
  1. curl -X POST http://localhost:8081/actuator/bus-refresh  

 

注意: 在springboot2.x的版本中刷新路径为:/actuator/bus-refresh,在springboot1.5.x的版本中刷新路径为:/bus/refresh。

执行完成后,我们先访问http://localhost:8082/hello,可以看到页面打印内容已经变为:hello dev update,这样说明,我们8081端口的服务已经把更新后的信息通过rabbitmq推送给了8082端口的服务,这样我们就实现了图一中的示例。

2.2 改进版

上面的流程中,虽然我们做到了利用一个消息总线触发刷新,而刷新所有客户端配置的目的,但是这种方式并不合适,如下:

  • 打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性。
  • 如果客户端ip有变化,这时我们就需要修改WebHook的配置。

我们可以将上面的流程改进一下:

 

SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线
 

 

这时Spring Cloud Bus做配置更新步骤如下:

  1. 提交代码触发post给Server端发送bus/refresh
  2. Server端接收到请求并发送给Spring Cloud Bus
  3. Spring Cloud bus接到消息并通知给其它客户端
  4. 其它客户端接收到通知,请求Server端获取最新配置
  5. 全部客户端均获取到最新的配置

这样的话我们在server端的代码做一些改动,来支持/actuator/bus-refresh

和上面的client端的改动基本一致

2.2.1 添加依赖

Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.springframework.cloud</groupId>  
  3.     <artifactId>spring-cloud-starter-bus-amqp</artifactId>  
  4. </dependency>  

 需要多引入spring-cloud-starter-bus-amqp包,增加对消息总线的支持

2.2.2 配置文件application.yml

Java代码  收藏代码
  1. server:  
  2.   port: 8080  
  3. spring:  
  4.   application:  
  5.     name: spring-cloud-config-server  
  6.   cloud:  
  7.     config:  
  8.       server:  
  9.         git:  
  10.           uri: https://github.com/meteor1993/SpringCloudLearning  
  11.           search-paths: chapter6/springcloud-config  
  12.           username:   
  13.           password:   
  14.   rabbitmq:  
  15.     host: 217.0.01  
  16.     port: 5672  
  17.     username:   
  18.     password:   
  19. management:  
  20.   endpoints:  
  21.     web:  
  22.       exposure:  
  23.         include: "*"  
  24. eureka:  
  25.   client:  
  26.     service-url:  
  27.       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。

Java代码  收藏代码
  1. curl -X POST http://localhost:8081/actuator/bus-refresh  

 

执行完成后,依次访问两个客户端,返回:hello im dev update。说明三个客户端均已经拿到了最新配置文件的信息,这样我们就实现了上图中的示例。

1
0
分享到:
评论

相关推荐

    SpringCloud之八 消息总线SpringCloudBus.pdf

    Spring Cloud Bus正是这样一种工具,它利用轻量级的消息代理来连接分布式系统中的节点,实现了配置更改的广播功能以及服务之间的通信。本文详细介绍了Spring Cloud Bus的架构原理和使用方法。 首先,Spring Cloud ...

    SpringCloud——消息总线(Bus)

    在微服务架构中,Spring Cloud Bus 是一个非常重要的组件,它起到了消息总线的作用,能够有效地连接各个微服务节点,并且结合轻量级的消息代理,如 RabbitMQ 或 Kafka,实现跨服务的通信和同步更新。下面我们将深入...

    08Spring Cloud Bus:消息总线1

    Spring Cloud Bus 是一个重要的组件,它在微服务架构中起到了消息总线的作用,允许服务间的通信和状态更新的广播。消息总线的概念是基于轻量级的消息代理,如 RabbitMQ 或 Kafka,它允许将消息从一个服务传递到所有...

    spring cloud config、bus源码

    在 Spring Cloud Config/Bus 中,Bus 是一个事件总线,负责传输配置事件。在 Bus 中,事件是通过 AMQP 协议传输的。Bus 事件可以是配置文件的变化、添加或删除等。 五、结论 本文对 Spring Cloud Config/Bus 的...

    Spring Cloud之一 Spring Cloud简介

    2. Spring Cloud Bus:用于在分布式系统中传播状态变化(比如配置文件的修改)的事件总线,可以与Spring Cloud Config配合使用,实现配置的热更新。 3. Spring Cloud Netflix:集成了Netflix提供的多个组件,例如:...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    6. **Spring Cloud Bus**: 控制总线,用于广播事件到所有的服务实例,例如配置更新。它通常与 Spring Cloud Config 结合使用,实现在运行时的配置更新。 7. **Ribbon**: Ribbon 是一个客户端负载均衡器,它提供了...

    尚硅谷SpringCloud第2季2020版.mmap

    SpringCloud Bus 消息总线 SpringCloud Stream 消息驱动 SpringCloud Sleuth 分布式请求链路跟踪 SpringCloud Alibaba入门简介 SpringCloud Alibaba Nacos 服务注册和配置中心 SpringCloud Alibaba Sentinel ...

    SpringCloud项目源码下载.docx

    5. **消息总线**:通过Spring Cloud Bus实现消息的广播机制,可以用于实时更新配置。 6. **API Gateway**:通过Zuul实现服务路由。 7. **分布式跟踪**:通过Sleuth和Zipkin实现请求的追踪和监控。 ### Spring Cloud...

    SpringCloud 15个完整例子

    6. **Spring Cloud Bus**:Bus是一个事件、消息总线,常用于配置更改的广播,可以与Config结合,实现配置的实时刷新。 7. **Spring Cloud Gateway**:Spring Cloud的最新版本中,Zuul已被Gateway取代,Gateway提供...

    基于spring cloud项目源码源码.rar

    6. Spring Cloud Bus:事件、消息总线,用于在微服务间传播状态变化。 7. Spring Cloud Gateway:Spring Cloud的新一代API网关,替代了Zuul,提供了更强大和灵活的路由功能。 三、关键组件解析 1. Eureka源码:研究...

    spring cloud视频教程

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具包,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    SpringCloud基本框架+完整示例工程.rar

    6. **SpringCloud Bus**:消息总线,通常结合Config一起使用,当配置发生改变时,通过消息驱动的方式通知各个服务实例进行配置的同步更新。 7. **SpringCloud Gateway**:相较于Zuul,SpringCloud Gateway是更现代...

    springcloud视频

    6. **Spring Cloud Bus**:事件、消息总线,可用于广播配置更改或同步服务状态。 7. **Spring Cloud Data Flow**:数据流处理工具,用于构建、部署和管理数据流任务。 8. **Spring Cloud Gateway**:新一代API网关,...

    尚硅谷周阳老师SpringCloud笔记

    最后,SpringCloud Bus可以看作是一个事件、消息总线,它常被用来刷新配置或者广播其他事件。开发者需要学习如何利用SpringCloud Bus实现配置的动态更新。 除此之外,尚硅谷周阳老师的笔记可能还涵盖了SpringCloud ...

    springCloud_dataservice_bus.zip

    SpringCloud Alibaba的Data Bus模块,就是基于RabbitMQ或者RocketMQ实现的一种轻量级消息总线,它使得微服务之间的数据变更可以实时广播到其他服务,从而实现数据的一致性。 三、Data Bus的实现原理 Data Bus的...

    SpringCloud基础教程

    7. **Spring Cloud Bus**:用于在集群中传播事件,比如更新配置信息,可以通过消息总线实时推送到各个微服务实例。 在学习SpringCloud的过程中,你需要理解这些组件的作用,以及它们如何协同工作。配合SpringCloud....

    Spring和SpringCloud视频

    SpringCloud作为微服务解决方案的集大成者,为基于SpringBoot的应用提供了构建分布式系统所需的工具,如服务发现、配置管理、断路器、智能路由、微代理、控制总线等。它使得开发者能够轻松地在SpringBoot应用中实现...

    springCloud项目练习

    第八课: 消息总线(Spring Cloud Bus) 第九课: 服务链路追踪(Spring Cloud Sleuth) 第十课: 高可用的服务注册中心 第十一课:docker部署spring cloud项目 第十二课: 断路器监控(Hystrix Dashboard) 第十三课: ...

    自己手动搭建的Springcloud

    Springcloud是Java领域一款强大的微服务治理框架,它基于Spring Boot进行快速构建,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...

    spring cloud尚硅谷 百度云.rar

    7. **Spring Cloud Bus**:事件、消息总线。用于广播配置更改,或者实现服务间的通信。 此外,教程可能还会涉及Spring Cloud Data Flow(数据流处理)、Spring Cloud Stream(消息驱动的微服务间通信)以及Spring ...

Global site tag (gtag.js) - Google Analytics