【SpringCloud14】SpringCloud Bus消息总线

news2024/10/7 12:22:02

1.概述(对于Config的加深和扩充)

1.1 分布式自动刷新配置功能

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

1.2 Bus两种消息代理

  • RabbitMQ
  • kafka

1.3 作用

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

在这里插入图片描述

1.4 为什么被称为总线

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

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

2.RabbitMQ环境配置

2.1 安装Erlang

2.2安装RabbitMQ

2.3 进入RabbitMQ安装目录下的sbin目录

在这里插入图片描述

2.4 输入以下命令启动管理功能

命令: rabbitmq-plugins enable rabbitmq_management
在这里插入图片描述

可视化插件
在这里插入图片描述

2.5 访问地址查看是否安装成功

地址:localhost:15672

2.6登录

账号密码:guest/guest
在这里插入图片描述

3.SpringCloud Bus动态刷新全局广播

3.1 必须具备RabbitMQ环境

3.2 新建cloud-config-client-3366

3.3.1 POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.springcloud</groupId>
        <artifactId>cloud2022</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-config-client-3366</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <!--config客户端-->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3.3.2 YML

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

management:
  endpoints:
    web:
      exposure:
        include: "*"

3.3.3 启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: ${DATE} ${TIME}
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3366 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3366.class, args);
    }
}

3.3.4 Controller

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/17 10:35
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

3.3 设计思想

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

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

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

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

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

新增POM

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

在这里插入图片描述

新增YML

  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

在这里插入图片描述

##rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

在这里插入图片描述
问题: 为什么是bus-refresh?
答案: 官网给的图
在这里插入图片描述

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

新增POM

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

在这里插入图片描述

新增YML

  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

在这里插入图片描述

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

新增POM

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

在这里插入图片描述

新增YML

  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

在这里插入图片描述

3.7 测试

运维工程师的操作

修改Gitee上配置文件增加版本

在这里插入图片描述

发送POST请求

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

查看配置中心

命令: http://localhost:3344/configInfo
初始状态:
在这里插入图片描述

查看客户端

命令: http://localhost:3355/configInfo
初始状态:
在这里插入图片描述

命令: http://localhost:3366/configInfo
初始状态:
在这里插入图片描述

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

发送请求: curl -X POST "http://localhost:3344/actuator/bus-refresh"
在这里插入图片描述
再次查看配置中心3344
在这里插入图片描述
再次查看客户端3355
在这里插入图片描述

再次查看客户端3366
在这里插入图片描述

结论: 获取的配置信息,全部都已经刷新了

在这里插入图片描述

4.SpringCloud Bus动态刷新定点通知

此时只想通知其中一个,其他的不通知,进行差异化处理

实现案例: 只通知3355,不通知3366

概括: 指定具体某一个实例生效而不是全部
公式: http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}

/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数类指定需要更新配置的服务或实例

4.1 案例

在gitee上修改配置
在这里插入图片描述
定点选择刷新,让3355更新
命令: curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
在这里插入图片描述
客户端3355
在这里插入图片描述
客户端3366
在这里插入图片描述

4.2 总结

在这里插入图片描述

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

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

相关文章

Web(八)

XML概念&#xff1a;Extensible Markup Language 可扩展标记语言可扩展&#xff1a;标签都是自定义的。 <user> <student>功能* 存储数据1. 配置文件2. 在网络中传输xml与html的区别1. xml标签都是自定义的&#xff0c;html标签是预定义。2. xml的语法严格&#xf…

使用 npm 包

小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用npm包有如下3个限制: ① 不支持 依赖于Node.js内置库 的包 ② 不支持 依赖于浏览器内置对象 的包 ③不支持 依赖于C插…

代码签名证书是如何进行验证工作的

代码签名证书是通过对代码的数字签名来标识软件来源以及软件开发者的真实身份&#xff0c;保证代码在签名之后不被恶意篡改。使用户在下载已经签名的代码时&#xff0c;能够有效的验证该代码的可信度&#xff1b;同时证书又分为个人型&#xff08;iv&#xff09;、企业型&#…

进程大杂烩

1、fork函数的使用 使用fork()函数创建一个进程 pid_t fork(void) fork函数调用成功&#xff0c;返回两次 返回为0&#xff0c; 代表当前进程是子进程 返回为正数&#xff0c;代表当前进程为父进程 fork()函数运行后会创建一个进程&#xff0c;加上开始的进程一共有两个进程&am…

第一天总结 之 用户管理界面的实现 之 模糊查询和分页操作

第一天总结 之 用户管理界面的实现 之 模糊查询和分页操作 1、明确页面的跳转 当登录操作执行时 如果正确 跳转到 UserFuzzySelectServlet 即用户模糊查询的select 注&#xff1a;因为第一次写项目 对于很多操作都不熟悉 很多前期操作没 有 按着 见名之意 …

迎兔年 贺新春 | vLive虚拟直播新年场景上线!

为了带来更为舒适的用户体验给用户提供更好的线上活动品质vLive虚拟直播2.3.1版本进行了优化升级还有多个新春场景上新全新升级的vLive又增添了哪些亮点一起来快速了解一下吧场景上新&#xff1a;新春活动更出彩农历新春降至如何让拜年视频更出众&#xff1f;如何让新年直播更精…

【C++】为什么C++会支持函数重载

