SpringCloud系列之服务总线(Bus)
文章目录
- 1、概述
- ①、工作流程
- ②、什么是总线
- ③、基本原理
- 2、RabbitMQ环境配置
- ①、Windows安装ErLang
- ②、Windows安装RabbitMQ
- ③、安装安装管理工具RabbitMQ-Plugins
- ③、Docker安装
- Ⅰ、拉取镜像
- Ⅱ、运行容器
- Ⅲ、访问web管理页面
- 3、动态刷新全局广播
- ①、创建新的module
- ②、测试
- ③、ConfigServer添加消息总线的支持
- Ⅰ、POM
- Ⅱ、YML
- ④、ConfigClient添加消息总线的支持
- Ⅰ、POM
- Ⅱ、YML
- ⑤、测试
- 4、动态刷新的定点通知
- ①、一个小公式
- ②、测试
1、概述
在学习完
Config
之后,我们发现了一个问题就是每当配置中心配置发生变化以后,都需要将每个微服务重新启动一遍,这样对于某些大型项目而言是很痛苦的,然后我们就又引入了动态刷新功能,每当配置中心配置变化后,我们的运维小哥就手动给每一个微服务都发送一个POST
请求用于更新配置,这样便免于重新启动服务,节约时间,但是这样的动态刷新还是不够彻底,我们如何才能彻底解放运维小哥的双手呢?那就是使用Spring Cloud Bus
配合Spring Cloud Config
使用实现动态刷新配置
Spring Cloud Bus
是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java
的事件处理机制和消息中间件的功能,它能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道,目前支持RabbitMQ
和Kafka
,本文便是使用RabbitMQ
。
①、工作流程
第一种方式(消息发送给一个客户端而刷新所有的配置)
- 配置更新,推送到
Git
仓库 Config Server
配置中心同步配置- 使用订阅了消息的主机给其中一个服务发送一个
Post bus/refresh
更新请求 - 该服务向服务配置中心拉取最新配置,并将信息发送给消息总线
- 这个消息将会通过消息总线广播出去,域内指定或所有服务收到消息就回去服务配置中心拉取最新配置
第二种方式(消息发送给服务配置中心来刷新所有配置)
- 配置更新,推送到
Git
仓库 Config Server
配置中心同步配置- 使用订阅了消息的主机给服务配置中心发送一个
Post bus/refresh
更新请求 - 服务配置中心给消息总线发送通知请求刷新配置
- 消息总线向域内指定或所有服务发送更新通知消息
- 服务从服务配置中心拉取最新配置
相比之下,第二种应该更合理,图一不合理的原因如下
- 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。如果这个服务挂了,那是不是就会既影响订单服务,又影响通知服务,数罪并罚死得更惨
- 破坏了微服务各节点的对等性
- 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改
②、什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播─些需要让其他连接在该主题上的实例都知道的消息.
③、基本原理
ConfigClient
实例都监听MQ
中同一个topic
(默认是springCloudBus
)。当一个服务刷新数据的时候,它会把这个信息放入到Topic
中,这样其它监听同一Topic
的服务就能得到通知,然后去更新自身的配置。
2、RabbitMQ环境配置
①、Windows安装ErLang
使用
RabbitMQ
时需要下载安装ErLang
环境,因为RabbitMQ
是用ErLang
语言编写的
下载地址
官网下载速度特别快,所以我这就准备了两种方案
一份云盘链接,提取码:
ppqi
又或者是
RabbitMQ
官网提供的下载链接
傻瓜式安装,就不贴图了,然后配置环境变量(这个不会的还是百度吧)
②、Windows安装RabbitMQ
根据前面下载的
ErLang
版本,选择对应正确的RabbitMQ
版本,根据查阅,这里安装3.8.9
官方下载地址
官网下载速度同样不可恭维,可以从华为镜像仓库下载
华为镜像地址
同样再提供一个云盘链接,提取码:
uput
同样傻瓜式安装,再配置个环境变量
太TM麻烦了
③、安装安装管理工具RabbitMQ-Plugins
进入
RabbitMQ
安装目录下的sbin
目录,打开cmd
,输入
rabbitmq-plugins enable rabbitmq_management
然后点击
RabbitMQ Service - start
如果遇到服务启动失败,报错信息为1067,一般情况都是计算机名为中文,或者安装路径有中文或者其他非法字符,鄙人自以为不会犯这种低级错误,结果导致又查了一个小时,呵呵
如果无误,就会看到以下信息
但是如果你安装完后修改了计算机名称(比如你遇到了我得问题,计算机名为中文,然后改成了英文)即使你启动成功,你还是无法访问
localhost://15672
,网上又查了好一会,得出结论,简单粗暴重装一遍RabbitMQ
。
一切就绪,进入管理页面查看,账号密码都是
guest
③、Docker安装
怎么样,Windows
的环境问题搞得是不是头大,按道理实际开发也不会用Windows
的RabbitMQ
啊,所以Docker
才是针不戳
Ⅰ、拉取镜像
#management版本的自带web管理页面
docker pull rabbitmq:3.8.3-management
Ⅱ、运行容器
强调需要映射两个端口一个
5672
,一个15672
,因为RabbitMQ
会开启3
个端口,5672
、15672
、25672
,其中5672
是提供消息队列服务所用,15672
是开启后台http
访问所用,
docker run -d -p 15672:15672 -p 5672:5672 --name myRabbitMQ rabbitmq:3.8.3-management
Ⅲ、访问web管理页面
访问之前记得打开安全组(云服务器)
(拍桌)这TM
比Windows
好用太多了
3、动态刷新全局广播
①、创建新的module
基于上一篇文章,再次创建一个与
3344
相同的3355
,步骤省略,区别仅在于配置文件端口号声明为3366
为了便于区分,两个
ConfigClient
的Controller
修改为:
/*** @author PengHuAnZhi* @createTime 2021/2/16 15:30* @projectName SpringCloudDemo* @className ConfigClientController.java* @description TODO*/
@RestController
@Slf4j
@RefreshScope
public class ConfigClientController {// 因为config仓库以rest形式暴露,所以所有客户端都可以通过config服务端访问到github上对应的文件信息@Value("${config.info}")private String configInfo;@Value("${server.port}")private String serverPort;@GetMapping("/configInfo")public String getConfigInfo() {return "ServerPort : " + serverPort + "\t"+"configInfo : "+configInfo;}
}
②、测试
服务没有问题
③、ConfigServer添加消息总线的支持
这里采用第二种通知方式,直接通知配置中心,更加合理
Ⅰ、POM
在
3344
的POM
文件中新增依赖坐标
<!-- 添加消息总线RabbitMQ支持 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
Ⅱ、YML
新增
RabbitMQ
和management
节点配置
server:port: 3344spring:application:name: config-centercloud:config:server:git:uri: https://github.com/PengHuAnZhi/CloudDemoConfig #Github上的git仓库地址##搜索目录.这个目录指的是github上的目录search-paths:- CloudDemoConfig##读取分支label: main#rabbitmq相关设置rabbitmq:host: 39.105.43.3port: 5672username: guestpassword: guesteureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/#暴露 bus刷新配置的端点
management:endpoints:web:exposure:include: 'bus-refresh'
④、ConfigClient添加消息总线的支持
3355
,3366
配置相同
Ⅰ、POM
<!-- 添加消息总线RabbitMQ支持 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
Ⅱ、YML
server:port: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: main #分支名称name: config #配置文件名称profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.ymluri: http://localhost:3344#rabbitmq相关设置rabbitmq:host: 39.105.43.3port: 5672username: guestpassword: guest
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/#暴露监控端点
management:endpoints:web:exposure:include: "*"
⑤、测试
如果服务运行期间一直循环报java.net.SocketException: socket closed
,那就是你云服务器的安全组没有开,又或者是docker
镜像的端口映射不对,特别注意是要配置两个映射端口
重启服务,访问测试
git
仓库version
改为5
再次查看
3344
,发现正常更新
发送
Post
请求
curl -X POST "http://localhost:3344/actuator/bus-refresh"
再次访问
3355
和3366
查看
RabbitMQ
的Topic
订阅主题,发现确有一个名叫springCloudBus
的Topic
!
4、动态刷新的定点通知
在配置更新后,我们有时候有这种需求,只希望某一部分服务更新配置,另一部分不更新,那么就需要进行定点通知,放在本文中,也就是只通知
3355
或者3366
,另一个不通知
①、一个小公式
http://localhost:配置中心的端口号/actuator/bus-refresh/
{destination}
请求就会发给
config server
并通过destination
参数类指定需要更新配置的服务或实例
如:
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" #只通知3355,config-client为服务名
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3366" #只通知3366
②、测试
修改
version
发送通知
再次访问
SpringCloud系列之服务总线(Bus)相关推荐
- SpringCloud系列之服务注册中心(Eureka)
文章目录 0.前言 1.搭建第一个Eureka服务 ①.简介 ②.组成 ③.创建Eureka Server模块 ④.编写POM ⑤.YML ⑥.主启动 ⑦.测试 2.注册服务 ①服务提供者 Ⅰ.添加依 ...
- SpringCloud系列之服务消费Ribbon和Feign区别
在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个 ...
- 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)
3.6.Eureka Server 源码分析 上一篇文章简单介绍了 Eureka 的一些概念,今天咱们来看看其原理和源码,首先先看 Eureka Server 的原理. 3.6.1.Eureka Se ...
- 【SpringCloud】微服务笔记
写在前面 官方代码地址:https://github.com/zzyybs/atguigu_spirngcloud2020 本文地址:https://blog.csdn.net/hancoder/ar ...
- SpringCloud停更服务一览表
参考文章:SpringCloud组件的停更和替换说明 SpringCloud的Hoxton版本,和之前的版本相比,用新的组件替换掉了原来大部分的组件,老的组件现在处于 停更不停用 的状况. 详情见下图 ...
- SpringCloud系列——Zuul 动态路由
前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...
- SpringCloud系列之Nacos+Dubbo+Seata应用篇
SpringCloud系列之Nacos+Dubbo+Seata应用篇 原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html ---------- 源 ...
- SpringCloud config 配置中心集群配置以及整合消息总线BUS实现关联微服务配置自动刷新
一.SpringCloud Config 基本配置中的问题 在上一章节<SpringCloud config 配置中心介绍与基本配置使用>中我们现实了配置中心的配置集中管理.调用微服务应用 ...
- 499、Java分布式和集群12 -【SpringCloud视图微服务 - 消息总线Bus】 2021.06.01
目录 0.RabbitMQ 1.先运行,看到效果,再学习 2.pom.xml 3.bootstrap.yml 4.application.yml 5.ProductDataServiceApplica ...
- SpringCloud教程-消息总线Bus 客户端(client)刷新(SpringCloud版本Greenwich.SR4)
文章目录 消息总线(Bus)介绍 项目示例 config-client-bus 代码地址:github-spring-cloud地址 前言:前面文章讲了Spring Cloud Config配置中心如 ...
最新文章
- hibernate与mybatis的区别和应用场景
- 在Kaggle上赢得大数据竞赛的技巧和窍门
- A humble heart2019-11-09
- .NET运行时中的监测和可观测性
- [毕业生的商业软件开发之路]系列文章目录规划
- 65lbc184应用电路原理_75lbc184应用电路
- linq拼接where语句_C# 10. LINQ 的三种查询语句写法
- 使用BAPI批量修改采购信息记录的税率
- 【PTA L2-012】关于堆的判断(堆的建立和特殊字符串的读入)
- python读取、保存npy文件
- 四十个鹏城春夏,一场数字繁花
- MySQL增删改查及备份恢复
- printf 打印结构体成员函数出错原因分析
- 解决js newDate()苹果手机日期格式显示NaN
- 码云联合实训邦推出高校软件工程视频实训课程
- java中gui_java中GUI是什么意思?详细图解
- mysql sha256 示例_SHA256简介
- MySQL学习笔记(四)
- 月薪2万的Java工程师简历是这样的
- Demond Page的原理和作用(By Walle@ARMCE)
热门文章
- blos硬盘启动台式计算机,最新戴尔台式机bios设置硬盘启动图解
- 3 Robotics: Mobility 课程学习记录及课后习题解答
- 打印菱形图案C语言详解
- ZK宕机重启数据恢复
- Stata:多元回归中控制其他因素不变的含义
- 我对计算机的看法英语作文,我对创新的看法英语作文7篇作文
- Android APP极限瘦身—— WebP 图片优化
- MySQL事务的保证机制
- 笔记本无网络计算机,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
- ReactNative 导航栏Navigator的使用及参数navigator的传递