SpringCloud微服务知识整理八:分布式配置中心:Spring Cloud Config

释放双眼,带上耳机,听听看~!

什么是Spring Cloud Config

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

一、快速入门

1、构建配置中心

新建一个SpringBoot项目,命名config-server;添加一下依赖:


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

在主类上使用@EnableConfigServer注解来开启配置中心服务端功能。


1
2
3
4
5
6
7
8
9
10
1@SpringBootApplication
2@EnableConfigServer
3public class ConfigserverApplication {
4
5    public static void main(String[] args) {
6        SpringApplication.run(ConfigserverApplication.class, args);
7    }
8}
9
10

在application.properties文件中添加git仓库配置:


1
2
3
4
5
6
7
8
9
10
11
12
1spring.application.name=config-server
2server.port=9000
3#表示配置中心所在仓库的位置
4spring.cloud.config.server.git.uri=仓库的位置
5#仓库路径下的的相对搜索位置,可以配置多个
6spring.cloud.config.server.git.search-paths=config-client
7#git的用户名
8spring.cloud.config.server.git.username=username
9#git的密码
10spring.cloud.config.server.git.password=password
11
12

完成

2、仓库配置规则

配置信息的url和配置文件的映射关系如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml或/{application}-{profile}.properties
/{label}/{application}-{profile}.yml或/{label}/{application}-{profile}.properties

3、客户端配置映射

新建一个SpringBoot项目,命名config-client,依赖:


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

创建主类。
创建bootstrap.properties文件来获取配置文件的config-server位置。必须在bootstrap.properties中


1
2
3
4
5
6
7
8
9
10
11
12
1#配置服务名
2spring.application.name=name
3#服务id
4server.port=7002
5#配置对应文件规则中的{profile}部分
6spring.cloud.config.profile=test
7#配置对应文件规则中的{label}
8spring.cloud.config.label=config-label
9#配置中心的地址
10spring.cloud.config.uri=http://localhost:7001/
11
12

创建一个接口,通过 @Value("${from}")或Environment来绑定获取配置中心的from属性:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1@RestController
2@RefreshScope
3public class TestController {
4    @Value("${from}")
5    private String from;
6
7    @RequestMapping("/from")
8    public String from(){
9        return this.from;
10    }
11
12  @Autowired
13  private Environment env;
14 
15  @RequestMapping("/from")
16    public String from(){
17        return env.getProperty("from","undefined");
18    }
19}
20
21

二、服务端详解

1、基础架构

几个要素:
1、远程Git仓库;
2、Config Server;
3、本地Git仓库;
4、具体微服务应用;
SpringCloud微服务知识整理八:分布式配置中心:Spring Cloud Config
客户端从配置管理中获取配置流程:

1、应用启动,根据bootstrap.properties中配置的应用名{application}、环境名{profile}、分支名{label},行配置中心获取配置信息。
2、ConfigServer根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查找配置信息。
3、通过git clone命令将找到的配置信息下载到ConfigServer的文件系统中。
4、ConfigServer创建Spring的ApplicationContext实例,并从git本地仓库中加载配置文件,最后将这些配置文件内容读取出来返回给客户端
5、客户端应用在获得外部配置文件后加载到客户端ApplicationContext实例,该配置内容的优先级高于客户端Jar包内部的配置内容,所以在Jar包中重复的内容将不再被加载。

2、仓库

可以使用Git和SVN仓库,推荐使用Git

3、加密解密

如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。


1
2
3
4
1spring.datasource.username=didi
2spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b
3
4

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

使用前提
需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。从Oracle的官方网站中下载。
下载后需要将local_policy.jar和US_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。

相关端点
启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

/encrypt/status:查看加密功能状态的端点
/key:查看密钥的端点
/encrypt:对请求的body内容进行加密的端点
/decrypt:对请求的body内容进行解密的端点

配置密钥
通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥)
访问/encrypt和/decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。

非对称加密
Spring Cloud Config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。
通过keytool工具来生成密钥对,%JAVA_HOME%\bin\keytool.exe。
生成一个config-server.keystore文件。将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:


1
2
3
4
5
6
1encrypt.key-store.location=file://${user.home}/config-server.keystore
2encrypt.key-store.alias=config-server
3encrypt.key-store.password=111111
4encrypt.key-store.secret=222222
5
6

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


1
2
3
4
5
6
1ENCRYPT_KEY_STORE_LOCATION
2ENCRYPT_KEY_STORE_ALIAS
3ENCRYPT_KEY_STORE_PASSWORD
4ENCRYPT_KEY_STORE_SECRET
5
6

通过环境变量来配置密钥库相关信息可以获得更好的安全性。

4、高可用配置

传统作法:
SpringCloud微服务知识整理八:分布式配置中心:Spring Cloud Config
服务模式:
把config-server也注册为服务,这样所有客户端就能以服务的方式进行访问。见下面服务化配置中心。

三、客户端详解

1、URI指定配置中心


1
2
3
1spring.cloud.config.uri=http://localhost:7001/
2
3

2、服务化配置中心

把config-server也注册为服务,这样所有客户端就能以服务的方式进行访问。通过这种方法,只需要启动多个指向同一Git仓库位置的config-server就能实现高可用了。

config-server配置:
在pom.xml的dependencies节点中引入依赖,相比之前的config-server就加入了spring-cloud-starter-eureka,用来注册服务。

在application.properties中配置参数eureka.client.serviceUrl.defaultZone以指定服务注册中心的位置


1
2
3
4
5
6
7
8
9
10
11
1spring.application.name=config-server
2server.port=7001
3# 配置服务注册中心
4eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
5# git仓库配置
6spring.cloud.config.server.git.uri=仓库地址
7spring.cloud.config.server.git.searchPaths=
8spring.cloud.config.server.git.username=username
9spring.cloud.config.server.git.password=password
10
11

在应用主类中,新增@EnableDiscoveryClient注解

config-client配置:
在pom.xml的dependencies节点中新增spring-cloud-starter-eureka依赖

在bootstrap.properties中,按如下配置:


1
2
3
4
5
6
7
8
9
10
1spring.application.name=didispace
2server.port=7002
3
4eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
5
6spring.cloud.config.discovery.enabled=true
7spring.cloud.config.discovery.serviceId=config-server
8spring.cloud.config.profile=dev
9
10

在应用主类中,增加@EnableDiscoveryClient注解

沿用之前创建的Controller来加载Git中的配置信息

访问客户端应用提供的服务:http://localhost:7002/from,此时,我们会返回在Git仓库中properties文件配置的from属性内容

3、配置刷新

在config-client端增加一些内容和操作以实现配置的刷新:
在config-clinet的pom.xml中新增spring-boot-starter-actuator监控模块,其中包含了/refresh刷新API。


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

通过POST请求发送到http://localhost:7002/refresh,参数的配置内容被更新了。

给TA打赏
共{{data.count}}人
人已打赏
安全经验

如何避免Adsense违规封号

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索