Spring Cloud Config

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

文章目录

  • Spring Cloud Config
  • 概述
  • 分布式系统面临的配置问题
  • 是什么
  • 能干嘛
  • 与GitHub整合配置
  • Config服务端配置与测试
  • Config客户端配置与测试
  • Config客户端之动态刷新
  • 动态刷新

概述

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


nacos springcloud config 环境变量 springcloud的config配置说明_客户端

是什么


nacos springcloud config 环境变量 springcloud的config配置说明_微服务_02

nacos springcloud config 环境变量 springcloud的config配置说明_git_03

能干嘛

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署比如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: 3344

spring:
  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                  #读取分支

#服务注册到eureka
eureka:
  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>
  1. bootstrap.yml

配置如下:

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    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/
  1. 主启动类
    注册进入服务中心:@EnableEurekaClient
  2. 业务类:
@RestController
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @RequestMapping("/configInfo")
    public String getConfigInfo(){
        return configInfo;
    }
}
  1. 测试
    启动config配置中心 ConfigServer3344 并自测:

启动3355作为Client准备访问:

  1. 实现了客户端3355 访问config配置中心config-3344 通过github获取配置信息
  2. 问题出现:分布式配置的动态刷新问题:
  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>
  1. 修改yml,暴露监控端口
#暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 业务类Controller修改
    添加 @RefreshScope 注解
  2. 此时修改github上的配置文件,测试3344、3355
  3. 此时客户端3355并没有动态刷新,需要运维人员发送Post请求刷新客户端3355
    必须是post请求:curl -X POST “http://localhost:3355/actuator/refresh”
  4. 再次访问客户端3355,成功实现了客户端3355刷新到最新配置内容,避免了服务重启

还存在的问题:

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

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

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

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