springcloud之bus消息总线
目录
- `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
的广播机制在分布式的系统中传播消息,目前常用的有 Kafka
和 RabbitMQ
。利用 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-refresh
(config server
端地址) - 配置
git
的webhook
,当git
端配置发生改变,自动调用/bus-refresh
接口
测试
分别启动 rabbitmq
,eureka-client-consumer
,eureka-client-producer
,eureka-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-refresh
(config
服务端的ip,port
),注意是post
请求方式。它什么都没有返回
- 这里看看请求
http://127.0.0.1:8070/actuator
接口,它返回了健康监控的一些信息,如下
- 再一次请求接口
http://127.0.0.1:8090/UserConsumer/getConfigVersion
获取这个变量,如下
- 同时,看
rabbitmq
的管理页面,创建的交换机如下
创建的队列如下
springcloud之bus消息总线相关推荐
- springcloud 之 bus 消息总线
在分布式系统中,我们通常使用轻量级消息代理(rabbitmq.kafuka)建立一个公共的主题,让所有的微服务都链接进来,并且监听消费这个主题的内容,我们就称这个主题是 消息总线. (可以用作配置文件 ...
- SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪
Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...
- SpringCloud(十一)Bus消息总线、Stream消息驱动
一.Bus消息总线 需求:分布式自动刷新配置功能: 解决:SpringCloud Bus配合Spring cloud Config使用可以实现配置的动态刷新. 1.概述 定义:Spring Cloud ...
- 【SpringCloud框架之Bus消息总线】
本笔记内容为尚硅谷SpringCloud框架开发Bus消息总线部分 目录 一.概述 1.Bus消息总线是什么 2.作用 3.为何被称为总线 二.RabbitMQ环境配置 三.SpringCloud B ...
- SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus
1. 消息总线简介 消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费. 消息代理又是什么?消息代理是一个消息验证.传输.路由的架构模式,主 ...
- Bus消息总线如何实现
我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的发送post请求, 我们能受的了吗?这比之前的没配置中心 ...
- 十七、Bus消息总线
目录 1.Bus消息总线介绍: 2.使用消息总线实现配置自动更新 2.1.方案一架构图: 2.2.方案二架构图(常用) 3.对springcloud-config-server项目进行改造 3.1.修 ...
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...
- Message Bus - 消息总线
Message Bus - 消息总线 Liferay的*消息总线(Message Bus)*是一种服务级API,组件可以用它来发送和接收消息.它提供了消息生产者(producers)和消费者(cons ...
- SpringCloud Bus消息总线
目录 是什么? 如何使用? Docker安装RabbitMQ SpringCloud Bus动态刷新全局广播 SpringCloud Bus动态刷新定点通知 是什么? SpringCloud Bus是 ...
最新文章
- vue Element-ui 表格自带筛选框自定义高度
- ISME:病原菌介导植物根际有益微生物群落组装
- 中科院张士峰:基于深度学习的通用物体检测算法对比探索
- Hosts文件实际应用 配置内部服务器提高访问效率和速度
- [翻译]XNA 3.0 Game Programming Recipes之twenty-one
- 利用javascript实现简体与繁体的转换
- Linux 运行进程实时监控pidstat命令详解
- Mac 实现可以在 Finder 下直接打开 iTerm2 并跳转到当前目录
- Matlab生成棋盘格点图
- springboot ---坑 tomcat部署springboot 一直运行不起来
- mac 安装nodejs_阿里开源——用于前端和nodejs的轻量级任务管理和构建工具Dawn
- 零基础到底适不适合转行前端?
- 05-用两个栈实现一个队列
- 十天征服单片机百度云_51单片机 郭天祥十天学会单片机教学视频
- 创建第一个Android app项目
- 程维任正非马化腾马云们在为柳传志呼唤什么?
- 来诈金花嘛?Python实现的那种
- 微观经济学之供给与需求--第一章第二章
- 前端显示和隐藏div的方法 / 判断
- manjaro 开机启动项_Re:从零开始的Manjaro配置
热门文章
- Spring Boot 2.0 从入门到精通 From Zero to Hero with Spring Boot - Brian Clozel
- AppStore图片尺寸以及内容要求Screenshot specifications
- php想做一个无刷新弹窗,php+ajax实现无刷新的新闻留言系统
- 兔子数列规律怎么讲_“完美的几何学者,以斐波那契数列分割战场。”你是否能答出诸葛亮黄金分割率台词里暗藏问题的答案!...
- 南卫理公会大学 计算机排名,2020年南卫理公会大学Times世界排名
- c语言山东科技大学答案oj,山东科技大学oj部分题目记答案.doc
- Android studio 报错 Unknown host 'jcenter.bintray.com'
- antd vue form 手动校验_vue测试模板与jsonSchema自动生成elment组件
- 动态规划 分享巧克力 4794_包装|颇具艺术欣赏性的巧克力创意包装设计
- Cmdbuilding搭建简易流程及问题处理