Spring Cloud Config

对于Spring Boot应用,我们可以将配置内容写入application.yml,设置多个profile,也可以用多个application-{profile}.properties文件配置,并在启动时指定spring.profiles.active={profile}来加载不同环境下的配置。
在Spring Cloud微服务架构中,这种方式未必适用,微服务架构对配置管理有着更高的要求,如:

  • 集中管理:成百上千(可能没这么多)个微服务需要集中管理配置,否则维护困难、容易出错;
  • 运行期动态调整:某些参数需要在应用运行时动态调整(如连接池大小、熔断阈值等),并且调整时不停止服务;
  • 自动更新配置:微服务能够在配置发生变化是自动更新配置。

Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。

其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

1、准备配置仓库

https://github.com/huingsn/config-repo-demo.git
假设我们读取配置中心的应用名为config-client

那么我们可以在git仓库中该项目的默认配置文件config-client.yml:

1
2
info:
profile: default
2、创建配置中心

核心依赖:

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

配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/huingsn/config-repo-demo.git
#如果我们的Git仓库需要权限访问,那么可以通过配置下面的两个属性来实现;
#spring.cloud.config.server.git.username:访问Git仓库的用户名
#spring.cloud.config.server.git.password:访问Git仓库的用户密码
server:
port: 1200

启动类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//开启Spring Cloud Config的服务端功能。
@EnableConfigServer
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
```
到此,一个简单的Spring Cloud Config实现,并使用Git管理配置内容的分布式配置中心就已经完成了。

启动,通过浏览器工具查看配置信息如下:
<img src="data:image/png;base64,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j4iIiIjGSfIgT6vV+qbrPLN6RERERBRyXPFikMPhKCsrUygUb7/9dqT7QkRERDQucYIgTJkyRaFQJCQkxMfHe73c3t6ek5MTkZ75JZPJIt0FIiIioijATB4RERFRDGKQR0RERBSDGOQRERERxSDJn64F0NLS0traCkCj0YjP1ZrNZnHyFAAFBQVjni2vqqrqySef3Ldvn16vD1VviYiIiGKA5Jk8m8129erV8vLy0tLS7u5us9kMQKvVrlu3bt26dSUlJR9++KHNZhtb5RUVFefOnTt8+LDVag1pr4mIiIiim+SZPJVKJWbv5HJ5enq616vXrl2TyWTjWbtWrVbfcMMN4+oiERERUcwJx+1akc1ms9lsycnJ4q/iPVyZTHbXXXeNJ8hTKBQpKSkWiyU1NTVEPSUiIiKKemGaJ8/pdL755ptZWVley5cJgtDY2FhUVKTRaIKpx+88eQ6HY+3atRkZGRUVFePvKhEREVEMCEcmT4zwlEql7wK106ZNUyqV165dG3PlDodj06ZNa9euzc3NHVcviYiIiGJIOKZQOXLkiFKp9Lte7ZUrV/r7+7OyssZcud1u7+3tVavV4+ggERERUayRPJNnNpsFQQBQXV0NIC0tbfny5e+//744qYpCoVi5cqVKpZK6G0RERESTiuRBnlar9Z0GT6fT+d66HRuLxfLll1+GpCoiIiKimBHdK15UVVXNmjWruLiYj9YSEREReQrT07Wh4vfpWiIiIiLyEt2ZPCIiIiLyi0EeERERUQxikEdEREQUgxjkEREREcUgBnlEREREMYhBHhEREVEMYpBHREREFIMY5BERERHFIAZ5RERERDGIQR4RERFRDGKQR0RERBSDGOQRERERxaD/D+/KrQqbw06KAAAAAElFTkSuQmCC" />

Json中返回了应用名:config-client,环境名:dev,分支名:master,以及default环境和dev环境的配置内容。

访问配置信息的URL与配置文件的映射关系如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
上面的url会映射{application}-{profile}.properties对应的配置文件,其中{label}对应Git上不同的分支,默认为master。
<img src="data:image/png;base64,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" />

##### 3、创建客户端

创建一个微服务应用,命名为config-client,引入依赖:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

创建bootstrap.yml配置,来指定获取配置文件的config-server-git位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
application:
name: config-client
cloud:
config:
uri: http://localhost:1200/ #指定配置中心
profile: default
label: master
# 获取配置文件规则:/{application}/{profile}[/{label}]
# spring.application.name:对应配置文件规则中的{application}部分
# spring.cloud.config.profile:对应配置文件规则中的{profile}部分
# spring.cloud.config.label:对应配置文件规则中的{label}部分
# spring.cloud.config.uri:配置中心config-server的地址
server:
port: 1201

启动类:

1
2
3
4
5
6
@SpringBootApplication
public class ApplicationClient {
public static void main(String[] args) {
SpringApplication.run(ApplicationClient.class, args);
}
}

启动后访问结果:

一个简单的demo完成。
整体流程:

4、加密解密

Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。比如下面的例子:

1
2
spring.datasource.username=didi
spring.datasource.password={cipher}dba6505baa81d7sdfafweafaf234324ji4h32u4h32uh4u32437cfbf143695f5b

在Spring Cloud Config中通过在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。


加密准备:
使用Spring Cloud Config的加密解密功能时,为了启用该功能,需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。
虽然JCE功能在JRE中就有,但是默认使用的是有长度限制的版本。我们可以从Oracle的官方网站中下载到它,它是一个压缩包,解压后可以看到下面三个文件:
README.txt
local_policy.jar
US_export_policy.jar
将local_policy.jar和US_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。

完成了JCE的安装后,启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的body内容进行加密的端点
  • /decrypt:对请求的body内容进行解密的端点
    可以通过GET请求访问/encrypt/status端点,我们将得到如下内容:
    1
    2
    3
    4
    {
    "description": "No key was installed for encryption service",
    "status": "NO_KEY"
    }
    返回说明当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥。

配置密钥:
通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),比如:

1
2
encrypt:  
key: didispace #指定密钥信息

再访问http://localhost:1200/encrypt/status得到:

1
2
3
{
"status": "OK"
}

此时,我们配置中心的加密解密功能就已经可以使用了。

还有可以通过/encrypt和/decrypt端点来进行加密和解密的功能。
这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。比如,以curl命令为例,我们可以通过下面的方式调用加密与解密端点:

1
2
3
4
$ curl localhost:7001/encrypt -d didispace
3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
$ curl localhost:7001/decrypt -d 3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
didispace

这里,我们通过配置encrypt.key参数来指定密钥的实现方式采用了对称性加密。这种方式实现比较简单,只需要配置一个参数即可。另外,我们也可以使用环境变量ENCRYPT_KEY来进行配置,让密钥信息外部化存储。

非对称加密
Spring Cloud Config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。

首先,我们需要通过keytool工具来生成密钥对。
keytool是JDK中的一个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。
在JDK 1.4以后的版本中都包含了这一工具,它的位置在:%JAVA_HOME%\bin\keytool.exe。

生成密钥的具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
C:\Users\hu>keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.keystore
输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: 111111
您的组织单位名称是什么?
[Unknown]: 111111
您的组织名称是什么?
[Unknown]: 111111
您所在的城市或区域名称是什么?
[Unknown]: 111111
您所在的省/市/自治区名称是什么?
[Unknown]: 111111
该单位的双字母国家/地区代码是什么?
[Unknown]: 111111
CN=111111, OU=111111, O=111111, L=111111, ST=111111, C=111111是否正确?
[否]: 是

输入 <config-server> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:

输入 <config-server> 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
如果我们不想逐步的输入那些提示信息,可以使用-dname来直接指定,而密钥库口令与密钥口令可使用-storepass和-keypass来直接指定。所以,我们可以通过下面的命令直接创建出与上述命令一样的密钥库:

keytool -genkeypair -alias config-server -keyalg RSA \
-dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \
-keypass 222222 \
-keystore config-server.keystore \
-storepass 111111 \

默认情况下,上述命令创建的密钥只有90天有效期。如果我们想要调整它的有效期,可以通过增加-validity参数来实现,比如我们可以通过下面的命令,让密钥的有效期延长到一年:
keytool -genkeypair -alias config-server -keyalg RSA \
-dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \
-keypass 222222 \
-keystore config-server.keystore \
-storepass 111111 \
-validity 365 \

上述的三种命令生成方式,最终都会在命令的当前执行目录下生成一个config-server.keystore文件。下面,我们需要将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:

encrypt.key-store.location=file://${user.home}/config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=111111
encrypt.key-store.secret=222222
如果我们将config-server.keystore放在配置中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量的方式进行配置,它们对应的具体变量名如下:

ENCRYPT_KEY_STORE_LOCATION
ENCRYPT_KEY_STORE_ALIAS
ENCRYPT_KEY_STORE_PASSWORD
ENCRYPT_KEY_STORE_SECRET
通过环境变量来配置密钥库相关信息可以获得更好的安全性,所以我们可以将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择。

配置中心高可用
在生产环境,Config Server与服务注册中心一样,我们也需要将其扩展为高可用的集群。
spring cloud config 实现高可用非常简单,不需要为这些服务端做额外的配置,只需要遵守一个配置规则:将所有的Config Server都指向同一个Git仓库
这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时,只要配置Config Server外的均衡负载即可,就像如下图所示的结构:
虽然通过服务端负载均衡已经能够实现,但是作为架构内的配置管理,本身其实也是可以看作架构中的一个微服务。所以,另外一种方式更为简单的方法就是把config-server也注册为服务,这样所有客户端就能以服务的方式进行访问。
通过这种方法,只需要启动多个指向同一Git仓库位置的config-server就能实现高可用了。
在config-server-git的基础上复制一个名为:config-server-git-eureka
依赖中增加:

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

作为服务放到注册中心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/huingsn/config-repo-demo.git
server:
port: 1200
# 配置服务注册中心
eureka:
client:
serviceUrl:
defaultZone: http://user:123456@localhost:8761/eureka

启动类增加@EnableDiscoveryClient //用来将config-server注册到上面配置的服务注册中心上去。

启动后可以访问注册中心,看到服务已经注册到注册中心。


config-client配置和config-server-git-eureka一样,复制config-client修改名字为config-client-eureka,需要增加

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

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
application:
name: huyun
cloud:
config:
discovery:
enabled: true #参数设置为true,开启通过服务来访问Config Server的功能
service-id: config-server #参数来指定Config Server注册的服务名。
profile: default #如之前通过URI的方式访问时候一样,用来定位Git中的资源。
label: master
fail-fast: true
server:
port: 1201
# 配置服务注册中心
eureka:
client:
serviceUrl:
defaultZone: http://user:123456@localhost:8761/eureka
debug: true

启动项目:
浏览http://localhost:1201/user即可得到key对应的值
demo 见:spring-cloud-config