Spring Cloud Bus 消息总线基础入门与实践总结

【1】基础介绍

其主要是实现分布式自动刷新配置功能,Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
Spring Clud Bus目前支持RabbitMQ和Kafka。

在这里插入图片描述

Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道。

在这里插入图片描述

什么是总线

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。

基本原理

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

【2】两种设计思想

前面两个图其实代表了两种设计:通知客户端和通知config配置中心。

① 通知客户端

利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置。在这里插入图片描述

② 通知config server

利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置。

在这里插入图片描述

③ 推荐架构二

图二的架构显然更加适合,图一不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性。
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

【3】config server添加消息总线支持

这个需要先安装配置好rabbitmq。

① pom依赖

 
<!--添加消息总线RabbitMQ支持-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--eureka-client-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--   config     -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>

② yml配置文件

server:port: 3344spring:application:name: cloud-config-centercloud:config:server:git:#uri: git@github.com:EiletXie/config-repo.git #Github上的git仓库名字uri: https://github.com/XXXXX/spring-cloud-config##搜索目录.这个目录指的是github上的目录search-paths: /configtimeout: 15label: master
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka
#rabbitmq配置
rabbitmq:host: localhostport: 5672username: guestpassword: guest
#暴露bus刷新配置端点
management:endpoints:web:exposure:include: 'bus-refresh'

③ 主程序

@SpringBootApplication
@RestController
@EnableEurekaClient
@EnableConfigServer
public class Config_Main3344 {public static void main(String[] args) {SpringApplication.run(Config_Main3344.class,args);}
}

【4】客户端添加消息总线支持

① pom依赖

<!--eureka-client-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 注意与上述不同 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 添加消息总线RabbitMQ支持 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

② yml文件

server:port: 3355spring:application:name: cloud-clientcloud:config:label: mastername: configprofile: devuri: http://localhost:3344#rabbitmq配置rabbitmq:host: localhostport: 5672username: guestpassword: guest
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka# 暴露监控端点
management:endpoints:web:exposure:include: "*"

【5】配置修改

① 全部通知

在【3】【4】配置后,当远程配置文件修改时,通过命令 curl -X POST "http://localhost:3344/actuator/bus-refresh",就可以使得所有的客户端获取最新的配置信息。

curl -X POST "http://localhost:3344/actuator/bus-refresh

② 指定具体某一个实例生效而不是全部

公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}

/bus/refresh请求不发给config server并通过destination参数类指定需要更新配置的服务或实例。

比如只通知3355不通知3366:

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

其思想总结如下图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES的高可用

es最小高可用集群组成 At least three master-eligible nodes&#xff08;至少三个符合主节点条件的节点&#xff09;At least two nodes of each role&#xff08;每个角色至少有两个节点&#xff09;At least two copies of each shard (one primary and one or more replica…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网&#xff1a;https://github.com/zhang-tong-yao/wall 软件下载&#xff1a;https://github.com/zhang-tong-yao/wall/releases&#xff0c;推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址&#xff1a;https://demo-wall.ityao.cn …

在Vue 3中,el-select循环el-option的常见踩坑点,value值绑定对象类型?选中效果不准确?

在Vue 3中&#xff0c;el-select 组件是来自 Element Plus UI 库的一部分。 如果你想要设置默认选中的选项&#xff0c;你可以使用 v-model 来绑定选中的值。如果你想要在某个时刻让某个选项显示为已选中&#xff0c;可以设置对应的值到 v-model 绑定的数据。 <template>…

Android 10.0 framework层禁止扫描5g wifi功能实现

1.前言 在10.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能 2.framework层禁止扫描5g wifi功能实现的核心类 frameworks/opt/net/w…

TrinityCore启动报错: MySQL library version (8.0.37 id 80037) does not match

TrinityCore启动的时候报错&#xff1a; TrinityCore/src/server/database/Database/DatabaseWorkerPool.cpp:73 in DatabaseWorkerPool FATAL ERROR: Used MySQL library version (8.0.37 id 80037) does not match the version id used to compile TrinityCore (id 80036). S…

农产品商城系统农资电商商城系统java项目jsp web项目

农产品商城系统农资电商商城系统java项目jsp web项目 会员用户可以实现&#xff1a;注册登录、商品信息浏览、加入购物车、加入收藏、下单支付、查看公告、查看以及留言、个人信息管理 后台管理的实现&#xff1a;类别管理模块、商品管理模块、会员管理模块、订单管理、退货管…

你项目用到了 Dubbo,讲讲为什么要用以及怎么使用的?

引言&#xff1a;在现代分布式系统中&#xff0c;服务化架构已成为构建高性能、可扩展和可靠系统的关键。 Dubbo 作为一种优秀的服务化框架&#xff0c;提供了丰富的特性和灵活的配置选项&#xff0c;使得它在业界得到了广泛的应用和认可。本文将探讨为什么选择 Dubbo 以及如何…

