当前位置: 首页 > news >正文

【spring cloud】(六)消息总线——springcloud Bus

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡Config知识点速览

  • 🍹 springcloud Bus
    • 🍸 什么是springcloud Bus?
      • 🍷 什么是消息总线?
      • 🍷 Bus实现自动刷新的原理
  • 🍹 RabbitMQ的下载配置
    • 🍸 Erlang
    • 🍸 RabbitMQ
  • 🍹 Bus动态刷新
    • 🍸 全局广播通知代码实现
    • 🍸 定点通知代码实现

🍹 springcloud Bus

🍸 什么是springcloud Bus?

  上一章的springcloud Bus是对分布式微服务的远程配置,但是有一个遗留的问题就是,Config客户端对远程配置的刷新需要手动使用post请求来完成,这就使得Config客户端动态刷新变得十分麻烦。于是消息总线springcloud Bus就是来解决这个问题的

🍷 什么是消息总线?

  在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都链接上来。由于该主题中产生的消息都会被所有实例监听和消费,所以称它为消息总线。

🍷 Bus实现自动刷新的原理

  所有的Config客户端都监听MQ中同一个topic(默认是SpringCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其他监听同一Topic的服务就能得到通知,然后去更新自身的配置。
  由于springcloud Bus支持两种消息的代理(RabbitMQ和kafka),于是接下来的demo选择使用RabbitMQ 3.7.14,其他的消息中间件Bus暂不支持

🍹 RabbitMQ的下载配置

🍸 Erlang

  第一步: 下载安装Erlang,地址:http://erlang.org/download/otp_win64_21.3.exe,安装除了自定义安装路径外,一路next即可
  第二步: 配置环境变量,新建一个环境变量命名为ERLANG_HOME,值为Erlang的安装路径在这里插入图片描述
path环境中添加 %ERLANG_HOME%\bin
在这里插入图片描述
  第三步: win + R 输入cmd回车,键入命令erl测试配置是否成功在这里插入图片描述

🍸 RabbitMQ

  第一步: 这里以RabbitMQ 3.7.14为例,地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.14,页面的最下方有下载的地方,安装除了自定义安装路径外,一路next即可在这里插入图片描述
  第二步: 配置环境变量,新建一个环境变量命名为RABBITMQ_SERVER,值为RabbitMQ的安装路径在这里插入图片描述
path环境中添加 %RABBITMQ_SERVER%\sbin在这里插入图片描述
  第三步: 安装管理工具RabbitMQ-Plugins,win + R 输入cmd回车,键入命令

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述
  第四步: 第三部安装的管理工具会安装几个RabbitMQ的管理快捷方式,可以点击win键查看,点击即可执行对应操作在这里插入图片描述
  第五步: 测试是否安装成功,浏览器http://localhost:15672(默认账号:guest,密码:guest),登入RabbitMQ的管理页就表示已经安装成功

🍹 Bus动态刷新

  Bus动态刷新有两种设计思想,第一种利用消息总线触发一个客户端的bus/refresh,从而刷新这条总线上的所有客户端配置;第二种利用消息总线触发一个服务端ConfigServer的bus/refresh,从而刷新这个配置中心(服务端)上注册的所有客户端配置。
  以上两种思想并不是都有应用,而是选择了第二种,因为第一种设计思想会使得被选中的服务端节点在配置获取职责之外新增配置刷新的职责,这会打破微服务的职责单一性和各节点之间的对等性。且一旦被选中的节点失效,配置刷新也将会随之失效,这条总线上的服务端依旧无法实时获取到最新的配置。

🍸 全局广播通知代码实现

  此时配置相关微服务一共有三个,它们是配置中心服务端3344、客户端3355、客户端3366,全局广播的代码实现需要对三个微服务都进行配置
  配置中心3344: pom文件和配置文件

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
spring:
	#rabbitmq相关配置
	rabbitmq:
	  host: localhost
	  port: 5672
	  username: guest
	  password: guest
	  
##rabbitmq相关配置,暴露bus刷新配置的端点 SpringCloud Bus动态刷新全局广播
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

  客户端3355、3366: pom文件和配置文件

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
spring:
	#rabbitmq相关配置
	rabbitmq:
	  host: localhost
	  port: 5672
	  username: guest
	  password: guest

以3366为例,配置文件的缩进如下

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    config:
      uri: http://localhost:3344  #配置中心的地址
      label: master  #分支名称
      name: config  #配置文件名称
      profile: dev  #读取后缀名称   上述三个综合http://localhost:3344/master/config-dev.yml
  #rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
#服务注册到eureka地址
eureka:
  client:
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版

# 暴露监控端点 否则 curl -X POST "http://localhost:3355/actuator/refresh" 不可使用
management:
  endpoints:
    web:
      exposure:
        include: "*"

  🚩值得注意的是,之前rabbitmq的web访问端口是15672,但是在代码中连接rabbitmq使用的端口是5672,这里很容易踩坑

  完成前面的配置,使用以下链接访问配置中心服务端3344、客户端3355、客户端3366的配置信息

http://localhost:3344/master/config-dev.yml
http://localhost:3355/configInfo
http://localhost:3366/configInfo

  然后修改gitee上的远程配置,仍然使用上面链接访问,会发现只有配置中心服务端获取的配置是最新的,但是配置客户端的配置还是修改前的,需要使用win+R输入命令刷新,再访问的话配置客户端就是最新的配置了

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

在这里插入图片描述

🍸 定点通知代码实现

  bus除了可以一个命令刷新总线上的所有微服务之外,还可以支持定点刷新,命令如下

定点通知一个

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

定点通知多个

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

相关文章:

  • 【斯坦福大学公开课CS224W——图机器学习】一、图机器学习中的传统方法(1)
  • 【Java基础】TreeSet集合、自然排序、比较器排序、成绩排序及不重复随机数案例
  • Code For Better 谷歌开发者之声——Flutter - Google 开源的移动 UI 框架
  • 数据结构与算法01-算法的评估(大O表示法) 算法的优化方向
  • 某银行开发一个信用卡管理系统CCMS
  • JAVA基础知识
  • 计算机组成原理_数据寻址
  • Springboot集成Mybatisplus,轻松CRUD
  • IDEA生成时序图和类图(案例超详解)
  • 笔试选择题-树
  • 用神经网络模拟3个距离为0的粒子
  • 【重识云原生】第六章容器6.1.10节——DockerFile解析
  • 20220910编译ITX-3588J的Buildroot的系统1(编译uboot)
  • 100 ECMAScript6数组方法
  • 循环神经网络
  • [译]CSS 居中(Center)方法大合集
  • Android单元测试 - 几个重要问题
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS笔记四:作用域、变量(函数)提升
  • Linux后台研发超实用命令总结
  • Meteor的表单提交:Form
  • npx命令介绍
  • Service Worker
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SQLServer之索引简介
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • Zepto.js源码学习之二
  • 代理模式
  • 利用jquery编写加法运算验证码
  • 山寨一个 Promise
  • 学习ES6 变量的解构赋值
  • 学习JavaScript数据结构与算法 — 树
  • 一起参Ember.js讨论、问答社区。
  • 阿里云ACE认证之理解CDN技术
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #《AI中文版》V3 第 1 章 概述
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)基于IDEA的JAVA基础1
  • (转)scrum常见工具列表
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET建议使用的大小写命名原则
  • .NET运行机制
  • .Net中的设计模式——Factory Method模式
  • // an array of int
  • :如何用SQL脚本保存存储过程返回的结果集
  • @RequestParam详解
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [Assignment] C++1