分布式配置中心 Spring Cloud Config
Spring Cloud Config用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为客户端与服务端两部分。其中服务端也成为分布式配置中心,是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息,加密/解密信息等访问接口;客户端则是微服务架构中的各个微服务应用或基础设施,通过指定的配置中心来管理应用资源与业务相关的配置内容,并在服务启动的时候从配置中心获取和加在配置信息。
Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射。Spring Cloud Config默认采用<font color=#FF0000>GIT</font>来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,同时也支持SVN仓库,本地化文件系统等其他存储方式。
1. 快速集成 Spring Cloud Config
1.1 构建配置中心(服务端)
-
创建基础Spring Boot工程:config-server
-
添加依赖: spring-cloud-config-server
-
在主类上使用
@EnableConfigServer
注解开启Spring Cloud Config的服务端功能 -
配置Spring Cloud Config服务的基本信息及Git仓库的相关信息
spring.application.name=config-server server.port=7001 ## 配置Git仓库位置 spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringCloud-Learning/ ## Git仓库路径下的相对搜索位置,可配置多个 spring.cloud.config.server.git.searchPaths=spring_cloud_in_action/config-repo ## Git仓库用户名 spring.cloud.config.server.git.username=username ## Git仓库用户密码 spring.cloud.config.server.git.password=password
1.2 配置规则详解
根据服务端配置在http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/
下创建一个config-repo
目录作为配置仓库,并根据不同环境新建配置文件:
- didispace.properties
- didispace-dev.properties
- didispace-test.properties
- didispace-prod.properties
方便测试版本控制,在该Git仓库的master分支的四个配置文件中设置from属性,并分别设置不同的值且使1.0作为后缀:
- from=git-default-1.0
- from=git-dev-1.0
- from=git-test-1.0
- from=git-prod-1.0
创建一个config-label-test分支,并将各配置文件中的from属性后缀改为2.0,通过浏览器,POSTMAN或者其它CURL工具请求配置内容。配置信息的URL与文件的映射关系如下:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
构造不同的url来访问不同的配置内容。获取config-label-test分支,didispace应用的prod环境配置可以访问http://localhost:7001/didispace/prod/config-label-test
1.3 客户端配置映射
完成上述准备,确保配置中心已经正常开始工作,构建Spring Cloud Config客户端并获取上述配置信息。
-
创建基础Spring Boot工程:config-client
-
添加依赖: spring-cloud-starter-config
-
配置config server位置
## 配置文件规则中{application}部分 spring.application.name=didispace ## 配置文件规则中{profile}部分 spring.cloud.config.profile=dev ## 配置文件规则中{label}部分 spring.cloud.config.label=master ## 配置中心 config-server 的地址 spring.cloud.config.uri=http://localhost:7001/ server.port=7002
-
创建RESTFUL接口返回配置中心from属性,通过
@Value("${from}")
注解绑定配置的from属性
2. 配置中心(服务端)详解
2.1 基础架构
基本结构:
- 远程Git仓库:存储配置文件的地方
- Config Server:分布式配置中心
- 本地Git仓库:在Config Server的文件系统中,每次客户端请求获取配置信息时,Config Server从Git仓库中获取最新的配置到本地,然后在本地Git仓库中读取并返回,当远程仓库无法获取时,直接将本地内容返回。
- Service A, Service B:微服务应用,它们指定Config Server的地址,应用在启动的时候,实现从外部化获取应用自己需要的配置信息。
客户端应用从配置中心获取配置信息执行流程:
- 应用启动时,根据bootstrap.yml配置的应用名{application},环境名{profile},分支名{label}向Config Server请求获取配置信息。
- Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息查找配置信息。
- Config Server将找到的配置信息下载到Config Server的文件系统中。
- Config Server创建Spring的ApplicationContext实例,并从Git本地仓库中加在配置文件,最后将这些配置内容读取出来返回给客户端应用。
- 客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级<font color=#FF0000>高于</font>客户端Jar包内部的配置内容,所以在Jar包中重复的内容将不再被加载。
2.2 Git配置仓库
Spring Cloud Config中默认使用Git,对于Git的配置也非常简单,只需要再Config Server中设置spring.cloud.config.server.git.uri
属性为其指定Git仓库的网络地址和账户信息即可(参考1.1章节)。
将该属性值使用file://
前缀设置为一个文件地址(windows系统中使用file:///
定位文件内容),那么它将以本地仓库的方式运行,这样就可以脱离Git服务端快速进行调试与开发,如:
spring.cloud.config.server.git.uri=file://${user.home}/config-repo
2.2.1 占位符配置URI
{application},{profile},{label}这些占位符除了用于表示配置文件的规则之外,还可以用于Config Server中对Git仓库地址的URI配置。可以通过{application}占位符来实现一个应用对应一个Git仓库目录的配置效果:
## 配置Git仓库位置
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}
{application}代表应用名,当客户端向Config Server发起获取配置的请求时,Config Server会根据客户端的Spring.application.name
信息来填充{application}占位符以定位配置资源的存储位置,实现根据微服务应用属性动态获取不同位置的配置。对于{label}参数,若Git分支和标签名包含"/",那么{label}参数在HTTP的URL中应该使用"(_)"代替。
通过在URI中使用占位符规划和实现通用的仓库配置:
-
代码库:使用服务名作为Git仓库名
-
配置库:使用服务名加上
-config
后缀作为Git仓库名称:
服务端仓库地址通用配置:
## 配置Git仓库位置
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}-config
2.2.2 配置多个仓库
当有多个匹配规则的时候,可以用<font color=#FF0000>逗号</font>分割多个{application}/{profile}配置规则
## 配置dev 本地文件系统 profile可以为任意值
spring.cloud.config.server.git.repos.dev.pattern=dev/*
spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo
## 配置test Git仓库位置 profile为pp或oo开头
spring.cloud.config.server.git.repos.test.pattern=test/pp*,test/oo*
spring.cloud.config.server.git.repos.test.uri=http://git.oschina.net/didispace/{application}-config
2.2.3 访问权限
Config Server在访问Git仓库的时候,若采用HTTP方式进行认证需要设置username
和password
属性配置账户(参考1.1章节)。也可以采用SSH的方式,通过生成Key并在Git仓库中进行配置匹配以实现访问。
2.3 本地仓库
在使用Git或SVN仓库之后,文件都会在Config Server的本地文件系统中存储一份,默认会被存储于以config-repo为前缀的临时目录中,如名为/temp/config-repo-<随机数>的目录。由于其随机性以及临时目录的特性,可能会发生一些不可预知的后果,为避免这些问题,最好指定一个固定的位置存储。通过spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
来配置一个准备好的目录。
2.4 本地文件系统
Spring Cloud Config也提供了一种不使用Git仓库或SVN仓库的存储方式,使用本地文件系统的存储方式来保存配置信息。
设置属性spring.profiles.active=native
,Config Server会默认从应用的src/main/resource
目录下搜索配置文件。若需要指定搜索配置文件的路径,通过spring.cloud.config.server.native.serchLocation
属性来指定具体的配置文件位置。
2.5 健康检测
Spring Cloud Config服务端为spring-boot-actuator模块的/health端点实现了对应的健康检测器。它默认构建一个application为app的仓库,当使用占位符配置URI时(以2.2.1章节为例),该检测器会不断检查http://git.oschina.net/didispace/app-config仓库是否可以连通,因此控制台会出现警告信息。
-
配置实际存在的仓库进行连通检测
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}-config spring.cloud.config.server.git.username=username spring.cloud.config.server.git.password=password ## name: 应用名 spring.cloud.config.server.health.repositories.check.name=check-repo ## label: 分支名 spring.cloud.config.server.health.repositories.check.label=master ## profiles: 环境名 spring.cloud.config.server.health.repositories.check.profiles=default
实现对仓库
check-repo-config
的连通性检测 -
关闭健康检测器
spring.cloud.config.server.health.enabled=false
2.6 属性覆盖
覆盖属性配置的参数,不会被Spring Cloud客户端修改,并且Spring Cloud客户端从Config Server中获取配置信息时,都会取得这些配置信息。覆盖属性参数并非强制的,可以通过改变客户端中更高优先级的配置方式选择是否使用Config Server提供的默认值。
spring.cloud.config.server.overrides.name=didi
spring.cloud.config.server.overrides.from=shanghai
2.7 安全保护
为配置中心实现安全保护的方式有很多,如:物理网络限制,OAuth2授权等。由于微服务应用和配置中心构建于Spring Boot基础上,所以与Spring Security结合更加方便。
只需在配置中心加入spring-boot-starter-security
依赖即可实现对配置中心访问的安全保护。默认情况下,会获取一个名为user的用户,在配置中心启动时,在日志中打印出该用户的随机密码:
INFO 22028 --- [ main] b.a.s.AuthenticationManagerConfiguration : Using default security password: 1a32a848-da0c-4590-9c58-e860be8c50dd
多数情况下不会使用随机生成密码的机制,可以在配置中心的配置文件中指定用户和密码:
security.user.name=user
security.user.password=1a32a848-da0c-4590-9c58-e860be8c50dd
在客户端中加入安全信息来通过校验:
spring.cloud.config.username=user
spring.cloud.config.password=1a32a848-da0c-4590-9c58-e860be8c50dd
网友评论