JavaEE大作业之班级通讯录系统(前端HTML+后端JavaEE实现)PS:也可选网络留言板、图书借阅系统、寝室管理系统

背景&#xff1a; 题目要求&#xff1a; 题目一&#xff1a;班级通讯录【我们选这个】 实现一个B/S结构的电子通讯录&#xff0c;其中的每条记录至少包含学号、姓名、性别、班级、手机号、QQ号、微信号&#xff0c;需要实现如下功能&#xff1a; &#xff08;1&#xff09;…

linux的一些知识点分享-------关于操作维护的一些知识点

Apache服务器的监听端口,默认为() Apache服务器的监听端口&#xff0c;默认为80。 vsftpd中,可以不需提供账号密码就能进行访问的用户是( ) 在vsftpd&#xff08;Very Secure FTP Daemon&#xff09;中&#xff0c;可以不需要提供账号密码就能进行访问的用户通常是匿名用户。…

Objective-C基础语言开发来袭,你准备好了吗?

文/ZaiZai 前言 今天小白电脑技术的公众号迎来了一位Objective-C语言开发大神——ZaiZai。接下来有想要学习写插件&#xff08;iOS/macOS/iPadOS/tvOS&#xff09;的小伙伴可以关注微信公众号&#xff0c;教程将持续更新。 ZaiZai个人介绍……呃……他不让放。 Objective-C…

flutter升级textField WhitelistingTextInputFormatter

将WhitelistingTextInputFormatter(RegExp("[0-9]"))升级FilteringTextInputFormatter.allow(RegExp("[0-9]")), 一下为新方法 1.只允许输入数 TextField(inputFormatters: [FilteringTextInputFormatter.allow(RegExp("[0-9.]")),],),2.only …

AI早班车6.13

全球AI新闻速递 1.Yandex 开源模型训练工具“YaFSDP”&#xff0c;提升 GPU 利用率。 2.全天候激光智能除草机器人落地&#xff0c;环境零污染。 3.苹果2024开发者大会-Siri 更智能。 4.CampusAI筹集1000万美元种子资金&#xff0c;创建虚拟校园用于学习AI技能。 5.OpenAI&…

C语言详解(预编译)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

深度学习每周学习总结N1(one-hot 编码案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 数据链接 提取码&#xff1a;c949 –来自百度网盘超级会员V5的分享 目录 总结&#xff1a;1. 中文文本One-Hot编码示例代码解析 2.直接使…

js实现实现九宫格乱序抽奖

我们以前写的九宫格抽奖&#xff0c;都是顺时针按照顺序进行旋转抽奖&#xff0c;今天给大家分享一下乱序&#xff0c;就是不按照一定顺序的。 用户的具体步骤&#xff1a;用户点击开始抽奖时&#xff0c;奖项开始随机闪&#xff0c;闪到一定次数后停止并且进行抽奖成功提示&a…

什么是DMZ?路由器上如何使用DMZ?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 DMZ 📒🚀 DMZ的应用场景💡 路由器设置DMZ🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在网络管理中,DMZ(Demilitarized Zone,隔离区)是一个特殊的网络区域,常用于将公共访问和内部网络隔离开来。DMZ功能允许…

vue面试题汇总之响应式理解

进行代理(解决第一步读写数据调用函数) vue2使用Object.defineProperty进行数据代理(getter和setter),vue3使用Proxy进行数据代理 Proxy的性能会比Object.defineProperty好很多 Object.defineProperty是一次性代理完所有的数据,如果对象嵌套很深就会一直递归直到代理完所有属…

遇到JSON文件就头大?掌握Python这几种方法,让你轻松应对

目录 1、标准库json模块 📄 1.1 json.load()函数介绍 1.2 json.loads()处理字符串 1.3 使用json.dump()写入JSON 1.4 json.dumps()美化输出 1.4 错误处理与编码问题 1.5 高效读取大文件技巧 2、第三方库simplejson加持 🔧 2.1 安装与导入simplejson 2.2 性能优势与…

A.计算圆周率——无穷级数法

描述 圆周率π可以用无穷级数表示&#xff1a; 左边的展式是一个无穷级数&#xff0c;被称为莱布尼茨级数&#xff08;Leibniz&#xff09;&#xff0c;这个级数收敛到π/4&#xff0c;它通常也被称为格雷戈里-莱布尼茨级数&#xff0c;用以纪念莱布尼茨同时代的天文学家兼数…

解决css文本内容为符号不会换行问题

错误样式如上&#xff0c;超出了规定的文本区域。 在css上增加word-wrap: break-word;即可。