Spring Cloud Config 外部集中化配置管理

Posted by 彭楷淳 on 2021-02-07
Estimated Reading Time 8 Minutes
Words 2k In Total
Viewed Times

Spring Cloud Config 简介


Spring Cloud Config 可以为微服务架构中的应用提供集中化的外部配置支持,它分为服务端和客户端两个部分,本文将对其用法进行详细介绍。

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

在 Git 仓库中准备配置信息


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

配置仓库目录结构

img

master 分支下的配置信息

config-dev.yml

1
2
config:
info: "config info for dev(master)"

config-test.yml

1
2
config:
info: "config info for test(master)"

config-prod.yml:

1
2
config:
info: "config info for prod(master)"

dev 分支下的配置信息

config-dev.yml:

1
2
config:
info: "config info for dev(dev)"

config-test.yml:

1
2
config:
info: "config info for test(dev)"

config-prod.yml:

1
2
config:
info: "config info for prod(dev)"

创建服务端


这里我们创建一个 config-server 模块来演示 Spring Cloud Config 作为配置中心的功能。

引入依赖

在 pom.xml 中添加相关依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

相关配置

在 application.yml 中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8901
spring:
application:
name: config-server
cloud:
config:
server:
git: #配置存储配置信息的Git仓库
uri: https://gitee.com/macrozheng/springcloud-config.git
username: macro
password: 123456
clone-on-start: true #开启启动时直接从git获取配置
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/

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

1
2
3
4
5
6
7
8
9
10
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigServerApplication {

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

}

通过服务端获取配置信息

这里我们通过 config-server 来演示下如何获取配置信息。

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

1
2
3
4
# 获取配置信息
/{label}/{application}-{profile}
# 获取配置文件信息
/{label}/{application}-{profile}.yml
  • application:代表应用名称,默认为配置文件中的 spring.application.name,如果配置了 spring.cloud.config.name,则为该名称;
  • label:代表分支名称,对应配置文件中的 spring.cloud.config.label;
  • profile:代表环境名称,对应配置文件中的 spring.cloud.config.profile。

获取配置信息演示

启动 eureka-server、config-server服务。访问 http://localhost:8901/master/config-dev 来获取 master 分支上 dev 环境的配置信息;

img

访问 http://localhost:8901/master/config-dev.yml 来获取 master 分支上 dev 环境的配置文件信息,对比上面信息,可以看出配置信息和配置文件信息并不是同一个概念。

img

访问 http://localhost:8901/master/config-test.yml 来获取 master 分支上 test 环境的配置文件信息

img

访问 http://localhost:8901/dev/config-dev.yml 来获取 dev 分支上 dev 环境的配置文件信息

img

创建客户端


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

引入依赖

在 pom.xml 中添加相关依赖

1
2
3
4
5
6
7
8
9
10
11
12
<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 中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 9001
spring:
application:
name: config-client
cloud:
config: #Config客户端配置
profile: dev #启用配置后缀名称
label: dev #分支名称
uri: http://localhost:8901 #配置中心地址
name: config #配置文件名称
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/

添加 ConfigClientController 类用于获取配置

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

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

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

演示从配置中心获取配置

启动config-client服务;访问 http://localhost:9001/configInfo,可以获取到dev分支下dev环境的配置;

1
config info for dev(dev)

获取子目录下的配置

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

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

1
2
3
4
5
6
spring:
cloud:
config:
server:
git:
search-paths: '{application}'

访问 http://localhost:9001/configInfo 进行测试,可以发现获取的是 config 子目录下的配置信息。

1
config info for config dir dev(dev)

刷新配置

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

在 pom.xml 中添加 Actuator 的依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在 bootstrap.yml 中开启 refresh 端点:

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: 'refresh'

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

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

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

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

重新启动 config-client 后,调用 refresh 端点进行配置刷新:

img

访问 http://localhost:9001/configInfo 进行测试,可以发现配置信息已经刷新:

1
update config info for config dir dev(dev)

配置中心添加安全认证


我们可以通过整合 Spring Security 来为配置中心添加安全认证。

创建项目模块

创建 config-security-server 模块

在 pom.xml 中添加相关依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

在 application.yml 中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8905
spring:
application:
name: config-security-server
cloud:
config:
server:
git:
uri: https://gitee.com/macrozheng/springcloud-config.git
username: macro
password: 123456
clone-on-start: true #开启启动时直接从git获取配置
security: #配置用户名和密码
user:
name: antonio
password: 123456

启动 config-security-server 服务。

修改客户端配置

添加 bootstrap-security.yml 配置文件,主要是配置了配置中心的用户名和密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 9002
spring:
application:
name: config-client
cloud:
config:
profile: dev #启用配置后缀名称
label: dev #分支名称
uri: http://localhost:8905 #配置中心地址
name: config #配置文件名称
username: antonio
password: 123456

使用 bootstrap-security.yml 启动 config-client 服务;访问 http://localhost:9002/configInfo 进行测试,发现可以获取到配置信息。

1
config info for dev(dev)

服务端集群搭建


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

启动两个 config-server 分别运行在 8902 和 8903 端口上;

添加 config-client 的配置文件 bootstrap-cluster.yml,主要是添加了从注册中心获取配置中心地址的配置并去除了配置中心uri的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
cloud:
config:
profile: dev #启用环境名称
label: dev #分支名称
name: config #配置文件名称
discovery:
enabled: true
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/

以 bootstrap-cluster.yml 启动 config-client 服务,注册中心显示信息如下:

img

访问 http://localhost:9003/configInfo,发现 config-client 可以获取到配置信息。

1
config info for config dir dev(dev)

更多干货请移步:https://antoniopeng.com


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !