【SpringCloud笔记】(10)消息总线之Bus

Bus

前言

戳我了解Config

学习Config中我们遇到了一个问题:
当我们修改了GitHub上配置文件内容,微服务需要配置动态刷新并且需要手动向客户端发送post请求刷新微服务之后才能获取到GitHub修改过后的内容

假如有多个微服务客户端3355/3366/3377…等等百十个微服务呢?
难道每个微服务都要执行一次post请求,手动刷新?
我们可否广播,一次通知,处处生效?
我们想大范围的自动刷新,并且还能够定点通知、精确通知,比如100台中我要剔除2台通知其他98台微服务?

于是我们请出来Config的连体兄弟–Bus,它能做到!

Config+Bus完成分布式自动刷新配置功能

概述

能干嘛

  • spring cloud Bus配置spring cloud Config使用可以实现配置的动态刷新在这里插入图片描述

其实就是:之前Config中我们配置完自动刷新,还需要向客户端发送post请求刷新微服务,相当于告诉微服务GitHub内容已更新,现在消息中间件帮我们把这件事给做了,它刷新一台微服务客户端,然后这台微服务告诉Bus,Bus会通知其他微服务

在这里插入图片描述

刷新一台微服务服务端,然后这台微服务告诉Bus,Bus会通知其他微服务客户端

这两张图是两种实现方式,一种是触发客户端,一种是触发服务端,下边会讲到

为什么被称为消息总线?

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

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

阳哥RabbitMQ视频

安装RabbitMQ的依赖环境

安装Erlang 下载地址:http://erlang.org/download/otp_win64_21.3.exe

安装RabbitMQ 下载地址: http://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe

进入 rabbitMQ安装目录的sbin目录下,在此目录打开cmd命令行窗口,执行 rabbitmq-plugins enable rabbitmq_management 命令启动管理功能

在这里插入图片描述

访问http://localhost:15672/,输入密码账号:默认为guest

SpringCloud Bus动态刷新全局广播

必须先具备良好的RabbitMQ环境(RabbitMQ安装成功并能正常登录)

演示广播效果,增加复杂度,再以3355为模板再制作一个3366

设计思想

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

在这里插入图片描述

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

在这里插入图片描述

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

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

给cloud-config-center-3344配置中心服务端添加消息总线支持

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>

yml文件

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: git@github.com:mazhuorui/springcloud_config.git #GitHub上面的git仓库名字
        ####搜索目录
          search-paths:
            - springcloud_config
      ####读取分支
      label: master

#rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

给cloud-config-client-3355及3366客户端添加消息总线支持

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>

yml文件

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: git@github.com:mazhuorui/springcloud_config.git #GitHub上面的git仓库名字
        ####搜索目录
          search-paths:
            - springcloud_config
      ####读取分支
      label: master

#rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

测试

修改Github上配置文件

发送POST请求curl -X POST http://localhost:3344/actuator/bus-refresh

一次修改,广播通知,处处生效

Config中我们执行post请求刷新的是客户端,并且每个客户端都需要执行一次,这次我们执行post请求刷新服务端curl -X POST http://localhost:3344/actuator/bus-refresh

SpringCloud Bus动态刷新定点通知

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

公式: http://localhost3344/actuator/bus-refresh/{destination},destination为微服务名称:端口号
请求不再发送到具体的服务实例上,而是发给config server通过destination参数类指定需要更新配置服务或实例

我们这里以刷新运行在3355端口上的config-client为例,只通知3355不通知3366

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

执行完post请求即可完成动态刷新定点通知

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将本地镜像推送到阿里云

文章目录 创建仓库镜像登录 并上传下载上传的 创建仓库镜像 利用下面的脚本进行配置 登录 并上传 [roothadoop100 ~]# docker login --username13thm registry.cn-hangzhou.aliyuncs.com Password: [roothadoop100 ~]# docker tag ba78e6d6845c registry-vpc.cn-hangzhou.al…

C++-类和对象(1)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。…

一文读懂铭文赛道新手攻略

近期&#xff0c;加密领域的热点焦点不断涌现&#xff0c;但毫无疑问&#xff0c;"铭文"这个词汇已经成为了近两个月内广受瞩目的关键词之一。像ORDI、SATS、RATS等铭文项目在比特币区块链上获得了惊人的增长&#xff0c;为持有者带来了巨大的财富效应。铭文热潮已经…

使用 Fiddler+Linux 日志 + 数据库,搞懂3个问题,强势回怼开发!

测试过程中有没有遇到过什么问题是你解决的&#xff1f; 遇到bug怎么分析是前端bug还是后端bug&#xff1f; 测试的时候怎么确认你的测试结果是正确的&#xff1f; 定位分析问题的能力是测试不可或缺的&#xff0c;而且这个能力需要项目经验积累以及需要丰富的知识面才能达到…

k8s---kubernets

