IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 「SpringCloud」09 Bus消息总线 -> 正文阅读

[Java知识库]「SpringCloud」09 Bus消息总线

SpringCloud—Bus消息总线

笔记整理自【尚硅谷】周阳SpringCloud框架开发教程

bus
image-20220801123922304

1. 概述

上一章我们讲了Config,其所能达到的极限也只是通过发送一个POST请求,手动版的实现动态刷新。 我们想解决这样的几个情形:

  • GitHub上的配置文件修改后,可否广播一下,不用每个微服务都通过发送POST请求动态刷新。
  • 差异化的管理,该刷新的刷新,不该刷新的不刷新(定点清除,精确通知)

带着这些问题,我们来到本章Bus的学习,它是对Config的增强。

Ⅰ. Bus是什么

想实现:分布式自动刷新配置功能

Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。

image-20220908122400627

Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。

Spring Cloud Bus目前支持RabbitMQKafka

Ⅱ. Bus能做什么

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

Image

Ⅲ. 为什么被称为总线

什么是总线

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

基本原理

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

image-20220908164903281

2. RabbitMQ环境配置

Ⅰ. 安装Erlang

下载地址

我下载的是跟老师一样版本的21.3

image-20220908124746974

注意安装目录不要有中文和空格,以管理员身份安装,安装步骤默认安装即可。

img

安装Erlang后会自动修改系统变量,但是需要重启系统才能生效。我们可以手动设置系统变量不重启。

cmd中输入以下命令:

C:\Users\Administrator>set ERLANG_HOME=D:\RabbitMQ\erl10.3\bin (自己的安装路径)

或者是在系统环境变量中手动添加。

Ⅱ. 安装RabbitMQ

下载地址

我下载的也是老师的版本3.7.14

注意这里不要安装到有空格或中文的目录下,例如:D:\Program Files,否则会在后面无法安装可视化插件。

进入RabbitMQ安装目录下的sbin目录:D:\RabbitMQ\rabbitmq_server-3.7.14\sbin

image-20220908152038159

打开cmd输入如下命令:

rabbitmq-plugins enable rabbitmq_management

image-20220908152159890

这样就可以添加并使用可视化插件了。

image-20220908152750936

以管理员身份启动start,不然会报错。

然后测试是否安装成功:http://localhost:15672/

image-20220908152827342

账号密码都是guest,安装成功!

image-20220908153037389

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

必须先具备良好的RabbitMQ环境。

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

  • 建Module

    cloud-config-client-3366

  • 改POM

    复制3355的即可。

  • 写YML

    bootstrap.yml

    复制3355,改下端口号即可。

  • 主启动

    image-20220908155939844

  • 业务类

    image-20220908155844512

设计思想

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

    image-20220908160225561

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

    image-20220908160158602

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

    打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。

    破坏了微服务各节点的对等性。

    有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。

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

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

    image-20220908161223178

  • 写YML

    image-20220908161707812

2?? 给cloud-config-client-3355客户端添加消息总线支持
  • 改POM

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

    注意对齐,rabbitmq是跟application、cloud对齐的。

    image-20220908162312212

3?? 给cloud-config-client-3366客户端添加消息总线支持
  • 改POM

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

    跟上面3355一样。

测试

  • 运维工程师

    ? 修改Github上配置文件增加版本号

    ? 发送POST请求

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

    ? 一次发送,处处生效

  • 配置中心

    ? http://config-3344.com:3344/config-dev.yml

  • 客户端

    ? http://localhost:3355/configInfo

    ? http://localhost:3366/configInfo

    ? 获取配置信息,发现都已经刷新了

一次修改,广播通知,处处生效 O(∩_∩)O

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

不想全部通知,只想定点通知

  • 只通知3355,不通知3366

  • 简单一句话:指定具体某一个实例生效而不是全部

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

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

  • 案例

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

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

    image-20220908163837985

5. 流程总结

image-20220908164607944

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:59:34  更:2022-09-13 11:00:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:32:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码