SpringCloud之消息总线
【前面的话】书接上文SpringCloud之Config,如果没有看过可以先移步去看一下。在上一篇文章中提到了配置刷新的问题,如果需要刷新配置就需要客户端执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了。使用Spring Cloud Bus可以完美解决这一问题。
壹、Spring Cloud Bus的简介
Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。
贰、解决方案
方案一:
- Spring cloud bus被国内很多都翻译为消息总线,也挺形象的。大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。
根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:
1、提交代码触发post给客户端A发送/actuator/bus-refresh2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus3、Spring Cloud bus接到消息并通知给其它客户端4、其它客户端接收到通知,请求Server端获取最新配置5、全部客户端均获取到最新的配置
方案二:
- 在方案一中我们已经到达了利用消息总线触发一个客户端/actuator/bus-refresh,而刷新所有客户端的配置的目的。但这种方式并不优雅。原因如下:
打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。破坏了微服务各节点的对等性。有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就不得不修改WebHook的配置。
因此我们将方案一的架构模式稍微改变一下
这时Spring Cloud Bus做配置更新步骤如下:
1、提交代码触发post请求给bus/refresh2、server端接收到请求并发送给Spring Cloud Bus3、Spring Cloud bus接到消息并通知给其它客户端4、其它客户端接收到通知,请求Server端获取最新配置5、全部客户端均获取到最新的配置
下面我们就采用方案二来改造我们的工程,这样的话我们在server端的代码做一些改动,来支持bus/refresh
叁、改造服务端
- 改造上文的config的服务端子工程lovin-config-server,添加RabbitMQ的依赖。下面是改造后的主要的pom依赖:
<parent><artifactId>lovincloud</artifactId><groupId>com.eelve.lovincloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lovin-config-server</artifactId><packaging>jar</packaging><name>lovinconfigserver</name><version>0.0.1</version><description>配置服务端</description><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.1.6</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
- 添加rabbitmq的连接配置
server:port: 8886 # 服务端口号
spring:application:name: lovinconfigserver # 服务名称security:basic:enabled: trueuser:name: lovinpassword: ${REGISTRY_SERVER_PASSWORD:lovin}cloud:config:server:git:uri: https://github.com/lovinstudio/lovincloudsearch-paths: lovin-config-repolabel: masterrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest
eureka:client:serviceUrl:defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注册到的eureka服务地址
肆、改造配置客户端
- 改造上文的config的服务端子工程lovin-config-client,添加RabbitMQ的依赖。下面是改造后的主要的pom依赖:
<parent><artifactId>lovincloud</artifactId><groupId>com.eelve.lovincloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>lovin-config-client</artifactId><packaging>jar</packaging><name>lovinconfigclient</name><version>0.0.1</version><description>配置消费端</description><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.1.6</version></dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-config-server</artifactId>-->
<!-- </dependency>--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId><version>2.1.3.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
- 添加连接rabbitmq的相关配置
- 修改bootstrap.yml添加连接rabbitmq的配置
server:port: 8807 # 服务端口号
spring:application:name: lovinconfigclient # 服务名称security:basic:enabled: trueuser:name: lovinpassword: ${REGISTRY_SERVER_PASSWORD:lovin}
#eureka:
# client:
# serviceUrl:
# defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注册到的eureka服务地址rabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest
- 修改application.yml开启消息跟踪
spring:cloud:config:name: lovin-configprofile: dev#uri: http://localhost:8886/#label: masterdiscovery:enabled: trueservice-id: lovinconfigserverbus:trace:enabled: true
eureka:client:serviceUrl:defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注意在高可用的时候需要见注册中心配置移到该文件中,在application.yml中见会读取不到配置
伍、启动测试
- 1.首先依次启动lovin-eureka-server、lovin-econfig-server、lovin-econfig-client
- 2.查看lovin-econfig-server查询配置
- 3.查看lovin-econfig-client查询配置
- 4.修改配置,并提交见token的值由lovin改为lovinupdate
- 5.再次查看lovin-econfig-server查询配置
- 6.再次查看lovin-econfig-client查询配置
- 7.刷新消息总线
由于api变更,url由老版本的/bus/refresh变为actuator/bus-refresh
- 8.再次查看lovin-econfig-client查询配置
我们可以看到已经刷新成功,至此消息总线配置已经完成
陆、局部刷新
某些场景下(例如灰度发布),我们可能只想刷新部分微服务的配置,此时可通过/actuator/bus-refresh端点的destination参数来定位要刷新的应用程序。
- 例如:/actuator/bus-refresh?destination=customers:8000,这样消息总线上的微服务实例就会根据destination参数的值来判断是否需要要刷新。其中,customers:8000指的是各个微服务的ApplicationContext ID。destination参数也可以用来定位特定的微服务。
- 例如:/actuator/bus-refresh?destination=customers:**,这样就可以触发customers微服务所有实例的配置刷新。
- 最后的最后是本博客的源码,欢迎关注这一套SpringCloud的实践
SpringCloud之消息总线相关推荐
- SpringCloud教程-消息总线Bus 客户端(client)刷新(SpringCloud版本Greenwich.SR4)
文章目录 消息总线(Bus)介绍 项目示例 config-client-bus 代码地址:github-spring-cloud地址 前言:前面文章讲了Spring Cloud Config配置中心如 ...
- SpringCloud Bus消息总线
目录 是什么? 如何使用? Docker安装RabbitMQ SpringCloud Bus动态刷新全局广播 SpringCloud Bus动态刷新定点通知 是什么? SpringCloud Bus是 ...
- SpringCloud Config配置中心、SpringCloud Bus消息总线
一.SpringCloud Config 1.前言 微服务意味着要将单体应用中的业务拆分成一个个子服务, 每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行, ...
- SpringCloud教程-消息总线Bus 服务端(server)刷新(SpringCloud版本Greenwich.SR4)
文章目录 项目示例 config-server-bug 代码地址:github-spring-cloud地址 前言:本篇文章在上一篇文章基础上进行修改,因为虽然我们做到了利用一个消息总线触发刷新,而刷 ...
- SpringCloud之消息总线组件及微服务网关
消息总线组件 Spring Cloud Bus 单个工程更新 有了配置中心,我们就可以吧配置文件放到git上来统一管理了,但是如果配置文件发生了变化,客户端 又如何更新呢? 1.在配置文件中增加自定义 ...
- SpringCloud(十一)Bus消息总线、Stream消息驱动
一.Bus消息总线 需求:分布式自动刷新配置功能: 解决:SpringCloud Bus配合Spring cloud Config使用可以实现配置的动态刷新. 1.概述 定义:Spring Cloud ...
- 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...
- 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
首先:欢迎各位学习java和大数据的程序员朋友们加入Java交流学习群: 721506929,群内提供免费的架构学习资料,有需要的朋友可以进群来学习. https://www.fangzhipeng. ...
- 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)
转:https://blog.csdn.net/forezp/article/details/70148235 Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播 ...
最新文章
- Bug 是一门艺术 | 每日趣闻
- Codeforces Round #171 (Div. 2)
- 雷军:小米逐梦之旅的三大秘诀
- mysql的一些函数
- 与java线程有关的,线程多少和什么有关?大神们表示有话要说!
- 马云下死命令留人?阿里辟谣:不会高薪聘请黑掉阿里网站的人
- Linux在线安装Mysql数据库(Linux)
- Mysql学习总结(35)——Mysql两千万数据优化及迁移
- SQLite指南(4) - FAQ列表(important)
- javamail发送邮件,解决被垃圾邮件问题
- 5怎么用修改器_经常用电脑辐射大怎么办?这5个习惯防辐射,很多人都知道
- Spring Mvc前台访问报404
- avformat_open_input 支持的参数
- SSH框架的工作原理
- Python爬虫16-Scrapy爬取阳光政务平台信息
- 听说想当黑客的都玩过这个Monyer游戏
- 做嵌入式开发经历(三).绝知此事要躬行
- 计算机数值中的乘法除法原理
- java基础 day14数据安全,银行账户取款例子,synchronized()使用、面试题,死锁,线程安全
- XAML与XML的区别