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


    SpringCloud Bus概述

    概述

    Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于实现微服务架构中的消息总线。它利用了轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件,实现了在分布式系统中的消息传递和事件广播。

    Spring Cloud Bus旨在简化微服务架构中的配置管理和状态同步。它允许将配置更改或状态更新广播到整个分布式系统中的各个微服务实例。通过使用消息总线,微服务可以轻松地获取最新的配置信息,并且能够了解其他微服务的状态变化。

    作用

    • 配置的集中管理: Spring Cloud Bus与Spring Cloud Config(配置中心)集成,可以实现集中式的配置管理。当配置发生变化时,只需更新配置中心的配置,Spring Cloud Bus会将新的配置信息广播给所有订阅了消息总线的微服务。

    • 快速的配置更新: 通过使用消息总线,配置的更新可以迅速传播到整个分布式系统中的所有微服务实例,而无需每个微服务都主动去拉取配置。这样可以减少配置更新的延迟,提高系统的响应速度。

    • 系统状态的同步: Spring Cloud Bus不仅可以用于配置的更新,还可以用于系统状态的同步。当一个微服务的状态发生变化时,它可以通过消息总线广播给其他微服务,从而实现微服务之间的状态同步。

    • 可扩展的消息传递: Spring Cloud Bus提供了灵活的扩展机制,可以与其他Spring Cloud组件无缝集成。例如,可以与Spring Cloud Stream(消息驱动的微服务)集成,实现更高级的消息传递模式。

    在这里插入图片描述

    基本原理

    Spring Cloud Bus的原理是基于消息代理和事件广播机制。

    • 消息代理: Spring Cloud Bus使用轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件。消息代理负责接收和分发消息,并确保消息的可靠传递。微服务通过连接到消息代理,可以发送和接收消息。

    • 事件广播: 当一个微服务的配置发生变化或状态发生改变时,它会将这些变化作为消息发送到消息代理。消息代理将这些消息广播给所有订阅了消息总线的微服务。这样,其他微服务就能够接收到这些变化,并及时做出相应的响应。

    安装RabbitMQ

    • *安装Erlang
      下载地址:http://erlang.org/download/otp_win64_21.3.exe,下载完成后点击安装即可。
    • 安装RabbitMQ
      下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14.exe​​​​​,下载完成后点击安装。

    安装RabbitMQ后进入sbin目录下
    在这里插入图片描述
    执行命令rabbitmq-plugins enable rabbitmq_management
    启动mq,如下图就启动成功
    在这里插入图片描述
    访问地址http://localhost:15672/ 如下图
    在这里插入图片描述
    账号密码都为,guest
    在这里插入图片描述

    Demo配置

    新建模块cloud-config-client-3366

    在这里插入图片描述

    pom.xml

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-configartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
                <scope>runtimescope>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    bootstrap.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 #配置中心地址
    
    # 暴露监控端点
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    #服务注册到eureka地址
    eureka:
      instance:
        # 配置eureka的状态显示
        hostname: localhost
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      client: #服务提供者provider注册进eureka服务列表内
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://eureka7001.com:7001/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    启动类

    @EnableEurekaClient
    @SpringBootApplication
    public class ConfigClientMain3366 {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientMain3366.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    controller

    @RestController
    @RefreshScope //Spring Cloud 提供的用于动态刷新配置的注解,会在调用 /actuator/refresh 接口时重新加载配置并更新 configInfo 的值。
    public class ConfigClientController {
    
        @Value("${spring.cloud.config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    配置中心3344添加消息总线支持

    pom.xml

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

    bootstrap.yml

    ##rabbitmq相关配置,暴露bus刷新配置的端点
    management:
      endpoints: #暴露bus刷新配置的端点
        web:
          exposure:
            include: 'bus-refresh'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    客户端3355,3366添加消息总线支持

    pom.xml

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

    bootstrap.yml修改后

    server:
      port: 3355
    
    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 #配置中心地址
      #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    
    # 暴露监控端点
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    #服务注册到eureka地址
    eureka:
      instance:
        # 配置eureka的状态显示
        hostname: localhost
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      client: #服务提供者provider注册进eureka服务列表内
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://eureka7001.com:7001/eureka
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    测试

    修改gitee上的配置,config info version由2改为3提交

    在这里插入图片描述

    发送POST请求来触发刷新

    http://localhost:3344/actuator/bus-refresh
    
    • 1

    在这里插入图片描述

    查看客户端结果

    3355和3366均已成功更新
    在这里插入图片描述
    在这里插入图片描述

    动态刷新定点通知

    不想全部通知,只想定点通知:只通知3355,不通知3366

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

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

    案例:

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

    http://localhost:3344/actuator/bus-refresh/config-client:3355
    
    • 1
  • 相关阅读:
    Mac环境下jupyter添加nbextension插件
    C#WPF动态资源和静态资源应用实例
    基于STM32室内空气净化监测系统设计
    vue2配置环境变量并且nginx运行成功
    【系统分析师之路】第五章 复盘软件工程(软件过程改进)
    国内外各大物联网IoT平台鸟瞰和资源导航
    UE4 回合游戏项目 18- 退出战斗
    【u-boot】u-boot的驱动模型分析
    机器学习笔记之高斯网络(一)基本介绍
    Mysql中的锁机制
  • 原文地址:https://blog.csdn.net/qq_33129875/article/details/131010720