Spring Cloud Config用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为客户端与服务端两部分。其中服务端也成为分布式配置中心,是一个独立的微服务应用,用来链接配置仓库并为客户端提供获取配置信息,加密/解密信息等访问接口;客户端则是微服务架构中的各个微服务应用或基础设施,经过指定的配置中心来管理应用资源与业务相关的配置内容,并在服务启动的时候从配置中心获取和加在配置信息。git
Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射。Spring Cloud Config默认采用GIT来存储配置信息,因此使用Spring Cloud Config构建的配置服务器,自然就支持对微服务应用配置信息的版本管理,同时也支持SVN仓库,本地化文件系统等其余存储方式。spring
建立基础Spring Boot工程:config-serverbootstrap
添加依赖: spring-cloud-config-serverwindows
在主类上使用@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
根据服务端配置在http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/
下建立一个config-repo
目录做为配置仓库,并根据不一样环境新建配置文件:服务器
方便测试版本控制,在该Git仓库的master分支的四个配置文件中设置from属性,并分别设置不一样的值且使1.0做为后缀:网络
建立一个config-label-test分支,并将各配置文件中的from属性后缀改成2.0,经过浏览器,POSTMAN或者其它CURL工具请求配置内容。配置信息的URL与文件的映射关系以下:架构
构造不一样的url来访问不一样的配置内容。获取config-label-test分支,didispace应用的prod环境配置能够访问http://localhost:7001/didispace/prod/config-label-test
app
完成上述准备,确保配置中心已经正常开始工做,构建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属性
基本结构:
客户端应用从配置中心获取配置信息执行流程:
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
{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
当有多个匹配规则的时候,能够用逗号分割多个{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
Config Server在访问Git仓库的时候,若采用HTTP方式进行认证须要设置username
和password
属性配置帐户(参考1.1章节)。也能够采用SSH的方式,经过生成Key并在Git仓库中进行配置匹配以实现访问。
在使用Git或SVN仓库以后,文件都会在Config Server的本地文件系统中存储一份,默认会被存储于以config-repo为前缀的临时目录中,如名为/temp/config-repo-<随机数>的目录。因为其随机性以及临时目录的特性,可能会发生一些不可预知的后果,为避免这些问题,最好指定一个固定的位置存储。经过spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
来配置一个准备好的目录。
Spring Cloud Config也提供了一种不使用Git仓库或SVN仓库的存储方式,使用本地文件系统的存储方式来保存配置信息。
设置属性spring.profiles.active=native
,Config Server会默认从应用的src/main/resource
目录下搜索配置文件。若须要指定搜索配置文件的路径,经过spring.cloud.config.server.native.serchLocation
属性来指定具体的配置文件位置。
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
覆盖属性配置的参数,不会被Spring Cloud客户端修改,而且Spring Cloud客户端从Config Server中获取配置信息时,都会取得这些配置信息。覆盖属性参数并不是强制的,能够经过改变客户端中更高优先级的配置方式选择是否使用Config Server提供的默认值。
spring.cloud.config.server.overrides.name=didi spring.cloud.config.server.overrides.from=shanghai
为配置中心实现安全保护的方式有不少,如:物理网络限制,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