Config服务配置

发布于 2022-04-19  1.69k 次阅读


一,Config服务配置的概述

  微服务将单体应用中的业务进行拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每一个服务都需要必要的配置信息才能运行,假如有上百个微服务,那就有上百个application.yml配置文件,单独配置很麻烦,有所以一套集中式的,动态的管理设施是必不可少的

SpringCloud为了解决服务配置的问题提供了ConfigServer

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供一个中心化的外部配置

SpringCloud Config分为两个部分:

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

config服务配置的作用:

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

Config一般使用Git作为配置信息服务器,当然也可以使用其他版本控制工具做为服务器如SVN,但git是最通用的一种方式

二,Config服务端配置使用和服务方式

一,Config服务端的配置和使用

步骤:

  1. 在GitHub上新建一个仓库,保存配置文件
  2. 新建一个子模块,搭建Config服务端
  3. 通过URL服务GitHub上的配置文件

1,具体的Github使用省略

2,搭建Config服务端

① maven依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>

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

② application配置

server:
  port: 9098
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://github.com/WQL-KXJ/SpringCloudConfig.git #GitHub上的仓库地址
          search-paths:
            - SpringCloudConfig #搜索的目录
      label: master #读取的分支
eureka:
  client:
    fetch-registry: true
    service-url:
      defaultZone: http://eureka1.com:9090/eureka/,http://eureka2.com:9091/eureka/

③ main启动类

@SpringBootApplication
@EnableConfigServer//开启Config Server
public class ConfigMain {
    public static void main(String[] args) {
        SpringApplication.run(ConfigMain.class,args);
    }
}

3,通过URL服务GitHub上的配置文件

二,URL访问方式

Config提供了三种访问方式:

  1. /{label}/{application}-{profile}.yml
  2. /{application}-{profile}.yml
  3. /{application}/{profile}[/{label}]:这一个是json格式的

注:label是分支名,application是应用名,profile为文件名,如cloudconfig-dev.yml,application是cloudconfig,profile是dev,命名时必须使用application-profile.yml的格式

例:提供这三种方式访问上诉的 cloudconfig-dev.yml文件

① 通过/{label}/{application}-{profile}.yml访问

② 通过/{application}-{profile}.yml访问

 

③ 通过/{application}/{profile}[/{label}

三,Bootstrap配置文件

Config把配置文件分为两种:

  • application.yml:用户级的资源配置项
  • bootstrap.yml:系统级的资源配置文件(优先级更高)

Spring Cloud会创建一个"Bootstrap Context"作为Spring应用的"Application Context"的父上下文,初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置,这两个上下文共享一个从外部获取的Environment

Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖,Bootstrap context和Application context有着不同的约定,所以新增一个bootstrap.yml文件,保证Bootstrap Context和Application Context配置分离

三,Config客户端的配置使用

① Maven依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

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

② Bootstrap配置

server:
  port: 8088
spring:
  application:
    name: cloud-config-client
  cloud:
    config:
      label: master #分支名称
      name: cloudconfig #配置文件名称
      profile: dev #后者名称,就是-后面的名称
      uri: http://localhost:9098 #加起来就是http://localhost:9098/master/cloudconfig-dev.yml

eureka:
  client:
    fetch-registry: true
    service-url:
      defaultZone: http://eureka1.com:9090/eureka/,http://eureka2.com:9091/eureka/

③ main启动类

@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain.class,args);

    }
}

④ controll

@RestController
public class ConfigClientController {

    @Value("${wql}")
    String wlq;

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

    @GetMapping("/getapplication")
    public String get(){

        return "{wql:"+wlq+",info:"+info+"}";
    }
}

测试:

 

 

默认config客户端是没有动态刷新功能的,当git上的配置文件修改,clinet不能得到更新,需要重启才能刷新

修改git的配置中wql的值server to client,再同时通过通过server和client分别访问

四,config动态刷新(手动)

避免每一次更新配置都要重启客户端微服务,Config提供动态刷新的功能,这个刷新并非完全自动化,需要发送请求请其刷新

①配置(开启actuator)

management:
  endpoints:
    web:
      exposure:0
        include: "*"

② 再具体的调用方法上加上@RefreshScope注解(开启刷新)

@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${wql}")
    String wlq;

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

    @GetMapping("/getapplication")
    public String get(){

        return "{wql:"+wlq+",info:"+info+"}";
    }
}

测试:修改github中配置文件中的wql为 "/(ㄒoㄒ)/~~"

发送POST请求要求动态刷新:

//主机端口是变化的,路径是固定的
curl -X POST http://localhost:8088/actuator/refresh

测试:


路漫漫其修远兮,吾将上下而求索