0%

【SpringCloud】服务配置:Config

利用服务配置,可以对多个微服务进行统一配置


1 Config介绍

1.1 服务配置出现原因

  • 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设置必不可少
  • SpringCLoud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个aoolication.yaml,上百个配置文件管理…
  • (举例)同一功能的服务器集群,除了端口之外的配置不同,里面的许多配置都十分的像,所以可以提取相同的部分,减少管理压力

1.2 简介

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

1.3 功能

  • 集中管理配置文件
  • 不同环境不同配置,动态化的配置更新,分环境部署(dev/test/prod/beta/release)
  • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  • 将配置信息以REST接口的形式暴露

2 Config服务端搭建

2.1 前期准备

  • (1)在自己GitHub / Gitee上新建一个配置文件仓库
  • (2)本地克隆自己创建的Git仓库
  • (3)在本地仓库创建一个config-dev.yaml文件,里面填写一些内容即可
    • 文件名格式一定要为xxx-xxx.yaml才可以
      1
      2
      3
      #填写内容举例
      config:
      info: master branch, springcloud-config/config-dev.yaml version=1.0
  • (4)将该文件提交到仓库上

2.2 搭建服务端

  • (1)创建新项目cloud-config-center3344
  • (2)修改POM(引入依赖)
    1
    2
    3
    4
    5
    <!-- config -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  • (3)配置文件yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 3344

    spring:
    application:
    name: cloud-config-center # 服务名称
    cloud:
    config:
    server:
    git:
    uri: https://gitee.com/letere/springcloud-config.git #git仓库地址
    search-paths:
    - springcloud-config #仓库名称
    label: master #读取仓库分支
  • (4)主启动类
    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableConfigServer //开启配置服务
    public class ConfigCenterMain3344 {
    public static void main(String[] args) {
    SpringApplication.run(ConfigCenterMain3344.class, args);
    }
    }

2.3 测试


3 Config客户端搭建

3.1 客户端搭建

  • (1)创建项目cloud-config-client3355
  • (2)修改POM(依赖引入)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- web -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- config-client -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
    </dependency>
  • (3)配置bootstrap.yaml文件

  • application.yaml是用户及的资源配置项,bootstrap.yaml是系统级的,优先级更高

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 3355

    spring:
    application:
    name: cloud-config-client
    cloud:
    config:
    label: master #仓库分支
    name: config #配置文件前名
    profile: dev #配置文件后名(环境)
    uri: http://localhost:3344 #config服务端地址

    # 如果引入服务注册中心,可以考虑配置
  • (4)写个Controller接口试验是否访问到配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RestController
    public class ConfigController {

    @Value("${config.info}")
    private String configInfo; //读取配置文件信息,注入到参数中

    @GetMapping("/configInfo")
    public String getConfigInfo() {
    return configInfo;
    }
    }
  • (5)测试:启动cloud-config-server3344,再启动cloud-config-client3355

  • 访问:http://localhost;3355/configInfo


4 Config客户端动态刷新(手动)

4.1 问题发现

  • 如果config客户端,服务端都开启的时候,直接修改远程仓库中配置文件信息
  • 服务端接口信息会立马更新
  • 客户端接口信息不会进行更新,只有重新客户端才可以更新
  • 出现以上问题:所以需要客户端的动态刷新

4.2 配置动态刷新手动版

  • (1)修改POM(引入新依赖)
    1
    2
    3
    4
    5
    <!-- actuator监控 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  • (2)修改配置文件yaml
    1
    2
    3
    4
    5
    6
    # 暴露监控端点
    management:
    endpoints:
    web:
    exposure:
    include: "*"
  • (3)Controller类上面添加新的注解@refreshScope

4.3 测试

  • (1)更改远程仓库配置文件信息
  • (2)向客户端发送Post请求,提示客户端刷新配置文件信息
    • 可利用cmd命令来发送curl -X POST "http://localhost:3355/actuator/refresh"
  • (3)重新请求客户端接口,发现数据已经修改

4.4 总结

  • 因为需要手动发送post请求提示刷新,所以称之为手动版
  • 但可以结合下面学习的BUS总线实现自动刷新,无非手动