7--SpringCloud:Config/Bus周阳老师

2021:7--SpringCloud:Config/Bus

https://www.cnblogs.com/coderD/p/14350076.html SpringCloud

https://www.cnblogs.com/coderD/p/14350073.html SpringCloud 和 Eureka

https://www.cnblogs.com/coderD/p/14350082.html SpringCloud 和 Zookeeper

https://www.cnblogs.com/coderD/p/14350086.html SpringCloud-Ribbon/OpenFeign

https://www.cnblogs.com/coderD/p/14350091.html SpringCloud:Hystrix 断路器

https://www.cnblogs.com/coderD/p/14350097.html SpringCloud:服务网关 gateway

https://www.cnblogs.com/coderD/p/14350099.html SpringCloud:Config/Bus

https://www.cnblogs.com/coderD/p/14350103.html SpringCloud:Stream/Sleuth

https://www.cnblogs.com/coderD/p/14350110.html SpringCloud Alibaba:Nacos

https://www.cnblogs.com/coderD/p/14350114.html SpringCloud Alibaba:Sentinel

https://www.cnblogs.com/coderD/p/14350119.html SpringCloud Alibaba:Seata

代码:https://gitee.com/xue--dong/spring-cloud

阳哥脑图:https://gitee.com/xue--dong/spring-cloud

1. Config

1.1 我们当前分布式系统面临的一些问题

img

1.  我们的模块越来越多,每个模块都要写一个application.yml。

    我们想象这样一种情况:
        10个微服务都要连接同一个数据库,我们在这10个微服务都配置了连接数据库yml。
        当这个数据库发生了变化,怎么办?
        修改10个yml。
        如果是100个微服务都连接这个数据库呢?

    东西多了,就要有统一个管理。
    
2.  上线后,发布版本了。
    
    有生产环境,有测试环境,预发布版本环境。
    那么就是3套的配置的管理系统和业务要求,一个配置文件不满足。
    
3.  集中式的管理这些配置
    
    微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会
    出现大量的服务。
    由于每个服务都需要必要的配置信息才能运行,所以一套集中式,动态的配置管理设施是必不可少的。
    我们每个微服务自己带着一个application.yml,上百个配置文件的管理...
    
    SpringCloud提供了ConfigServer来解决这个问题。
复制代码

1.2 Config 是什么

img

    SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持(Git/GitHub),
    配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置(Config Server)。
    
    统一共用的放在配置中心,各自特有的再单独配置。
复制代码

1.3 怎么用

    SpringCloud Config分为服务端和客户端两部分
    
    服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,
    加密/解密信息等访问接口。
    
    客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取
    和加载配置信息。
    配置服务器默认采用git来存储信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便
    的管理和访问配置内容。
复制代码

1.4 能干嘛

    集中管理配置文件
    
    不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
    
    运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取
    配置自己的信息
    
    当配置发生变化时,服务不需要重启即可感知到配置的变化并应用新的配置。
    
    将配置信息以REST接口的形式暴露。
    
    
    与GitHub整合配置
        由于SpringCloud Config默认使用Git来存储配置文件,虽然也支持SVN。但是最推荐的还是
        Git,而且使用的是http/https访问的形式。
复制代码

2. Config 配置总控中心的搭建

2.1 模拟环境

    1.  在GitHub上新建一个springcloud-config仓库
    
    2.  获得第一步创建的仓库地址
    
        https://github.com/ttxxll/springcloud-config.git
        
    3.  本地硬盘目录上新建git仓库并clone
    
    4.  此时在本地D盘符下E:\44\SpringCloud2020
复制代码

img

img

        表示多个环境的配置文件
        
        保存格式必须为UTF-8
        
        如果需要修改,此处模拟运维人员操作git和github
            git add
            git commit -m "init yml"
            git push origin master
复制代码

2.2 Config 服务端配置与测试

    1.  建模块
    
        cloud-config-center3344
        
    2.  pom
        添加config-server依赖:该模块是一个配置中心。
复制代码
        <!--添加config-server依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
复制代码
    <dependencies>

        <!--eureka server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--添加config-server依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!--web/actuator这两个一般一起使用,写在一起-->
        <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>
复制代码
    3.  application.yml