目录 一、Kurbernetes 1.2、K8S的特性&#xff1a; 1.3、docker和K8S&#xff1a; 1.4、K8S的作用&#xff1a; 1.5、K8S的特性&#xff1a; 二、K8S集群架构与组件&#xff1a; 三、K8S的核心组件&#xff1a; 一、master组件&#xff1a; 1、kube-apiserver&#xff1…

NET中使用SQLSugar操作sqlserver数据库

目录 一、SqlSugar是什么&#xff1f; 二、迁移和建表 1.建立实体 2.创建上下文类 3.在Program中添加SqlSugar服务 4.在控制器中注入上下文类 三、简单实现CURD功能 总结 一、SqlSugar是什么&#xff1f; SqlSugar是一款老牌 .NET 开源ORM框架。 主要特点&#xff1a…

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集 HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤。 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。优点是跨平台&#xff0c;指令集小&#x…

华为设备VRP系统管理

为了满足企业业务对网络的需求&#xff0c;网络设备中的系统文件需要不断进行升级。另外&#xff0c;网络设备中的配置文件也需要时常进行备份&#xff0c;以防设备故障或其他灾害给业务带来损害。在升级和备份系统文件或配置文件时&#xff0c;经常会使用FTP和TFTP来传输文件。…

系统学习Python——装饰器:函数装饰器-[跟踪调用]

分类目录&#xff1a;《系统学习Python》总目录 如下的代码定义并使用了一个函数装饰器&#xff0c;统计对被装饰函数的调用次数&#xff0c;并且针对每一次调用打印跟踪信息&#xff1a; class tracer:def __init__(self, func):self.calls 0self.func funcdef __call__(se…

【Linux驱动】最基本的驱动框架 | LED驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;最基本的驱动框架⚽驱动程序框架⚽编程 &#x1f3c0;LED驱动⚽配置GPIO⚽编程…

Python 高级(四):线程池 ThreadPoolExecutor

大家好&#xff0c;我是水滴~~ 当涉及到需要同时处理多个任务的情况时&#xff0c;使用线程池是一种高效的方法。Python提供了concurrent.futures模块&#xff0c;其中的ThreadPoolExecutor类使得使用线程池变得非常方便。本文将详细介绍Python线程池的概念、使用方法和示例代…

【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理

在防止SQL注入的方法中&#xff0c;预编译是十分有效的&#xff0c;它在很大程度上解决了SQL注入问题。 SQL注入简析 数据库查询语句未对SQL注入做任何防护时&#xff0c;语句基本如下&#xff1a; $name$_POST[name]; $pass$_POST[pass]; $sql"SELECT * FROM user W…

展望2024的区块链世界,铭文将是绕不开的话题

近期&#xff0c;加密领域的热点焦点不断涌现&#xff0c;但毫无疑问&#xff0c;"铭文"这个词汇已经成为了近两个月内广受瞩目的关键词之一。像ORDI、SATS、RATS等铭文项目在比特币区块链上获得了惊人的增长&#xff0c;为持有者带来了巨大的财富效应。铭文热潮已经…

图片批量处理:图片批量缩放,高效调整尺寸的技巧

在数字媒体时代&#xff0c;图片处理已是日常生活和工作中不可或缺的一部分。有时候要批量处理图片&#xff0c;如缩放图片尺寸&#xff0c;以满足不同的应用需求。现在一起来看看办公提效式具如何高效的将图片批量处理方法&#xff0c;快速、准确地批量调整图片尺寸操作。 下…

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

封装map和set

文章目录 封装mapset红黑树成员变量节点定义KeyOfTMapKeyOfTSetKeyOfT begin() && end()迭代器迭代器类operatoroperator- - insert 封装 map和set的底层都是通过红黑树来实现的&#xff0c;那么是怎么做到共用同一份代码&#xff0c;但让map存储的是键值对&#xff0…

多功能演示工具ProVideoPlayer2 mac特色介绍

ProVideoPlayer2 mac是用于大多数任何生产的首选多功能演示工具。ProVideoPlayer 2是一种动态视频播放和处理媒体服务器&#xff0c;可将视频映射&#xff08;包括播放和实时视频输入&#xff09;实时控制到一个或多个输出。包括实时效果&#xff0c;调度&#xff0c;网络同步和…

(AntV X6)vue2项目流程图实现

(AntV X6)vue2流程图实现 项目&#xff1a;gitLab/zhengzhouyuan 效果&#xff1a; 一、项目引入X6 npm install antv/x6 --save 二、引入相关插件 npm install --save antv/x6-plugin-clipboard antv/x6-plugin-history antv/x6-plugin-keyboard antv/x6-plugin-selection an…

海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效

近日&#xff0c;2023北京国际金融安全论坛暨金融科技标准认证生态大会在北京金融安全产业园成功举办。深圳海云安网络安全技术有限公司&#xff08;以下简称“海云安”&#xff09;受邀参展亮相此次大会。海云安作为国内领先的金融科技服务商&#xff0c;展示了开发安全系列产…

数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历 后序遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它由节点和边组成。树的每个节点可以有零个或多个子节点…