Spring Cloud第十二篇 | 消息总线Bus
本文是Spring Cloud专栏的第十二篇文章,了解前十一篇文章内容有助于更好的理解本文:
一、前言
由于在没有使用消息总线的时候,我们如果需要修改某个配置,如果涉及修改的微服务节点比较多,我们需要手动的一个节点一个节点的刷新非常麻烦,在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。在总线上的各个实例都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息,例如配置信息的变更或者其他一些管理操作等。
由于消息总线在微服务架构系统中被广泛使用,所以它同配置中心一样,几乎是微服务架构中的必备组件。Spring Cloud作为微服务架构综合性的解决方案,对此自然也有自己的实现,通过使用Spring Cloud Bus可以非常容易地搭建起消息总线,同时实现了一些消息总线中的常用功能,比如配合Spring Cloud Config实现微服务应用配置信息的动态更新等,架构如图所示:
目前版本,Spring Cloud Bus仅支持两款中间件产品,RabbitMQ和Kafka,本案例使用RabbitMQ实现Spring Cloud Bus的应用
RabbitMQ安装步骤以及使用自行百度啦。。。
二、整合消息总线bus
1、修改以前的springcloud-config-server,springcloud-config-client块添加消息总线依赖,actuator依赖在前几篇案例中已经在父模块(springcloud-learn)中引入,此处不需要再次引入
<!--spring cloud bus 整合rabbitmq -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2、rabbitmq服务地址:http://47.112.11.147:15672/ rabbitmq用户名为:admin密码为:123456
3、在springcloud-config-server模块基础上往application.yml添加bus和rabbitmq的相关配置以及暴露bus-refresh端点
spring:
cloud:
bus:
#控制bus消息总线是否能用
enabled: true
#打开bus追踪
trace:
enabled: true
rabbitmq:
addresses: 47.112.11.147
port: 5672
username: admin
password: 123456
virtual-host: /
management:
endpoints:
web:
exposure:
include: ["info","health","bus-refresh"]
4、在springcloud-config-client模块基础上往application.yml添加rabbitmq相关配置就行了
spring:
rabbitmq:
addresses: 47.112.11.147
port: 5672
username: admin
password: 123456
virtual-host: /
5、启动配置中心服务端(springcloud-config-server)查看bus相应的转换器Exchange以及Type对应的topic,并且同时在控制台上通过日志可以看到bus-refresh端点暴露出来了
RabbitMQ的Topic模式如图所示:
如果不懂RabbitMQ的话也不影响你的Bus使用
查看rabbitmq控制台看到bus相应对列创建了
查看绑定关系,springcloud bus相应对列已经绑定到了springcloud bus转换器上了
6、启动配置中心客户端(springcloud-config-client)可以看到该对列也绑定到spirngcloud bus转换器上了
7、我们在复制springcloud-config-client的配置,新建文件bootstrap-configclient8882.yml配置文件如下,创键启动类启动SpringcloudConfigClient8882Application
server:
port: 8882
spring:
application:
name: springcloud-config-client
cloud:
config:
#uri则表示配置中心的地址
#uri: http://localhost:8888
#注:config 客户端在没有 spring.cloud.config.name属性的时候,服务端{application} 获取的是客户端
#spring.application.name的值,否则,获取的是 spring.cloud.config.name的值。
#1)、当没有spring.cloud.config.name时,客户端获取的是spring.application.name 所对应的git库中的文件,并且只能
#获取一个文件,
#2)、当一个项目中有需求要获取多个文件时,就需要用到spring.cloud.config.name这个属性,以逗号分割
name: configclient
profile: dev
#label对应了label部分
label: master
# username: coding-farmer
# password: 123456
discovery:
#表示开启通过服务名来访问config-server
enabled: true
#则表示config-server的服务名
service-id: springcloud-config-server
#失败快速响应
fail-fast: true
retry:
#配置重试次数,默认为6
max-attempts: 6
#初始重试间隔时间,默认1000ms
initial-interval: 1000
#间隔乘数,默认1.1
multiplier: 1.1
#最大间隔时间,默认2000ms
max-interval: 2000
rabbitmq:
addresses: 47.112.11.147
port: 5672
username: admin
password: 123456
virtual-host: /
eureka:
client:
service-url:
defaultZone: http://localhost:8700/eureka
#客户端每隔30秒从Eureka服务上更新一次服务信息
registry-fetch-interval-seconds: 30
#需要将我的服务注册到eureka上
register-with-eureka: true
#需要检索服务
fetch-registry: true
#心跳检测检测与续约时间
instance:
#告诉服务端,如果我10s之内没有给你发心跳,就代表我故障了,将我剔除掉,默认90s
#Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
lease-expiration-duration-in-seconds: 10
#每隔2s向服务端发送一次心跳,证明自已依然活着,默认30s
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
lease-renewal-interval-in-seconds: 2
# 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的
prefer-ip-address: true
# 实例名称 最后呈现地址:ip:2002
instance-id: ${spring.cloud.client.ip-address}:${server.port}
management:
endpoints:
web:
exposure:
include: ["info","health","refresh"]
8、码云仓库值默认如下
访问http://localhost:8881/index
访问http://localhost:8882/index
9、修改仓库内容
然后向springcloud-config-server服务bus-refresh端点发送POST请求http://localhost:8888/actuator/bus-refresh
10、再次访问客户端8881,882显示如下
三、指定刷新范围
在上面案例中我们看到当你触发/actuator/bus-refresh端点时,它就会刷新所有实例的服务配置,有时候我们可能只需要刷新某个具体的实例。
Spring Cloud Bus对这种场景也有很好的支持,/actuator/bus-refresh/{destination}接口提供了一个destination参数,RESTFUL风格请求,用来定位具体要刷新的应用程序。比如:我们可以请求/actuator/bus-refresh/springcloud-config-client:8882,此时总线上的各应用实例会根据destination属性的值来判断是否为自己的实例名,若符合才进行配置刷新,若不符合就忽略该消息。
destination参数除了可以定位具体的实例之外,还可以用来定位具体的服务。定位服务的原理是通过使用Spring的PathMatecher(路径匹配)来实现的,比如/actuator/bus-refresh/springcloud-config-client:**,该请求会触发customers服务的所有实例进行刷新。
1、以前仓库信息为:
例如:修改为如下
2、向http://localhost:8888/actuator/bus-refresh/springcloud-config-client:8882发送POST请求
3、访问客户端8881,8882服务内容如下
四、总结
使用/actuator/bus-refresh发送到我们其中一个config-client中也能刷新配置(前提是该客户端的bus-refresh端点需要暴露出来),但是这样这个实例就跟其他实例不一样了,它还额外承担了刷新配置的功能。所以,我们将发送post请求刷新配置的任务交由config-server配置服务中心来处理,这样所有服务实例都是对等的,由配置服务中心发送消息通知消息总线更新整个集群中的配置。这样,服务实例就不需要再承担触发配置更新的任务。尽可能让服务集群中的各个节点是对等的将来利于运维工作。
详细参考案例源码:https://gitee.com/coding-farmer/springcloud-learn
Spring Cloud第十二篇 | 消息总线Bus的更多相关文章
- Spring Cloud第十四篇 | Api网关Zuul
本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...
- Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】
Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版] 发表于 2018-04-24 | 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请 ...
- Spring Cloud(十二)声名式服务调用:Feign 的使用(下)
前言 本文是对上一篇博文的扩充,很多平时用不到的特性就开始简略一写,Spring Cloud各版本之间的差距很大的,用不到的可能下一个版本就被kill掉了.由于笔者写本文开始的时候误解了Feign的继 ...
- Spring-cloud微服务实战【十】:消息总线Bus
回忆一下,在上一篇文章中,我们使用了分布式配置中心config来管理所有微服务的配置文件,那这样有没有什么问题?有,那就是无法配置文件无法自动更新,当我的git服务器上的配置文件更新后,不能同步更 ...
- Spring Cloud(十):服务网关 Zuul(路由)【Finchley 版】
Spring Cloud(十):服务网关 Zuul(路由)[Finchley 版] 发表于 2018-04-23 | 更新于 2018-05-09 | 通过之前几篇 Spring Cloud 中 ...
- 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...
- Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
- Spring Cloud 入门 之 Ribbon 篇(二)
原文地址:Spring Cloud 入门 之 Ribbon 篇(二) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Cloud 入门 之 Eureka ...
- Spring Cloud 入门 之 Config 篇(六)
原文地址:Spring Cloud 入门 之 Config 篇(六) 博客地址:http://www.extlight.com 一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分 ...
随机推荐
- VASP计算参考
1.VASP 结构优化.静态自洽.非自洽计算:https://blog.csdn.net/kyang_823/article/details/59110848 2.VASP贋势:https://blo ...
- Python 2 和 3 的区别及兼容技巧
目录 目录 前言 Python 2 or 3 ? 不同与兼容 统一不等于语法 统一整数类型 统一整数除法 统一缩进语法 统一类定义 统一字符编码类型 统一导入模块的路径搜索方式 修正列表推导式的变量作 ...
- Java使用JDBC连接Hive
最近一段时间,处理过一个问题,那就是hive jdbc的连接问题,其实也不是大问题,就是url写的不对,导致无法连接.问题在于HiveServer2增加了别的安全验证,导致正常的情况下,传递的参数无法 ...
- 中国MOOC_零基础学Java语言_第6周 使用对象_1单词长度
第6周编程题 查看帮助 返回 第6周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...
- 13 oracle数据库坏块-逻辑坏块(模拟/修复)
13 oracle数据库坏块-逻辑坏块 逻辑数据坏块的场景1)oracle bug也可能导致逻辑坏块的产生. 特别是parallel dml. 例如:Bug 5621677 Logical corru ...
- 【JZOJ 3910】Idiot 的间谍网络
题面: Description 作为一名高级特工,Idiot 苦心经营多年,终于在敌国建立起一张共有n 名特工的庞大间谍网络. 当然,出于保密性的要求,间谍网络中的每名特工最多只会有一名直接领导.现在 ...
- web 过滤器 Filter、 Spring 拦截器 interceptor
1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> ...
- WNMP环境搭建步骤 nginx1.4.3+php-5.3.27+mysql-5.5+RunHiddenConsole
安装目录:D:/webServer/所需软件: mysql-installer-community-5.5.34.0.msi 下载:http://cdn.mysql.com/D ...
- [UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐
原文:[UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐 1. 什么是BlendEffect# 上一篇文章介绍了CompositionLinea ...
- Fusioncharts图表常用参数设置
1.1 <chart>参数设置: 图表和轴的标题* caption=”String” : 图表上方的标题* subCaption=”String” : 图表上方的副标题* xAxisNam ...