• SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus


    1. 消息总线简介

    消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。

    消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。

    什么是 Spring Cloud Bus
    在这里插入图片描述

    Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。

    Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。

    什么时候使用 Spring Cloud Bus

    微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。

    总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。

    2. rabbitMQ环境配置

    1. 安装ErIong

    下载Windows安装包,并双击安装
    https://www.erlang.org/downloads
    在这里插入图片描述

    安装完成后配置环境变量
    在这里插入图片描述
    在这里插入图片描述

    使用cmd命令,输入 erl -version 验证:
    在这里插入图片描述

    2. 安装rabbitMQ

    在RabbitMQ的gitHub项目中,下载window版本的服务端安装包。
    https://www.rabbitmq.com/install-windows.html#installer
    在这里插入图片描述
    接着到双击安装,一直点下一步安装即可,安装完成后,找到安装目录:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.6\sbin
    在这里插入图片描述
    在此目录下打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:

    然后双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQ正在运行:

    这时,打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest
    在这里插入图片描述
    到这一步,安装就大功告成了!
    在这里插入图片描述

    3. Bus动态刷新全局广播的设计思想和选型

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

    1. 新建cloud-config-client-3366
    2. 添加pom依赖
    3. 修改bootstrap.yaml
    4. 创建主启动类
    5. 编写业务类,简单起见只使用controller
    @RestController
    @RefreshScope
    public class ConfigClientController {
        @Value("${server.port}")
        private String serverPort;
        @Value("${config.info}")
        private String configInfo;
        @GetMapping("/configInfo")
        public String configInfo(){
            return "serverPort: "+serverPort+"\t\n\n configInfo: "+configInfo;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    bus消息总线实现的两种设计思想
    1. 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
      在这里插入图片描述

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

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

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

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

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

    4. Bus动态刷新全局广播配置实现

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

    1. 引入消息总线rabbitMQ支持

    
    <dependency>
    	<groupId>org.springframework.cloudgroupId>
    	<artifactId>spring-cloud-starter-bus-amqpartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 在yaml配置文件中添加rabbitMQ相关配置

    #rabbitmq相关配置
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest
      
    #rabbitmq相关配置,暴露bus刷新配置的端点
    management:
      endpoints:
        web:
          exposure:
            include: "bus-refresh"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2. 给配置中心客户端(cloud-config-client-3355/3366)添加消息总线支持

    1. 引入消息总线rabbitMQ支持

    
    <dependency>
    	<groupId>org.springframework.cloudgroupId>
    	<artifactId>spring-cloud-starter-bus-amqpartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 在yaml配置文件中添加rabbitMQ相关配置

    #rabbitmq相关配置
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3. 测试配置修改及更新
    1. 启动7001(注册中心)、3344(配置中心-服务端)、3355(配置中心-客户端)、3366(配置中心-客户端)
    2. 修改配置文件信息,并发送POST刷新请求
    curl -X POST "http://localhost:3344/actuator/bus-refresh"
    
    • 1
    1. 获取信息,查看是否生效
    • 配置中心:http://config-3344.com:3344/config-dev.yml
    • 客户端:http://localhost:3355/configlnfo、http://localhost:3366/configInfo

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

    5. 动态刷新定点通知

    不想全部通知,只想定点通知:只通知3355,不通知3366,指定具体某一个实例生效而不是全部

    公式:http://localhost:port/actuator/bus-refresh/{destination}

    localhost:配置中心-服务端的IP地址或域名
    port:配置中心-服务端的端口号
    destination:需要通知的目标服务(配置中心-客户端)${服务名-端口号}
    例:curl -X POST http://localhost:3344/actuator/bus-refresh/{config-client:3355}" ,这样就只会通知3355客户端刷新配置。
    在这里插入图片描述

  • 相关阅读:
    verilog 实现常用加法器
    【计算机网络】HTTPS协议
    景联文科技:关于语音标注,你知道多少?
    计算机组成原理第二章----数据信息的表示 详解版(写的这么接地气我一下就懂了?)
    Pyspark学习笔记小总
    LT1931
    【C++】string类模拟实现下篇(附完整源码)
    autosar 诊断入门
    《安富莱嵌入式周报》第275期:2022.07.18--2022.07.24
    基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
  • 原文地址:https://blog.csdn.net/QIANG_HAO/article/details/127980376