复制代码
    server:
      port: 3344
    
    spring:
      application:
        name: cloud-config-center # 注册进eureka服务器的微服务名
      cloud:
        config:
          server:
            git:
              uri: https://github.com/ttxxll/springcloud-config.git
              # 搜索目录
              search-paths:
                - springcloud-config
    
          # 读取分支
          label: master
    
    # 服务注册到eureka地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
      instance:
        instance-id: cloud-config-server
        prefer-ip-address: true
复制代码
    4.  主启动类
    
        @EnableConfigServer : 开启配置服务中心
复制代码
        @SpringBootApplication
        @EnableConfigServer
        public class ConfigCenterMain3344 {
        
            public static void main(String[] args) {
                SpringApplication.run(ConfigCenterMain3344.class, args);
            }
        }
复制代码

这里注意一下:我没有加 @EnableEurekaClient 注解,这个服务依然注册进 eureka 注册中心了。

        网上查到这一句话:不确定真伪。
        通过 :
复制代码
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
复制代码
            依赖,可以省略这两个注解,而可以根据yml文件直接向eureka里面注册。
            
            
    
    5.  windows下修改hosts文件,增加映射
        127.0.0.1  config-3344.com
复制代码

img

    6.  测试通过Config微服务是否可以从GitHub上获取配置内容
    
        1.  启动微服务3344
        
        2.  发送请求:
            http://config-3344.com:3344/master/config-dev.yml
            http://localhost:3344/master/config-dev.yml
            
        3.  成功读取到
复制代码

img

        通过Config微服务可以从GitHub上获取配置内容
        
        4.  映射规则
复制代码

img

        5.  我们就将ConfigServer config服务中心和远程仓库之间打通了。
复制代码

img

2.3 配置的读取规则

    /{label}/{application}-{profile}.yml
复制代码

img

    /{application}-{profile}.yml
        默认去找master分支,所以这里不写分支
复制代码

img

    /{application}/{profile}[/{label}]
    
        逆写法
复制代码

img

img

        结果是:JSON串
复制代码

img

2.4 Config 服务端配置与测试

    上面我们的ConfigServer连接上了GitHub,成功的从GitHub上获取到了config信息。
复制代码

img

    1.  新建module
        
        cloud-config-client3355
        
    2.  pom
        添加config-client依赖
复制代码
        <dependencies>
            <!--eureka server-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <!--添加config-client依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    
            <!--web/actuator这两个一般一起使用,写在一起-->
            <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>
复制代码
    3.  yml:bootstrap.yml
        
        为了配置文件的记载顺序和分级管理,我们这里用bootstrap.yml
        
        application.yml使用户籍的资源配置项
        bootstrap.yml是系统级的,优先级更高
        
        SpringCloud会创建一个“Bootstrap Context”,作为Spring应用的`Application Context`的父上下文。
        初始化的时候,`Bootstrap Context`负责从外部源加载配置属性并解析配置。
        这两个上下文共享一个从外部获取的`Environment`
        
        `Bootstrap`属性有高优先级,默认情况下,他们不会被本地配置覆盖。
        `Bootstrap Context`和`Application Context`有着不同的约定,所以新增了一个`bootstrap.yml`文件,
        保证`Bootstrap Context`和`Application Context`配置的分离。
        
        要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml
        是比application.yml先加载的。bootstrap.yml优先级高于application.yml
复制代码

img

    我这里和视频中的不一样:
复制代码
        spring:
          application:
            name: config-client
          cloud:
            config:
              label: master   # 分支名称
              name: config    # 配置文件名称
              profile: dev    # 读取后缀名称 
              uri: http://config-3344:3344 # 配置中心服务器地址
              discovery:  # 对应eureka中的配置中心,默认不写是找config-server
                service-id: cloud-config-center
                enabled: true # 开启读取配置中心的配置,默认是false
        
        eureka:
          client:
            service-url:
              defaultZone: http://localhost:7001/eureka
          instance:
            #instance-id: springcloud-config-client01
            prefer-ip-address: true

复制代码
    4.  主启动类
复制代码
        @SpringBootApplication
        @EnableEurekaClient
        public class ConfigClientMain3355 {
            public static void main(String[] args) {
                SpringApplication.run(ConfigClientMain3355.class, args);
            }
        }
复制代码
    5.  业务类:
        
        SpringCloud Config能将配置信息以REST接口的形式暴露。
复制代码
            @RestController
            public class ConfigClientController {
            
                @Value("${config.info}")
                private String configInfo;
            
                @GetMapping("/configInfo")
                public String getConfigInfo(){
                    return configInfo;
                }
            
            }

