一、Spring Cloud Config简介

Spring Cloud Config 可以为微服务架构中的应用提供集中化的外部配置支持,它分为服务端和客户端两个部分。

Spring Cloud Config 分为服务端和客户端两个部分。服务端被称为分布式配置中心,它是个独立的应用,可以从配置仓库获取配置信息并提供给客户端使用。客户端可以通过配置中心来获取配置信息,在启动时加载配置。Spring Cloud Config 的配置中心默认采用Git来存储配置信息,所以天然就支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息。

二、在Git仓库中准备配置信息

由于Spring Cloud Config 需要一个存储配置信息的Git仓库,这里我们先在Git仓库中添加好配置文件再演示其功能
029.png

三、配置中心服务端

创建一个config-server模块,添加依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-config-server</artifactId>
  4. </dependency>

添加配置:

server:
  port: 8701
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git: #配置存储配置信息的Git仓库
          uri: https://gitee.com/quanzaiyu/springcloud-config.git
          username: yourUserName
          password: yourPassword
          clone-on-start: true #开启启动时直接从git获取配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

在启动类上添加@EnableConfigServer注解来启用配置中心功能

@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

启动config-server

四、获取配置文件信息

获取配置文件信息的访问格式:

# 获取配置信息
/{label}/{application}-{profile}
# 获取配置文件信息
/{label}/{application}-{profile}.yml

占位符相关解释

  • label 代表分支名称,对应配置文件中的spring.cloud.config.label;
  • application 代表应用名称,默认为配置文件中的spring.application.name,如果配置了spring.cloud.config.name,则为该名称;
  • profile 代表环境名称,对应配置文件中的spring.cloud.config.profile。

获取配置信息:http://localhost:8701/master/config-dev
027.png

获取配置文件信息:http://localhost:8701/master/config-dev.yml
028.png

五、配置中心客户端

我们创建一个config-client模块来从config-server获取配置。

config-client依赖如下:

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

创建一个bootstrap.yml启动配置文件:

server:
  port: 8801
spring:
  application:
    name: config-client
  cloud:
    config: #Config客户端配置
      uri: http://localhost:8701 #配置中心地址
      label: dev #分支名称
      name: config #配置文件名称
      profile: dev #启用配置后缀名称
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

spring.cloud.config 指定了配置中心服务端的相关信息

  • uri 配置中心服务端地址
  • label 分支名称
  • name 配置文件名称
  • profile 启用配置后缀名称

比如以上配置,加载的是 http://localhost:8701/dev/config-dev.yml 的配置(对应git仓库的dev分支,config-dev.yml文件)

dev/config-dev.yml 文件内容如下:

config:
  info: config info for dev(dev)

在启动类中加入@EnableDiscoveryClient

@EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

创建一个控制器读取配置:

@RestController
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

访问 http://localhost:8801/configInfo,看到屏幕输出:config info for dev(dev)

六、获取子目录下的配置

我们不仅可以把每个项目的配置放在不同的Git仓库存储,也可以在一个Git仓库中存储多个项目的配置,此时就会用到在子目录中搜索配置信息的配置。

首先我们需要在config-server中添加相关配置,用于搜索子目录中的配置,这里我们用到了application占位符,表示对于不同的应用,我们从对应应用名称的子目录中搜索配置,比如config子目录中的配置对应config应用;

spring:
  cloud:
    config:
      server:
        git:
          search-paths: '{application}'

重启config-server和config-client,访问http://localhost:9001/configInfo进行测试,可以发现获取的是config子目录下的配置信息。屏幕输出:config info for config dir dev(dev)

七、刷新配置

当Git仓库中的配置信息更改后,我们可以通过SpringBoot Actuator的refresh端点来刷新客户端配置信息,以下更改都需要在config-client中进行。

添加Actuator的依赖:

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

bootstrap.yml中开启refresh端点:

management:
  endpoints:
    web:
      exposure:
        include: 'refresh'

在ConfigClientController类添加@RefreshScope注解用于刷新配置:

@RestController
@RefreshScope
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

通过POST请求调用http://localhost:8801/actuator/refresh,可以刷新配置。

八、安全认证

首先在config-server模块添加安全认证的依赖:

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

在config-server的配置中添加认证信息:

spring:
  application:
    name: config-server
  security: #配置用户名和密码
    user:
      name: admin
      password: 123456

在config-client的配置中添加认证信息:

spring:
  application:
    name: config-client
  cloud:
    config:
      uri: http://localhost:8701
      label: dev
      name: config
      profile: dev
      username: admin
      password: 123456

这样就可以正常启动了,如果客户端指定的用户名和密码错误将启动失败。

九、配置中心集群

在微服务架构中,所有服务都从配置中心获取配置,配置中心一旦宕机,会发生很严重的问题,我们可以搭建多个节点的配置中心集群,注册到Eureka,来解决该问题。

参考资料