zoukankan      html  css  js  c++  java
  • Bus消息总线

    SpringCloud Bus消息总线

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

    Spring Cloud Bus目前支持RabbitMQ和kafka。

    什么是总线

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

    基本原理

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

    RabbitMQ环境配置

    安装Erlang

    安装RabbitMQ(按照网上的教程进行配置)

    在浏览器输入http://localhost:15672

    image-20201102213608708

    用户名和密码都是:guest guest

    image-20201102213649782

    Bus动态刷新全局广播设计思想

    1. 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置。(不合适)
    2. 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置。

    因为第一种打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。破坏了微服务各节点的对等性。有一定的局限性。

    创建一个子项目(cloud-config-client-3366)

    pom.xml

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

    创建application.yml配置文件

    server:
      port: 3366
    
    spring:
      application:
        name: config-client
      cloud:    #客户端配置
        config:
          label: master   #分支名称
          name: config    #配置文件名称
          profile: dev    #读取后缀名称
          uri: http://localhost:3344    #配置中心地址
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    #暴露端口
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    

    创建主启动类ConfigClientMain3366

    @SpringBootApplication
    @EnableEurekaClient
    public class ConfigClientMain3366 {
        public static void main(String[] args) {
            SpringApplication.run(Configuration.class,args);
        }
    }
    

    业务类ConfigClientController

    @RestController
    @RefreshScope       //自动刷新
    public class ConfigClientController {
        @Value("${server.port}")
        private String serverPort;
        @Value("${config.info}")
        private String configInfo;
        @GetMapping("/configInfo")
        public String getConfigInfo() {
            return "serverPort:"+serverPort+"configInfo :"+configInfo;
        }
    }
    

    Bus动态刷新全局广播实现

    给子项目(3344,3355,3366)添加总线支持

    pom.xml

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

    修改子项目(3344)application.yml配置文件

    #rabbitmq相关依赖
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    management:     #暴露bus相关端点
      endpoints:
        web:
          exposure:
            include: 'bus-refresh'
    

    修改子项目(3355)的yml配置文件

    rabbitmq:     #15672是Web管理界面的端口,5672是Mq访问端口
        host: localhost
        port: 5672
        username: guest
        password: guest
    

    修改子项目(3366)的yml配置文件

    rabbitmq:     #15672是Web管理界面的端口,5672是Mq访问端口
        host: localhost
        port: 5672
        username: guest
        password: guest
    

    win+r打开dos界面输入

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

    只需要刷新界面就可以修改配置

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

    Bus动态刷新定点通知

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

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

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

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

  • 相关阅读:
    Windows SDK 之 mciSendString最后一个参数
    java常用包下载地址(非maven)
    windows api(GDI)实现图片旋转
    windows sdk版本 之 并查集生成迷宫
    自签https证书2(适配新版chrome,不会显示“不安全”)
    数据结构——栈(Stacks)
    数据结构——表(list)
    数据结构——链表(linkedlist)
    解题报告1010 诡秘的余数
    函数体中用指针返回数组的方法
  • 原文地址:https://www.cnblogs.com/striver20/p/13966772.html
Copyright © 2011-2022 走看看