SpringCloud入门实战(十)- SpringCloud Bus消息总线

news2024/11/24 21:05:55

📝 学技术、更要掌握学习的方法,一起学习,让进步发生
👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。
💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。
💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。
❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。

👉🏻 👉🏻 👉🏻 SpringCloud 入门实战系列不迷路 👈🏻 👈🏻👈🏻:

  • SpringCloud 入门实战(一)什么是SpringCloud?
  • SpringCloud 入门实战(二)-SpringCloud项目搭建
  • SpringCloud 入门实战(三)-Eureka注册中心集成
  • SpringCloud入门 实战(四)-Zookeeper、Consul注册中心集成
  • SpringCloud入门实战(五)-Ribbon负载均衡集成
  • SpringCloud入门实战(六)-OpenFeign服务调用集成
  • SpringCloud入门实战(七)-Hystrix入门简介
  • SpringCloud入门实战(七)-Hystrix服务降级
  • SpringCloud入门实战(七)-Hystrix服务熔断
  • SpringCloud入门实战(七)-Hystrix服务限流
  • SpringCloud入门实战(七)-Hystrix Dashboard图形化监控
  • SpringCloud入门实战(八)-Gateway服务网关集成
  • SpringCloud入门实战(九)- Config配置中心
  • SpringCloud入门实战(十)- SpringCloud Bus消息总线

文章目录

  • 一、SpringCloud Bus概述
  • 二、关于消息总线
  • 三、项目搭建集成
    • 1、RabbitMQ环境准备
    • 2、动态刷新刷新全局广播
    • 3、动态刷新定点通知

一、SpringCloud Bus概述

SpringCloud Bus官网:SpringCloud Bus官网
有读者说我看不懂英文啊,没关系中文学习手册,小编也给准备好了:SpringCloud Bus中文手册

官网简介
Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,总线就像一个分布式执行器,用于扩展的Spring Boot应用程序,但也可以用作应用程序之间的通信通道。目前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(还有一些取决于传输)在其他传输的路线图上。

重点理解

  • Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。
  • 它整合了Java的事件处理机制消息中间件的功能。
  • 管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改事件推送等,也可以当做微服务间的通信通道。
  • 实现配置的动态刷新:在学习SpringCloud Config时,我们讲述了加入依赖 actuator,通过POST请求进行配置手工刷新。而SpringCloud Bus 配合 SpringCloud Config 使用可以真正实现配置的动态刷新。
  • Bus只支持两种消息代理:RabbitMQ和Kafaka。

那么SpringCloud Bus+RabbitMQ+Config如何实现分布式配置中心消息广播呢?我们一起演示来看下。

二、关于消息总线

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

基本原理(读到这里,默认MQ知识你已经是ok的):ConfigClient 实例都监听 MQ 中同一个 topic(默认是springCloudBus)。当服务刷新数据的时候,它会把这个消息放到主题中,这样其他监听同一个主题的服务就能得到通知,进而更新自身的配置。

Tip:关于MQ的基础知识、主题等还有需要补课的,可参看:RabbitMQ、RocketMQ 、Kafka区别

三、项目搭建集成

1、RabbitMQ环境准备

以mac环境为例,小编默认你的mac已经安装了HomeBrew(软件包管理系统),没有安装的看过来:mac安装Homebrew

终端执行brew info rabbitmq查看是否有MQ环境,如果显示Not installed没有安装过;
未安装,则执行brew install rabbitmq 安装一下;
安装完启动MQ: brew services start rabbitmq
启用图形化管理界面插件(http://localhost:15672):rabbitmq-plugins enable rabbitmq_management(默认用户名/密码:guest/guest)

顺便回顾下rabbitmq相关命令
brew启动brew services start rabbitmq;
重启brew services restart rabbitmq
前台运行rabbitmq-server
后台运行rabbitmq-server -detached
新建用户rabbitmqctl add_user 账号 密码
给用户分配操作权限rabbitmqctl set_user_tags 账号 administrator
修改密码rabbitmqctl change_password Username Newpassword 修改密码
删除用户rabbitmqctl delete_user Username 删除用户
查看所有用户rabbitmqctl list_users 查看用户清单
为用户设置访问权限rabbitmqctl set_permissions -p / 用户名 “." ".” “." rabbitmqctl set_permissions -p / root ".” “." ".

2、动态刷新刷新全局广播

设计思想:利用消息总线触发一个服务端ConfigServer的 /bus/refresh 端点,而刷新所有客户端的配置(全局广播)。

1)修改pom文件,添加依赖
首先配置中心服务端模块、客户端模块相关工程pom均添加消息总线支持,以我们的rabbitmq环境为例添加依赖:

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
   </dependency>
   <!--actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

如果是kafka则添加依赖:

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-kafka</artifactId>
   </dependency>
   <!--actuator-->
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

2)修改 yml 配置文件,添加 RabbitMQ 配置,并暴露监控断点

config客户端bootstrap.yml添加:

  ## rabbitmq的相关配置  rabbitmq的相关配置  15672是 Web 管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

