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

      为了解决SpringcloudConfig更新服务配置的问题,引入bus消息总线。bus是对config的加强。

       Bus是用来将分布式系统的节点与轻量消息系统连接起来的框架。它整合了Java的事件处理机制和消息中间件的功能。SpringcloudBus目前支持RabbitMQ与Kafka。

    1.简介

    1.总线

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

    2.基本原理

    客户端都连接MQ中同一个主题,默认是(SpringCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入topic中,这样其他监听同一topic的服务就能得到通知,然后更新自身的配置。

    2.RabbitMQ安装环境搭建

    参考: https://www.cnblogs.com/qlqwjy/p/13909962.html

    3.设计思想

      其实有两种方式。

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

    2.利用消息总线触发一个ConfiguServer的/bus/refresh 端点,而刷新所有客户端的配置。如下图:

     4.开始搭建

      采用上面设计思想二搭建。

    1.修改configserver配置中心

    1.引入pom

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

    2.修改yml,增加rabbitmq配置

    server:
      port: 3344
    
    spring:
      application:
        name:  cloud-config-center #注册进Eureka服务器的微服务名
      cloud:
        config:
          server:
            git:
              uri: https://github.com/qiao-zhi/springcloud-config.git #GitHub上面的git仓库名字
            ####搜索目录
              search-paths:
                - springcloud-config
    #            默认的分支,如果不配置的话默认是master分支
    #          default-label: dev
    #          username: 公有的不需要账号密码
    #          password: 公有的不需要账号密码
          ####读取分支
          label: master
    
      #rabbitmq相关配置
      rabbitmq:
          host: 192.168.99.100
          port: 5672
          username: guest
          password: guest
    
    #服务注册到eureka地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    ##rabbitmq相关配置,暴露bus刷新配置的端点
    management:
      endpoints: #暴露bus刷新配置的端点
        web:
          exposure:
            include: 'bus-refresh'

    2. 修改configclient 客户端

    1.引入pom

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

    2.修改yml增加rabbitmq配置

    server:
      port: 3355
    
    spring:
      application:
        name: config-client
      cloud:
        #Config客户端配置
        config:
          label: master #分支名称
          name: config #配置文件名称
          profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
          uri: http://localhost:3344
      #rabbitmq相关配置
      rabbitmq:
          host: 192.168.99.100
          port: 5672
          username: guest
          password: guest
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka/
    
    # 暴露监控端点(可以暴露健康状态等,这里暴露所有)
    management:
      endpoints:
        web:
          exposure:
            include: "*"

     3.新增一个客户端cloud-config-client-3356

    1.新建模块

     2.修改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">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>cn.qz.cloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-config-client-3356</artifactId>
    
        <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>cn.qz.cloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </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>
            <!--eureka client-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</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.增加bootstrap.yml

    server:
      port: 3356
    
    spring:
      application:
        name: config-client
      cloud:
        #Config客户端配置
        config:
          label: master #分支名称
          name: config #配置文件名称
          profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
          uri: http://localhost:3344
      #rabbitmq相关配置
      rabbitmq:
          host: 192.168.99.100
          port: 5672
          username: guest
          password: guest
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka/
    
    # 暴露监控端点(可以暴露健康状态等,这里暴露所有)
    management:
      endpoints:
        web:
          exposure:
            include: "*"

    4.主启动类

    package cn.qz.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 8:45 2020/11/9
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class ConfigClientMain3356 {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientMain3356.class, args);
        }
    }

    5.业务类: 就是从3344配置中心读取一个配置

    package cn.qz.cloud.controller;
    
    import cn.qz.cloud.utils.JSONResultUtil;
    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;
    
    @RestController
    @RefreshScope
    public class ConfigClientController {
    
        @Value("${config.info}")
        private String configInfo;
    
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping("/configInfo")
        public JSONResultUtil<String> configInfo() {
            String result = "serverPort: " + serverPort + ";configInfo: " + configInfo;
            return JSONResultUtil.successWithData(result);
        }
    }

    4.测试:

    (1)查看git配置中心目前的master分支 config-dev.yml  内容如下:

    config:
      info: master-dev,版本:4

    (2) 从3355、3356 分别查看信息

    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3355/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   2127      0 --:--:-- --:--:-- --:--:--  6250{"success":true,"code":"200","msg":"","data":"serverPort: 3355;configInfo: master-dev,版本:4"}
    
    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3356/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   1612      0 --:--:-- --:--:-- --:--:--  3225{"success":true,"code":"200","msg":"","data":"serverPort: 3356;configInfo: master-dev,版本:4"}

    (3) git上配置中心修改config-dev.yml  内容如下:

    config:
      info: master-dev,版本:5

    (4)向配置中心推送刷新请求:这里需要注入访问的是配置中心

    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl -X POST http://localhost:3344/actuator/bus-refresh
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:--  0:00:41 --:--:--     0

    (5)从3355、3356 分别查看信息:可以看到配置已更新

    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3355/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   1612      0 --:--:-- --:--:-- --:--:--  3225{"success":true,"code":"200","msg":"","data":"serverPort: 3355;configInfo: master-dev,版本:5"}
    
    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3356/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   1612      0 --:--:-- --:--:-- --:--:--  2127{"success":true,"code":"200","msg":"","data":"serverPort: 3356;configInfo: master-dev,版本:5"}

    (6)再次git上配置中心修改config-dev.yml  内容如下:

    config:
      info: master-dev,版本:6

    (7) 实现刷新定点通知:只刷新3355服务

    地址:  http://配置中心ip:端口/actuator/bus-refresh/{destination}

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

    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl -X POST http://localhost:3344/actuator/bus-refresh/config-client:3355
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:--  0:00:34 --:--:--     0

    (8)从3355、3356分别查看

    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3355/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   3125      0 --:--:-- --:--:-- --:--:--  6250{"success":true,"code":"200","msg":"","data":"serverPort: 3355;configInfo: master-dev,版本:6"}
    
    liqiang@root MINGW64 /e/IDEAWorkSpace
    $ curl http://localhost:3356/configInfo
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   100    0   100    0     0   3225      0 --:--:-- --:--:-- --:--:--   97k{"success":true,"code":"200","msg":"","data":"serverPort: 3356;configInfo: master-dev,版本:5"}

    5.总结

    上面的操作流程实际是,git上配置更新后,3344配置中拉取代码,之后我们触发事件。向RabbitMQ推送更新事件,其他客户端监听RabbitMQ的队列,有更新事件监听到就去配置中心更新配置。

    从RabbitMQ查看交换机和队列如下:

    1.交换机:可以看到是topic类型

     2.对列:

     查看其中一个队列信息:可以看到RoutingKey是#,也就是所有消息都接收。

  • 相关阅读:
    Module build failed: Error: Cannot find module 'node-sass'报错问题
    vue element upload
    vue-element-table 分页选中
    两种倒计时
    【LOJ #6076】「2017 山东一轮集训 Day6」三元组(莫比乌斯反演 / 三元环计数)
    【LOJ #6075】「2017 山东一轮集训 Day6」重建(DP)
    【2020省选模拟】题解
    【LOJ #6074】「2017 山东一轮集训 Day6」子序列(矩阵乘法)
    【LOJ #6073】「2017 山东一轮集训 Day5」距离(主席树 / 树链剖分)
    【LOJ #6072】 「2017 山东一轮集训 Day5」苹果树(容斥 / 搜索 / 矩阵树定理)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/13861423.html
Copyright © 2011-2022 走看看