`
公园美丽
  • 浏览: 11985 次
社区版块
存档分类
最新评论

SpringCloud:Spring Cloud Bus 消息总线

 
阅读更多

 

1. Spring Cloud Bus

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。

(了解源码可+求求: 1791743380)

大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了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. 项目示例

我们使用上一篇文章中的config-server和config-client来进行改造,mq使用rabbitmq来做示例。

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。说明三个客户端均已经拿到了最新配置文件的信息,这样我们就实现了上图中的示例。

分享到:
评论

相关推荐

    SpringCloud之八 消息总线SpringCloudBus.pdf

    SpringCloud之八 消息总线SpringCloudBus.pdf,微服务中消息总线的使用处理

    08Spring Cloud Bus:消息总线1

    08Spring Cloud Bus:消息总线1

    SpringCloud——消息总线(Bus)

    SpringCloud——消息总线(Bus)之Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。

    尚硅谷SpringCloud第2季2020版.mmap

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

    Spring Cloud.docx

    spring-cloud-eureka Spring Cloud(一)服务的注册与发现(Eureka) spring-cloud-consul ...Spring Cloud(二) ...Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    springCloud项目练习

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

    Java Spring Cloud面试题

    * Spring Cloud Bus:提供了基于消息总线的解决方案 * Spring Cloud Consul:提供了基于Consul的服务发现和配置中心解决方案 * Spring Cloud Security:提供了基于Spring Security的安全解决方案 * Spring Cloud ...

    springcloud微服务框架+服务模版

    spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...

    spring-cloud使用的各种示例

    - [springcloud(九):配置中心和消息总线(配置中心终结版)](http://www.ityouknow.com/springcloud/2017/05/26/springcloud-config-eureka-bus.html) - [springcloud(十):服务网关zuul]...

    SpringCloud教程

    史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus) 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth) 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心 史上...

    spring-cloud-bus:Spring Cloud事件总线

    spring-cloud-bus:Spring Cloud事件总线

    10Spring Cloud Consul:服务治理与配置中心1

    5. 控制总线:Spring Cloud Consul 支持控制总线,可以在整个微服务系统中通过 Control Bus 分发事件消息。控制总线可以实现微服务之间的事件驱动式集成。 使用 Consul 作为注册中心: 1. 安装并运行 Consul:首先...

    spring-cloud-examples

    spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...

    SpringCloud:SpringCloud学习

    SpringCloud SpringCloud学习 ...3、服务消费者(rest+ribbon) 4、服务消费者(Feign) 5、断路器(Hystrix) ...9、消息总线(Spring Cloud Bus) 10、服务链路追踪(Spring Cloud Sleuth) 12、服务注册Consul

    spring cloud快速入门.docx

    Spring Cloud是一站式微服务架构的解决方案,Spring Cloud是若干技术的集合,包括spring cloud config/bus/..等20多种子项目构成。Spring Cloud提供服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪等领域...

    java8rt.jar源码-SpringCloud:学习SpringCloud

    服务总线:Bus(已停更)/Nacos ... SpringCloud:分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。 微服务一般分为无业务基础服务(如全局配置、ID自增器、短链接服务、文件...

    积分管理系统java源码-SpringCloud-Learning:SpringCloud-Learning

    Bus:事件、消息总线,用于传播集群中的状态变化或事件 Spring Cloud Consul:服务发现与配置管理工具 Spring Cloud Stream:通过简单的声明式模型来发送和接收消息,整合了Rabbit和Kafka Spring Cloud Security:...

    59道SpringCloud面试题详解含答案(值得珍藏)

    Spring Cloud是基于Spring Boot提供的一套微服务解决方案,包括服务...Spring Cloud还提供了一系列的子项目和工具,如Spring Cloud Bus(事件/消息总线)、Spring Cloud Security(基于springsecurity的安全工具包)

    SpringCloud之消息总线Spring Cloud Bus实例代码

    主要介绍了SpringCloud之消息总线Spring Cloud Bus实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SpringCloud思维导图

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

Global site tag (gtag.js) - Google Analytics