复制代码

注意

    6.  启动3355 config client客户端有几个坑

        1.  注意:
            @Value("${config.info}") 根据配置文件中的这些配置:
复制代码
          cloud:
            config:
              label: master   # 分支名称
              name: config    # 配置文件名称
              profile: dev    # 读取后缀名称 
              uri: http://config-3344:3344 # 配置中心服务器地址
              discovery:  # 对应eureka中的配置中心,默认不写是找config-server
                service-id: cloud-config-center
                enabled: true # 开启读取配置中心的配置,默认是false
复制代码
        找到eureka中的配置中心service-id是cloud-config-center的config配置中心,如果不配置
        默认找的service-id是config-server。所以这一定要注意service-id能对应上。
复制代码

img

        2.  注意左起两个空格,不是一个tab
        
        3.  注意:
复制代码
              discovery:  # 对应eureka中的配置中心,默认不写是找config-server
                service-id: cloud-config-center
                enabled: true # 开启读取配置中心的配置,默认是false
复制代码
            开启这两个配置,视频中没有开启。
            
        4.  ConfigClietn的微服务名字必须是:config-client
复制代码

img

img

        5.  我具体的两个yml配置
        
        5.1 3344 ConfigServer配置中心 yml
            
            和github总的仓库建立联系
复制代码
        server:
          port: 3344
        
        spring:
          application:
            name: cloud-config-center # 注册进eureka服务器的微服务名
          cloud:
            config:
              server:
                git:
                  uri: https://github.com/ttxxll/springcloud-config.git
                  # 搜索目录
                  search-paths:
                    - springcloud-config
        
              # 读取分支
              label: master
        
        # 服务注册到eureka地址
        eureka:
          client:
            service-url:
              defaultZone: http://localhost:7001/eureka
          instance:
            instance-id: cloud-config-server
            prefer-ip-address: true
复制代码
        5.2 3355 ConfigClient配置客户端 yml
        
            和3344 ConfigServer配置中心建立联系
复制代码
            server:
              port: 3355
            
            spring:
              application:
                name: config-client
              cloud:
                config:
                  label: master   # 分支名称
                  name: config    # 配置文件名称
                  profile: dev    # 读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取
                  uri: http://config-3344:3344 # 配置中心服务器地址
                  discovery:  # 对应eureka中的配置中心,默认不写是找config-server
                    service-id: cloud-config-center
                    enabled: true # 开启读取配置中心的配置,默认是false
            
            eureka:
              client:
                service-url:
                  defaultZone: http://localhost:7001/eureka
              instance:
                instance-id: config-client
                prefer-ip-address: true
复制代码
        5.3 这样配置好后,第一次启动3355还是报错,再次启动就好了。
            可能是第一次从github中取@Value("${config.info}")会有点慢。
            很奇怪。
            
    
    
    7.  测试成功
复制代码

img

2.3 分布式配置的动态刷新问题

    我们实现了客户端3355 通过 Config3344  获取GitHub上的信息
    
    我们面另一个问题:
        
        linux运维修改GitHub上的配置文件内容做调整
        
        刷新3344,发现ConfigServer配置中心立刻响应。
        
        刷新3355,发现ConfigClient客户端没有任何响应。
        
        3355没有变化除非自己重启或者重新加载,难道每次运维修改配置文件,客户端都需要重启吗?
        
    我在github上修改config-test后测试一下:
复制代码

img

    1.  3344立刻刷新了
复制代码

img

    2.  3355还是原来的内容
复制代码

img

    3. 除非重启重新加载才能读取到。
复制代码

img

    4.  难道配词配置改动后,我们都需要重新加载微服务吗?
复制代码

2.4 实现分布式配置的动态刷新

    避免每次更新配置都要重启客户端微服务3355
    
    动态刷新步骤:修改3355模块
    
    1.  引入actuator监控依赖
    
        这个依赖的作用是我自己发生变化了能被辨认监控到。我们已经引入了。
复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
复制代码
    2.  修改yml暴露监控的端口:
复制代码

img

        2.0.0版本的SpringBoot的actuator启动端点监控web端默认加载默认只有两个info, 
        health可见的页面节点。

        如果需要显示更多需要在application.properties配置文件中添加
        
        management.endpoints.web.exposure.include=*
        management.endpoints.web.exposure.exclude=env,beans
        include=* 包含所有节点页面
        
        exclude=env,beans 排除env、beans

    
    3.  在业务类Controller上加一个@RefreshScope注解
    
        能够自动的获悉刷新的内容,让运维工程师发送POST请求刷新3355。