文章目录 函数重载 1.概念 2.支持函数重载的原理 2.1准备知识 2.2原理 函数重载 1.概念 在C语言中&#xff0c;是不允许同名函数存在的。但是在一个作用域种&#xff0c;比如加法函数&#xff0c;想要实现各种类型的数据相加&#xff0c;要定义多个函数&#xff0c;但是…

设计模式-七大原则

设计模式 聚合 设计模式追求的是 1.代码重用性&#xff08;相同功能的代码不用重复编写&#xff09; 2.可读性&#xff08;规范性&#xff0c;便于其他程序员阅读和理解&#xff09; 3.可扩展性&#xff08;增加新的功能非常方便&#xff09; 4.可靠性&#xff08;增加新的…

【国产可编程逻辑控制器plc调研】

国产可编程逻辑控制器plc调研1 高性能PLC&#xff08;ACxxx系列&#xff09;2 中型PLC&#xff08;AMx00系列&#xff09;3 小型PLC&#xff08;HxU、HxS&#xff09;4 小型紧凑型PLC&#xff08;Easy&#xff09;[新品]总结由于有国产化的需求&#xff0c;所以调研了一家国内的…

Internet Download Manager2023下载器Win系统经典下载工具

IDM下载器是一款非常经典的多线程下载工具&#xff0c;广受国内外用户喜爱。该软件专注于文件下载&#xff0c;没有任何多余功能&#xff0c;也没有烦人的弹窗广告打扰&#xff0c;简单易操作。特别是站点抓取功能&#xff0c;对于网站整站下载非常的好用。 整站下载器有很多&…

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景&#xff1a;防止恶意IP尝试ssh登录 脚本说明&#xff1a;将密码输入错误超过四次得ip地址通过iptable防火墙访问。 分析&#xff1a; 首先&#xff0c;需要知道ssh远程访问记录在哪一个文件中 /var/log/secure其次&#xff0c;模拟远程访问输错密码&#xff0c;查…

数字化+智能化,低代码平台助力能源行业创新赋能

编者按&#xff1a;能源行业数字化转型需求发杂&#xff0c;定制化要求高&#xff0c;低代码平台对于能源行业来说可谓是“专业对口”。本文分析了能源行业数字化转型的痛点和需求&#xff0c;并进一步指出低代码平台的在能源行业中的应用价值&#xff0c;最后介绍了老牌低代码…

破解版IDM导致电脑反复闪屏的解决方案

破解版IDM导致电脑反复闪屏的解决方案 概括&#xff1a; 进入安全模式&#xff0c;卸载IDM&#xff0c;结束 文章目录破解版IDM导致电脑反复闪屏的解决方案问题原因解决方式&#xff1a;问题原因 在使用IDM(Internet Download Manager)的破解版下载文件时突然电脑闪屏&#…

分享5款开年必备的工具软件

最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧时间整理出几个好用的软件&#xff0c;希望可以帮到大家。 1. 影像处理——GIMP GIMP 提供了各种的影像处理工具&#xff0c;滤镜&#xff0c;还有许多的组件模块&#xff0c;对于要制作一个又酷又炫的网页按钮或网…

华为机试题:HJ15 求int型正整数在内存中存储时1的个数(python)

文章目录知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。2、print() &#xff1a;打印输出。3、int() &#xff1a;将一个字符串或数字转换为十进制整数&#xff08;强转&#xff09;。输入可以指定进制&#xff0c;…

JUC面试(二)——JUCJMMvolatile 2.0

JUC&JMM JMM 不保证原子性 各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一个线程AAA修改了共享变量X的值&#xff0c;但是还未写入主内存时&#xff0c;另外一个线程BBB又对主内存中同一共享变量…

【项目实战】基于XStream实现漏洞信息数据(XML格式)的手动导入功能

一、背景 项目中需要实现漏洞信息数据的手动导入功能 以下是导入的XML文件所在地址&#xff1a;https://www.cnnvd.org.cn/home/loophole 二、实现思路 &#xff08;1&#xff09;前端实现&#xff08;ElementUIAvue&#xff09; &#xff08;2&#xff09;后端实现 三、…

一文读懂eslint和prettier

为什么会有eslint和prettier&#xff0c;他们有什么作用 首先&#xff0c;工具的出现都是为了解决一定的问题。 团队写代码风格不一样&#xff0c;书写方式不一致&#xff0c;导致整个项目同一类型代码出现多种写法&#xff0c;或者不严谨、或者不美观。或者是提交git时&#…

秒杀功能、高并发系统关注的问题、秒杀系统设计-59

一&#xff1a;秒杀 1.1 特点 秒杀具有瞬间高并发的特点&#xff0c;针对这一特点&#xff0c;必须要做限流 异步 缓存 &#xff08; 页面静态化&#xff09;。 1.2 限流方式 前端限流&#xff0c;一些高并发的网站直接在前端页面开始限流&#xff0c;例如&#xff1a;小…

Python 生成 svg 图片,一篇博客带你掌握 Python 与 svg 之间的操作

python svgwritePython 操作 SVG 图片的库清单svgwrite 库svgwrite 库其他图形绘制储备反爬技术 svgwrite 生成一个手机号Python 操作 SVG 图片的库清单 在 Python 中&#xff0c;可以使用以下几种库来生成 SVG 图片&#xff1a; svgwrite&#xff1a;这是一个简单易用的 Pyt…