SpringCloud 之 Config服务配置 详解

2022年10月22日08:16:47

Spring Cloud Config


  • 概述
  • Config服务端配置与测试
  • Config客户端配置与测试
  • Config客户端之动态刷新


概述


分布式系统面临的配置问题


SpringCloud 之 Config服务配置 详解

是什么


SpringCloud 之 Config服务配置 详解

SpringCloud 之 Config服务配置 详解

能干嘛


  • 集中管理配置文件

  • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release

  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心同意拉取配置自己的信息

  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的领域

  • 将配置信息以REST接口的形式暴露

与GitHub整合配置


由于Spring Config默认使用Git来存储配置文件(也有其他方式,比如支持svn和本地文件),但推荐Git,而且使用的是 http/https 访问的形式

Config服务端配置与测试


  • 在GitHub上新建一个名为springcloud-config的新Repository

  • 由上一步获得刚新建的git地址

  • 本地硬盘目录新建git仓库并clone

  • 新建Module模块cloud-config-center-3344,即微服务的配置中心模块CloudConfig Center

  • pom

    新增:

    <!--config-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  • 配置文件

    server:port:3344spring:application:name: cloud-config-center#注册到eureka微服务名cloud:config:server:git:uri: git@github.com:kisshotlirs/springcloud-config.git#git仓库名字search-paths:- springcloud-config#搜索目录label: master#读取分支#服务注册到eurekaeureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/
  • 主启动类

    添加注解 @EnableConfigServer

  • windows下修改hosts文件,增加映射:127.0.0.1 config-3344.com

  • 测试通过Config微服务是否可以从GitHub上获取配置内容

    • 启动微服务
    • 访问 http://config-3344.com:3344/master/config-dev.yml
  • 配置读取规则:

    • /{label}/{application}-{profile}.yml

      实例:master分支:http://config-3344.com:3344/master/config-dev.yml

      dev分支:http://config-3344.com:3344/dev/config-dev.yml

    • /{application}-{profile}.yml

      实例:http://config-3344.com:3344/config-dev.yml

  • 成功实现了使用SpringCloud Config通过GitHub获取配置信息

Config客户端配置与测试


  1. 新建 cloud-config-client-3355

  2. pom

    <!--config client-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
  3. bootstrap.yml

    SpringCloud 之 Config服务配置 详解

    配置如下:

    server:port:3355spring:application:name: config-clientcloud:config:#config客户端配置label: main#分支名称name: config#配置文件名称profile: dev#读取后缀名称    上述三个综合为 main分支上的config-dev.yml配置文件uri: http://localhost:3344#配置文件地址eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/
  4. 主启动类

    注册进入服务中心:@EnableEurekaClient

  5. 业务类:

    @RestControllerpublicclassConfigClientController{@Value("${config.info}")privateString configInfo;@RequestMapping("/configInfo")publicStringgetConfigInfo(){return configInfo;}}
  6. 测试

    启动config配置中心 ConfigServer3344 并自测:

    • http://config-3344.com:3344/master/config-prod.yml

    启动3355作为Client准备访问:

    • http://localhost:3355/configInfo
  7. 实现了客户端3355 访问config配置中心config-3344 通过github获取配置信息

  8. 问题出现:分布式配置的动态刷新问题:

    1. Linux运维修改Github上的配置文件内容做调整
    2. 刷新3344,发现ConfigServer配置中心立即响应
    3. 刷新3355,发现ConfigClient客户端没有任何响应
    4. 3355没有变化除非自己重启或者重新加载

Config客户端之动态刷新


避免每次更新配置都要重启客户端微服务3355

动态刷新


  1. pom引入actuator服务监控

    <!--actuator服务监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. 修改yml,暴露监控端口

    #暴露监控端点management:endpoints:web:exposure:include:"*"
  3. 业务类Controller修改

    添加 @RefreshScope 注解

  4. 此时修改github上的配置文件,测试3344、3355

  5. 此时客户端3355并没有动态刷新,需要运维人员发送Post请求刷新客户端3355

    必须是post请求:curl -X POST “http://localhost:3355/actuator/refresh”

  6. 再次访问客户端3355,成功实现了客户端3355刷新到最新配置内容,避免了服务重启

还存在的问题:

假设有多个微服务客户端,每个微服务都要执行一次post请求,手动刷新?(可使用脚本)

可否广播,一次通知,处处生效

可否精确通知,选择特定的微服务使其配置生效

上述问题还无法实现,所以需要引入 消息总线,和spring cloud Bus配合

  • 作者:qie ting feng yin
  • 原文链接:https://blog.csdn.net/qq_52567278/article/details/124954860
    更新时间:2022年10月22日08:16:47 ,共 3017 字。