前面的话】书接上文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的相关配置
  1. 修改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
  1. 修改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之消息总线相关推荐

  1. SpringCloud教程-消息总线Bus 客户端(client)刷新(SpringCloud版本Greenwich.SR4)

    文章目录 消息总线(Bus)介绍 项目示例 config-client-bus 代码地址:github-spring-cloud地址 前言:前面文章讲了Spring Cloud Config配置中心如 ...

  2. SpringCloud Bus消息总线

    目录 是什么? 如何使用? Docker安装RabbitMQ SpringCloud Bus动态刷新全局广播 SpringCloud Bus动态刷新定点通知 是什么? SpringCloud Bus是 ...

  3. SpringCloud Config配置中心、SpringCloud Bus消息总线

    一.SpringCloud Config 1.前言 微服务意味着要将单体应用中的业务拆分成一个个子服务, 每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行, ...

  4. SpringCloud教程-消息总线Bus 服务端(server)刷新(SpringCloud版本Greenwich.SR4)

    文章目录 项目示例 config-server-bug 代码地址:github-spring-cloud地址 前言:本篇文章在上一篇文章基础上进行修改,因为虽然我们做到了利用一个消息总线触发刷新,而刷 ...

  5. SpringCloud之消息总线组件及微服务网关

    消息总线组件 Spring Cloud Bus 单个工程更新 有了配置中心,我们就可以吧配置文件放到git上来统一管理了,但是如果配置文件发生了变化,客户端 又如何更新呢? 1.在配置文件中增加自定义 ...

  6. SpringCloud(十一)Bus消息总线、Stream消息驱动

    一.Bus消息总线 需求:分布式自动刷新配置功能: 解决:SpringCloud Bus配合Spring cloud Config使用可以实现配置的动态刷新. 1.概述 定义:Spring Cloud ...

  7. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...

  8. 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    首先:欢迎各位学习java和大数据的程序员朋友们加入Java交流学习群: 721506929,群内提供免费的架构学习资料,有需要的朋友可以进群来学习. https://www.fangzhipeng. ...

  9. 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)

    转:https://blog.csdn.net/forezp/article/details/70148235 Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播 ...

最新文章

  1. Bug 是一门艺术 | 每日趣闻
  2. Codeforces Round #171 (Div. 2)
  3. 雷军:小米逐梦之旅的三大秘诀
  4. mysql的一些函数
  5. 与java线程有关的,线程多少和什么有关?大神们表示有话要说!
  6. 马云下死命令留人?阿里辟谣:不会高薪聘请黑掉阿里网站的人
  7. Linux在线安装Mysql数据库(Linux)
  8. Mysql学习总结(35)——Mysql两千万数据优化及迁移
  9. SQLite指南(4) - FAQ列表(important)
  10. javamail发送邮件,解决被垃圾邮件问题
  11. 5怎么用修改器_经常用电脑辐射大怎么办?这5个习惯防辐射,很多人都知道
  12. Spring Mvc前台访问报404
  13. avformat_open_input 支持的参数
  14. SSH框架的工作原理
  15. Python爬虫16-Scrapy爬取阳光政务平台信息
  16. 听说想当黑客的都玩过这个Monyer游戏
  17. 做嵌入式开发经历(三).绝知此事要躬行
  18. 计算机数值中的乘法除法原理
  19. java基础 day14数据安全,银行账户取款例子,synchronized()使用、面试题,死锁,线程安全
  20. XAML与XML的区别

热门文章

  1. 【原创】利用xbrowser进行远程连接
  2. Kinect v2.0原理介绍之八:高清面部帧(1) FACS 介绍
  3. 功能安全产品开发初始分析 | 功能分析
  4. XXE(XML外部实体注入)详解
  5. Jmeter访问需要登录的接口如何处理
  6. Storm的WordCount案例(spout bolt详细总结)
  7. 智能高低配电柜无线联网解决方案
  8. 【攻略】前端特工 - 腾讯CodeStar代码星计划
  9. java计算机毕业设计在线水果超市源码+系统+mysql数据库+lw文档
  10. 功能测试的用例测试方法