目录

  • `bus` 简介
  • `bus` 工作架构
  • `bus` 消息总线的实现
    • `config` 配置中心服务端
      • `Maven` 添加依赖
      • `application.properties` 配置文件
    • `config` 配置中心客户端
      • `Maven` 添加依赖
      • 远程 `git` 仓库配置文件
        • `eureka-client-consumer`
        • `eureka-client-producer`
    • 添加 `@RefreshScope` 注解
    • `/bus-refresh` 接口
    • 测试
      • 测试一
      • 测试二
      • 测试三

bus 简介

从 上一篇 文章可以得知 config client 服务从 config server 端获取自己对应的配置文件,但是目前的问题是:当远程 git 仓库配置文件发生改变时,每次都是需要重启 config client 服务,如果有上百上千个微服务呢? 我想我们不会一个个去重启每个微服务,也就是说如何让 config server 端通知到 config client?config client 端如何感知到配置发生更新?

这时候就该 bus 上场了,使用 springcloud bus(国人很形象的翻译为消息总线)可以完美解决这一问题

bus 工作架构

大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了 MQ 的广播机制在分布式的系统中传播消息,目前常用的有 KafkaRabbitMQ 。利用 bus 的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述 bus 在配置中心使用的机制

  • 提交配置触发 post 请求给 server 端的 bus/refresh 接口
  • server 端接收到请求并发送给 springcloud bus 总线
  • springcloud bus 接到消息并通知给其它连接到总线的客户端
  • 其它客户端接收到通知,请求 server 端获取最新配置
  • 全部客户端均获取到最新的配置

它的特点:config 配置中心 server 端承担起配置刷新的职责

bus 消息总线的实现

项目结构依然使用上一篇的,如下

config 配置中心服务端

Maven 添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

application.properties 配置文件

完整配置如下,主要增加了 rabbitmq 的配置与健康检查

server.port=8070#注册进eureka的名称
spring.application.name=eureka-client-configeureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true#gitee的仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/chaojiangcj/springcloud-learn-config.git
spring.cloud.config.server.git.username=你的用户名
spring.cloud.config.server.git.password=你的密码
#配置仓库需要找的文件路径
spring.cloud.config.server.git.search-paths=eureka-client-*spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest#健康检查
management.endpoints.web.exposure.include=*

config 配置中心客户端

Maven 添加依赖

eureka-client-consumer,eureka-client-producer 两个项目都要引入

<!--springcloud bus消息总线-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--使用springboot的健康检查-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

远程 git 仓库配置文件

eureka-client-consumer

完整配置如下,增加了 rabbitmq 的配置

spring.profiles.active=devserver.port=8090#注册进eureka的名称
spring.application.name=eureka-client-consumereureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=true#Feign默认整合了Hystrix,要想为Feign打开Hystrix支持,需要此项设置
#在springcloud Dalston之前的版本中,Feign默认开启Hystrix支持,无需设置feign.hystrix.enabled=true
#从springcloud Dalston版本开始,Feign的Hystrix支持默认关闭,需要手动设置开启
feign.hystrix.enabled=true#配ribbon的超时时间,默认二者都是1000
#ribbon.ConnectTimeout=2000
#ribbon.ReadTimeout=2000#第一次启动时,请求接口查询数据库有点耗时,会进入降级策略,所以将hystrix的超时时间设置为3s,默认是1s,这是全局设置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest#自定义配置,用于测试
congfig.version=config-version 1.0

eureka-client-producer

完整配置如下,增加了 rabbitmq 的配置

server.port=8080#注册进eureka的名称
spring.application.name=eureka-client-producer#JDBC 配置
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/shiro?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource#druid 连接池配置
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
spring.datasource.druid.max-wait=60000#指定 mapper 文件路径
mybatis.mapper-locations=classpath:org/example/mapper/*.xml
mybatis.configuration.cache-enabled=true
#开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
#打印 SQL 语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpleureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/
eureka.instance.prefer-ip-address=truespring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

添加 @RefreshScope 注解

该注解我们添加在 eureka-client-consumer 项目的 controller 层,增加了一个测试接口,如下

@RefreshScope
@Slf4j
@Controller
@RequestMapping(path = "/UserConsumer")
public class UserConsumerController {@Autowiredprivate UserConsumerService userConsumerService;@Value(value = "${congfig.version}")private String configVersion;/*** ribbon 实现负载均衡*/@GetMapping(path = "/findOneById")@ResponseBodypublic ResultVo findOneById(Integer id) {return userConsumerService.findOneById(id);}/*** feign 进行远程调用*/@GetMapping(path = "/queryOneById")@ResponseBodypublic ResultVo queryOneById(@RequestParam(name = "id") Integer id) {return userConsumerService.queryOneById(id);}/*** 测试springcloud bus获取配置*/@GetMapping(path = "/getConfigVersion")@ResponseBodypublic String getConfigVersion() {log.info("configVersion的值为:" + configVersion);return configVersion;}
}
  • 自动刷新只能刷新 @RefreshScope 注解下的配置,一些特殊配置,如数据库等,需要同样先设置数据库链接 ConfigServer 类,然后通过加 @RefreshScope 注解方式自动刷新