复制代码

img

    4.  修改github上的配置文件
复制代码

img

    5.  测试结果:3355还是没有动态刷新
复制代码

img

    6.  注意@RefreshScope注解的作用:
    
        能够自动的获悉刷新的内容,让运维工程师发送POST请求刷新3355。
        
        我们还需要让运维人员发送一下POST请求,刷新一下3355
        
        curl -X POST "http://localhost:3355/actuator/refresh"
复制代码

img

    7.  没有重新启动3355,再次刷新一下
    
        实现了分布式配置的动态刷新
复制代码

img

2.5 还有什么问题?

    1.  假如有多个微服务客户端3355/3366/3377
        每个微服务都要执行一次post请求,手动刷新吗?
        
    2.  可否广播,一次通知,处处生效?
        大范围的实现自动刷新。
        
    3.  可能有这种情况:
    
        100台机器,有的不要求实时刷新。我们想实现该刷新的刷新,不想刷新的不刷新。
        怎么实现?
        
            --- Bus总线。
复制代码

3. Bus 消息总线

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

        GitHub上的配置文件修改后,可否广播一下,不用每个微服务都通过发送POST请求动态刷新。
        
        可不可以该刷新的刷新,不想刷新的不刷新。
    
    带着这些问题,我们来到本章Bus的学习,他是对Config的增强。
    
    
    主要内容:
        1.  概述
        2.  RabbitMQ环境配置
        3.  SpringCloud Bus动态刷新全局广播
        4.  SpringCloud Bus动态刷新顶点通知。
复制代码

3.1 概述

    1.  是什么
        我们想实现分布式的自动刷新配置功能,不是通过手动发送POST请求实现刷新。
        
        SpringCloudBus配合SpringCloudConfig使用可以实现配置的动态刷新。
复制代码

img

        配置更新后,将A刷新一下(推给A),然后通过总线“传染”给了其他的微服务
        
        Bus支持两种消息代理:
        
            RabbitMQ和Kafka
        
    2.  能干嘛    
        
        推给ConfigServer,在全部通知(“感染”)。
复制代码

img

    3.  为什么称为总线
    
        什么是总线:
            在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有
        微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。
            在总线的各个实例中,都可以方便地广播一些需要其他连接在该主题上的实例都知道的消息。
            
        基本原理:
            ConfigCilent实例都监听MQ中同一个topic(默认是springcloudbus)。
            当一个服务刷新数据的时候,它会把这个信息放入Topic中,这样其他监听同一个Topic的服务就能
        得到通知,然后去更新自身的配置。
复制代码

3.2 RabbitMQ 环境配置

    1.  装RabbitMQ之前要先安装Erlang
        
        没有要注意点,选择个目录next即可
    
    2.  下载https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
        安装RabbitMQ
        
        next即可。
        
    3.  进入RabbitMQ安装目录下的sbin目录
    
        D:\Developer_Tools\rabbitmq_server-3.8.3\sbin
        
    4.  输入以下命令启动管理功能
    
        rabbitmq-plugins enable rabbitmq_management
        
        这里会有个报错:
复制代码

img

        原因:
            安装完以后erlang会自动修改系统变量,但是需要重启系统才能生效,
            所以这里需要手动设置一下系统变量略过重启过程。
            
            即可以重启电脑,也可以手动设置一下系统变量。
            
            cmd中输入以下命令:

            C:\Users\Administrator>set ERLANG_HOME=C:\Program Files\erl5.10.4
            C:\Program Files\erl5.10.4 为你erlang的安装路径
        
        再从输入命令:rabbitmq-plugins enable rabbitmq_management
复制代码

img

    5.  输入账号地址查看是否安装成功
复制代码

img

        报错:
复制代码

img

        解决:以管理员身份启动
        
        窗口一闪而过。
        
        打开网址,测试是否安装成功:http://localhost:15672
        
        guest
        guest
复制代码

img

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

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

img

    2.  利用消息总线接触一个服务端ConfigServer的/bus/refresh断点,从而刷新所有客户端的配置
复制代码