config服务端application.yml添加:

## rabbitmq的相关配置  15672是 Web 管理界面的端口;5672是MQ访问的端口
rabbitmq:
  host: localhost
  port: 5672
  username: guest
  password: guest
## rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh" 

3)测试

首先启动注册中心、Config服务端、Config客户端1、Config客户端2,然后修改远程仓库github内容进行更新测试:

刷新config服务端(http://localhost:1234/main/config-dev.yml)可以正常获取最新的配置信息,
刷新config客户端(http://localhost:1235/configInfo、http://localhost:1236/configInfo)没有获取到更新后的信息:

访问http://localhost:3344/actuator返回结果进行分析,最新链接为busrefresh

{
    "_links":{
        "self":{
            "href":"http://localhost:1234/actuator",
            "templated":false
        },
        "busrefresh-destinations":{
            "href":"http://localhost:1234/actuator/busrefresh/{*destinations}",
            "templated":true
        },
        "busrefresh":{
            "href":"http://localhost:1234/actuator/busrefresh",
            "templated":false
        }
    }
}

所以接下来通过idea终端执行指令curl -X POST "http://localhost:1234/actuator/busrefresh"发送POST请求刷新服务端,再次去访问两个客户端,结果能够正常同步到最新的配置信息。



预期结果:一次发送,处处生效。实现了配置的全局广播。

注:动态刷新配置中发送post接口更新的是config的服务端接口;
之前提到过的手工刷新配置是发送post接口更新的是config的每一个客户端接口(多个客户端时一个个更新明显不友好),注意区分。

3、动态刷新定点通知

设计思想: 配置发生变更时,如果不想全部通知,只想定点通知某一个实例生效而不是全部。

1) 从官网可知,定点通知处理实例的寻址规则:http://配置中心服务端地址:配置中心服务端的端口号/actuator/bus-refresh/{destination}

通过{destination}制定具体需要更新的客户端。规则:spring-application-name:端口
在这里插入图片描述

2)定点通知的话,比如我们只通知客户端2变更,可执行 :curl -X POST "http://localhost:1234/actuator/bus-refresh/cloud-config-client-two:1236"

3)测试访问

在这里插入图片描述

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

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

相关文章

MySQL表聚合函数

前言 哈喽&#xff0c;各位小伙伴大家好&#xff0c;本篇文章为大家介绍几个MySQL中常用的聚合函数&#xff0c;什么是聚合函数&#xff0c;相信第一次看到这个名词的小伙伴是比较懵的&#xff0c;举个例子&#xff0c;比如说统计表中数据的个数&#xff0c;就可以使用MySQL中提…

软件测试技术分享丨支付测试

支付测试 引言&#xff1a;如今&#xff0c;随着非现金支付手段的不断推广和应用&#xff0c;“非现金社会”正在形成。非现金支付已成为日常生活中不可或缺的伙伴。那么&#xff0c;对于互联网产品来说&#xff0c;支付也是涉及到公司收入的一个重大环节。对于我们测试人员&am…

JavaScript 处理字符串数组数据方法

前端三件套中 JavaScript 就是充电处理业务逻辑的一个角色&#xff0c;在很多情况之下&#xff0c;或像在做项目之中去发起一些数据请求之后待服务器响应回馈给到客户端的时候&#xff0c;对于返回的数据需要进行一个格式的处理&#xff0c;比如有JSON&#xff0c;字符串&#…

Python 集合探索:解密高效数据操作和快速算法的奇妙世界

前言 在 Python 的众多数据结构中&#xff0c;集合&#xff08;Sets&#xff09;是一个引人注目且实用的概念。集合提供了一种存储无顺序、唯一元素的数据结构&#xff0c;它们不仅可以帮助我们高效处理数据&#xff0c;还能应用于各种算法和问题。 本博客将带您踏上一段关于…

python 从一个文件夹里面复制 符合要求的文件

记事本格式 import os def copy(src_file, dst_file):import shutil# 执行复制操作shutil.copy2(src_file, dst_file)def main(parent,data,dest_path):_list []for line in open(data, encoding"utf-8"):line line.strip()_list.append(line.split("\t&quo…

渠道归因(二)基于马尔可夫链的渠道归因

渠道归因&#xff08;二&#xff09;基于马尔可夫链的渠道归因 在应用当中&#xff0c;序列中的每个点通常映射为一个广告触点&#xff0c;每个触点都有一定概率变成真正的转化。通过这种建模&#xff0c;可以选择最有效&#xff0c;概率最高的触点路径。这种方法需要较多的数…

你知道怎么通过ai绘画图片描述生成图片吗

汤姆: 嘿&#xff0c;听说了吗&#xff1f;有几个特别酷的方法可以通过ai绘画图片描述生成出上面这些惊艳的图像&#xff01; 玛丽: 真的吗&#xff1f;那听起来好神奇啊&#xff01;怎么做到的&#xff1f; 汤姆: 其实很简单&#xff01;你只需要用文字描述你想要的图片&…