/bus-refresh 接口

要实现配置自动刷新,需要调用 /bus-refresh 接口通知 config server 端,有两种方式

  • 手动调用(post 请求):http://ip:port/actuator/bus-refreshconfig server 端地址)
  • 配置 gitwebhook,当 git 端配置发生改变,自动调用 /bus-refresh 接口

测试

分别启动 rabbitmqeureka-client-consumereureka-client-producereureka-client-config 以及 eureka 的服务端项目

测试一

启动上述服务之后,首先来请求接口 http://127.0.0.1:8090/UserConsumer/getConfigVersion 获取这个变量

测试二

修改变量如下


再次请求接口 http://127.0.0.1:8090/UserConsumer/getConfigVersion 获取这个变量,如下

测试三

  • 首先请求接口 http://127.0.0.1:8070/actuator/bus-refreshconfig 服务端的 ip,port),注意是 post 请求方式。它什么都没有返回

  • 这里看看请求 http://127.0.0.1:8070/actuator 接口,它返回了健康监控的一些信息,如下

  • 再一次请求接口 http://127.0.0.1:8090/UserConsumer/getConfigVersion 获取这个变量,如下

  • 同时,看 rabbitmq 的管理页面,创建的交换机如下


创建的队列如下

springcloud之bus消息总线相关推荐

  1. springcloud 之 bus 消息总线

    在分布式系统中,我们通常使用轻量级消息代理(rabbitmq.kafuka)建立一个公共的主题,让所有的微服务都链接进来,并且监听消费这个主题的内容,我们就称这个主题是 消息总线. (可以用作配置文件 ...

  2. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

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

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

  4. 【SpringCloud框架之Bus消息总线】

    本笔记内容为尚硅谷SpringCloud框架开发Bus消息总线部分 目录 一.概述 1.Bus消息总线是什么 2.作用 3.为何被称为总线 二.RabbitMQ环境配置 三.SpringCloud B ...

  5. SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus

    1. 消息总线简介 消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费. 消息代理又是什么?消息代理是一个消息验证.传输.路由的架构模式,主 ...

  6. Bus消息总线如何实现

    我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的发送post请求, 我们能受的了吗?这比之前的没配置中心 ...

  7. 十七、Bus消息总线

    目录 1.Bus消息总线介绍: 2.使用消息总线实现配置自动更新 2.1.方案一架构图: 2.2.方案二架构图(常用) 3.对springcloud-config-server项目进行改造 3.1.修 ...

  8. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...

  9. Message Bus - 消息总线

    Message Bus - 消息总线 Liferay的*消息总线(Message Bus)*是一种服务级API,组件可以用它来发送和接收消息.它提供了消息生产者(producers)和消费者(cons ...

  10. SpringCloud Bus消息总线

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

最新文章

  1. vue Element-ui 表格自带筛选框自定义高度
  2. ISME:病原菌介导植物根际有益微生物群落组装
  3. 中科院张士峰:基于深度学习的通用物体检测算法对比探索
  4. Hosts文件实际应用 配置内部服务器提高访问效率和速度
  5. [翻译]XNA 3.0 Game Programming Recipes之twenty-one
  6. 利用javascript实现简体与繁体的转换
  7. Linux 运行进程实时监控pidstat命令详解
  8. Mac 实现可以在 Finder 下直接打开 iTerm2 并跳转到当前目录
  9. Matlab生成棋盘格点图
  10. springboot ---坑 tomcat部署springboot 一直运行不起来
  11. mac 安装nodejs_阿里开源——用于前端和nodejs的轻量级任务管理和构建工具Dawn
  12. 零基础到底适不适合转行前端?
  13. 05-用两个栈实现一个队列
  14. 十天征服单片机百度云_51单片机 郭天祥十天学会单片机教学视频
  15. 创建第一个Android app项目
  16. 程维任正非马化腾马云们在为柳传志呼唤什么?
  17. 来诈金花嘛?Python实现的那种
  18. 微观经济学之供给与需求--第一章第二章
  19. 前端显示和隐藏div的方法 / 判断
  20. manjaro 开机启动项_Re:从零开始的Manjaro配置

热门文章

  1. Spring Boot 2.0 从入门到精通 From Zero to Hero with Spring Boot - Brian Clozel
  2. AppStore图片尺寸以及内容要求Screenshot specifications
  3. php想做一个无刷新弹窗,php+ajax实现无刷新的新闻留言系统
  4. 兔子数列规律怎么讲_“完美的几何学者,以斐波那契数列分割战场。”你是否能答出诸葛亮黄金分割率台词里暗藏问题的答案!...
  5. 南卫理公会大学 计算机排名,2020年南卫理公会大学Times世界排名
  6. c语言山东科技大学答案oj,山东科技大学oj部分题目记答案.doc
  7. Android studio 报错 Unknown host 'jcenter.bintray.com'
  8. antd vue form 手动校验_vue测试模板与jsonSchema自动生成elment组件
  9. 动态规划 分享巧克力 4794_包装|颇具艺术欣赏性的巧克力创意包装设计
  10. Cmdbuilding搭建简易流程及问题处理