img

    3.  图二的架构显然更合理一些,图一不适合的原因如下
    
        1.  破坏了微服务的职责单一性,因为微服务本身是业务模块,它不应该承担配置刷新的功能
        
        2.  破坏了微服务各结点的对等性
        
        3.  有一定的局限性:
            微服务迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就回增加更多的修改。
    
    4.  我们选择第二种:
        
        通知总线,总线再通知所有。
复制代码

3.4 添加一个新的 Config-Client-3366

    1.  以3355为模版再制作一个3366
        cloud-config-client3366
复制代码

img

    2.  POM
        同3355一样
复制代码
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--添加config-client依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <!--web/actuator这两个一般一起使用,写在一起-->
        <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>
复制代码
    3. yml
复制代码
    server:
      port: 3366
    
    spring:
      application:
        name: config-client
      cloud:
        config:
          discovery:
            service-id: cloud-config-center
            enabled: true
          label: master
          name: config
          profile: test
          uri: http://config-3344:3344
    
    eureka:
      instance:
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    management:
      endpoints:
        web:
          exposure:
            include: "*"
复制代码
    4.  主启动类
复制代码
        @SpringBootApplication
        @EnableEurekaClient
        public class ConfigClientMain3366 {
            public static void main(String[] args) {
                SpringApplication.run(ConfigClientMain3366.class, args);
            }
        }
复制代码
    5.   业务类
复制代码
    @RestController
    @RefreshScope
    public class ConfigClientMain3366 {
        
        //从配置文件中取前缀为server.port的值:注意这个模块关联了两个yml
        @Value("${server.port}")
        private String serverPort;
    
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo(){
            return configInfo + "serverPort: " + "\n" +serverPort;
        }
    }
复制代码
    分析:@Value("${server.port}")
    
        从配置文件中取前缀为server.port的值:注意这个模块关联了两个yml 
        
        一个是我们本地配置的bootstrap.yml
        一个是通过bootstrap.yml关联到3344,再关联到GitHub上的config-text.yml
        
        所以@Value("${server.port}")从bootstrap.yml取到了
复制代码

img

        @Value("${config.info}")从关联的config-text.yml取到了
复制代码

3.5 案例配置

    1.  给cloud-config-center3344配置中心服务端添加消息总线支持
        
        POM:
复制代码
        <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springfrmework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        
        <!--web/actuator这两个一般一起使用,写在一起-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
复制代码
        yml
复制代码

img

    2.  cloud-config-cient3355客户端添加消息总线支持
    
        POM
复制代码
        <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springfrmework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        
        <!--web/actuator这两个一般一起使用,写在一起-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
复制代码
        yml
复制代码

img

    3.  cloud-config-cient3355客户端添加消息总线支持
    
        POM
复制代码
        <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springfrmework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        
        <!--web/actuator这两个一般一起使用,写在一起-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
复制代码
    yml
复制代码

img

    4.  启动自测
        7001,3344,3355,3366
复制代码

img

    5.  模拟运维工程师:修改GitHub上的配置文件
        
        因为3355和3366都和config-test绑定,所以我们修改该配置文件
复制代码

img

img

        发送一次POST请求: 这次刷新3344
            curl -X POST "http://localhost:3344/actuator/bus-refresh"
复制代码

img

            发现报405的错
        
        注意:  3344中的配置文件这里。
                老师加的是单引号:''
                要用双引号引起来。
复制代码

img

    6.  能否实现:一次发送,处处生效。
复制代码

img

        注意:  cmd窗口这样效果就说明成功了。
                3355/3366多刷新几下效果就出来了。


        Bingo!!!
        
        测试成功。
复制代码

3.6 回顾一下基本原理

    ConfigClient实例都监听MQ中同一个topic(默认是SpringCloudBus)。
    
        在RabbitMQ中找到了这个topic订阅主题/exchange路由交换机
复制代码

img

    当一个服务刷新数据时,它会把这个信息放到Topic中,这样其他监听同一Topic的服务就能得到通知,
    然后去更新自身的配置。
复制代码

3.7 Bus 动态刷新的定点通知。

    只通知指定的微服务。
    
    比如:只通知3355,不通知3366
    
    指定具体某一个实力生效而不是全部
    
    公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
    
    /bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination
    参数类指定需要更新配置的服务或实例。
    
    只通知3355不通知3366:
        curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
复制代码

img

    成功:
    
        3355刷新了,3366没让它刷新。
复制代码

3.8 流程图

img

posted @ 2021-01-30 19:18  codeFiler  阅读(362)  评论(0编辑  收藏  举报