POI批量导入和echars图表

下载模板 userList.jsp <a href"downloadUserExcel">下载模板</a>DownloadUserServlet.java /*** 下载*/ WebServlet("/downloadUserExcel") public class DownloadUserServlet extends HttpServlet {protected void doGet(HttpServletReq…

关于环肽试剂:118477-06-8,Cyclo(L-Phe-trans-4-hydroxy-L-Pro),知识普及

●中文名&#xff1a;环(L-苯丙氨酰-反式-4-羟基-L-脯氨酸) ●英文名&#xff1a;Cyclo(L-Phe-trans-4-hydroxy-L-Pro) 西安凯新生物科技有限公司供应的​各种环肽&#xff0c; 任何结构的环肽&#xff0c;可以进行相应的定制服务。环二肽&#xff1a; 2000/g or 3000/g 纯度…

idea 自带git down分支出现莫名其妙的文件

是个坑 大部分场景下&#xff0c;会先down master 再去down 对应分支 例如dev 会出现一种内容&#xff0c;master里面有但dev没有当前文件&#xff0c;直接报错而且引入包排查没任何问题 解决方式&#xff1a; 用tortoiseGit 直接选对应分支。idea目前2022不支持

uniapp - [全端兼容] 多选弹框选择器,弹框形式的列表多选选择器组件插件(底部弹框式列表多选功能,支持数据回显、动态数据、主题色等配置)

前言 网上的教程都太乱了,各种不兼容且 BUG 太多,注释也没有很难进行改造。 本文 实现了 uniapp 全端兼容的弹框多选选择器,从底部弹出列表项进行多选(可回显已选中和各种主题色、样式配置), 您可以直接复制代码,稍微改改样式就能用了。 如下图所示,数据列表(支持接口…

关于找不到msvcp120.dll,无法继续执行代码的解决方案

小伙伴们知道msvcp120.dll是什么文件吗?那么今天小编就来讲解电脑出现msvcp120.dll丢失的解决方法介绍&#xff0c;希望能够帮助到大家呢。 msvcp120.dll 是windows系统中必备的动态链接库文件。msvcp120.dll可以解决某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。…

【电子量产工具】大纲分析

前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 项目大纲&#xff1a; 可以看到上面的框图&#xff0c;我们可以分为三大部分&#xff1a; 从最下面的 第 1 层开始。这是整个项目的最底层&#xff0c;主要负责处理数据和逻辑&#xff0c;与板…

Docker发布JAVA vhr微人事后端(确保打包没问题再发布)

本文代码来源于&#xff08;感谢作者&#xff09; GitHub - lenve/vhr: 微人事是一个前后端分离的人力资源管理系统&#xff0c;项目采用SpringBootVue开发。1.创建DockerFile文件 创建mail文件夹 创建web文件夹 以下为mail dockerfile FROM java:8 Add *.jar /app/app.ja…

算法chatgpt回答

算法 红黑树和AVL树区别 红黑树和AVL树区别

Windows系统提示丢失xlive.dll怎么办?

xlive.dll微软的动态链接库&#xff08;DLL&#xff09;的一部分&#xff0c;当它被删除或者损坏时&#xff0c;会出现错误消息&#xff0c;提示xlive.dll丢失或未找到。那么Windows系统提示丢失xlive.dll怎么办呢&#xff1f; Windows计算机丢失xlive.dll如何修复&#xff1f;…

云原生之深入解析Docker容器的核心Cgroups的相关概念和使用实现

一、Cgroups 简介 Cgroups 是 Linux 系统内核提供的一种机制&#xff0c;这种机制可以根据需求将一些列系统任务机器子任务整合或分离到按资源划分登记的不同组内&#xff0c;从而为系统资源管理提供一个的框架。简单地说&#xff0c;Cgroups 可以限制、记录任务组所使用的物理…

HCIP-Cloud Service Solutions Architect v3.0

华为职业认证hcip解决方案架构师v3.0 新增题库200题 HCIP-Cloud Service Solutions Architect v3.0 1.关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f; A.使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 B.通过外部文件…

智能化新服务即将惊艳亮相HDC2023 ——华为云Astro爆发低代码能量

​​HDC期间可参与华为开发者大会Astro新人抽奖活动&#xff0c;活动链接在文末。福利多多&#xff0c;快来参与&#xff01; 跃跃欲试的开发者们&#xff0c;是否对2023华为云开发者大会充满期待&#xff1f;华为云Astro将引领新一轮低代码技术革命&#xff01;贯穿AIGC技术的…

HTML5 游戏开发实战 | 五子棋

五子棋是一种家喻户晓的棋类游戏&#xff0c;它的多变吸引了无数的玩家。本章首先实现单机五子棋游戏(两人轮流下)&#xff0c;而后改进为人机对战版。整个游戏棋盘格数为 1515&#xff0c;单击鼠标落子&#xff0c;黑子先落。在每次下棋子前&#xff0c;程序先判断该处有无棋子…