资料参考:《Spring Cloud 微服务实战》
目录
服务端详解
前面一篇《springcloud系列—Zuul—第6章-1: Spring Cloud Config 配置中心》我们实现了一个具备基本结构得配置管理服务端和客户端,同事讲解了其中得一些配置得基本原理和规则。在本节我们将进一步了解Spring Cloud Config服务端得一些用法。
基本架构
一:我们需要深入了解一下配置中心是如何运作起来得。下面是它的基本结构图
- 远程git仓库:用来存储配置文件的地方,快速入门中应用名为
zhihao
的多环境配置文件:zhihao-{profile}.properties
. - config server:这是我们快速入门中构建的分布式配置中心,
config-server-git
项目,在该工程中指定了所要连接的git仓库位置以及账户,密码等连接信息。 - 本地git仓库:在
config server
的文件系统中,每次客户端请求获取配置信息时,Config Server
从git仓库中获取最新的配置到本地,然后在本地git仓库中读取并返回。当远程仓库无法获取时,直接将本地的内容返回。 - Service A,Service B:具体的微服务应用,他们指定了
config Server
地址,从而实现从外部化获取应用自己要用的配置信息。这些应用在启动的时候,会向config server
请求获取配置信息来进行加载。
二:客户端应用从配置管理中获取配置信息遵从下面的执行流程:
- 应用启动时,根据
bootstrap.yml
中配置的应用名{application}
,环境名{profile}
,分支名{label}
,向config server
请求获取配置信息 config server
根据自己维护的git仓库信息和客户端传递过来的配置信息去查找配置信息。- 根据
git clone
命令将找到的配置信息下载到Config Server
的文件系统中 Config Server
创建Spring的ApplictionContext实例,并从git本地仓库中加载配置文件,最后将这些配置内容读取出来返回给客户端应用。- 客户端应用在获取外部配置文件后加载到客户端的
ApplicationContext
实例,该配置内容的优先级高于客户端jar包内部的配置内容,所以在jar包中重复的内容不再被加载。
git配置仓库
在spring cloud config
的服务端,对于配置仓库的默认实现采用了git。git非常适用于存储配置内容,它可以非常方便的使用各种第三方工具来对内容进行管理更新和版本化,同时git仓库的hook功能还可以帮助我们实时的监控配置内容的修改。其中,git自身的版本控制功能正是其他一些配置中心所欠缺的,通过git进行存储意味着,一个应用的不同部署实例可以从spring cloud config
的服务端获取不同的版本配置,从而支持一些特殊的应用场景。
由于spring cloud config
中默认使用git,所以我们只需要在config server
中的application.properties
中设置spring.cloud.config.server.git.uri
属性,比如下面的配置:
spring.application.name=config-server-git
server.port=7001
spring.cloud.config.server.git.uri=https://github.com/servef-toto/SpringCloud-Demo/
spring.cloud.config.server.git.search-paths=config-server-file/git-config
spring.cloud.config.server.git.username=servef-toto
spring.cloud.config.server.git.password=0311aiWuLiuHong
如果我们将该值通过file://前缀来设置为一个文件地址(在window系统中,要使用file:///来定位文件内容),那么它将以本地仓库的方式运行,这样我们就可以脱离git服务端来快速进行调试与开发,比如:因为在快速入门的时候我们知道配置git仓库的时候读取配置会从git远程仓库中git clone到本地,我的控制台日志告诉我下载到本地的/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/
文件夹下(当然自己也可以git clone
远程的配置信息到本地),
所以如下配置(spring.cloud.config.server.git.uri=file://${user.home}/config-repo
)
spring:
application:
name: config-server-git
cloud:
config:
server:
git:
uri: file://var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo
其中,${user.home}
代表当前用户的所属目录,file://配置的本地文件系统方式虽然对于本地开发调试时使用非常方便,但是该方式也仅用于开发与测试,在生产环境中务必搭建自己的git仓库来存储配置资源。
With VCS based backends (git, svn) files are checked out or cloned to the local filesystem. By default they are put in the system temporary directory with a prefix of config-repo-. On linux, for example it could be /tmp/config-repo-<randomid>. Some operating systems routinely clean out temporary directories. This can lead to unexpected behaviour such as missing properties. To avoid this problem, change the directory Config Server uses, by setting
spring.cloud.config.server.git.basedir or spring.cloud.config.server.svn.basedir to a directory that does not reside in the system temp structure.
使用基于VCS的后端(git,svn)文件被检出或克隆到本地文件系统。 默认情况下,它们放在系统临时目录中,前缀为config-repo-
。 在linux上,例如可以是/tmp/config-repo- <randomid>
。 一些操作系统会定期清除临时目录。 这可能会导致意外的行为,例如缺少属性。 为避免此问题,请通过将spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
设置为不驻留在系统临时结构中的目录来更改Config Server
所使用的目录。
占位符配置url
{application}
,{profile}
,{label}
这些占位符除了用于标识配置文件的规则之外,还可以用于config Server
中对git
仓库地址的url配置。比如我们可以通过{application}
占位符实现一个应用对应一个git仓库目录的配置效果,具体配置实现:
具体配置实现:
spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/{application}
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
其中,{application}
代表了应用名,所以当客户端应用向config server
发起获取配置的请求时,Config server
会根据客户端的spring.application.name
信息来填充{application}
占位符以定位配置资源的存储位置,从而实现根据微服务应用的属性动态获取不同的配置。另外,在这些占位符中,{label}
参数较为特别,如果git的分支和标签名包含"/",那么{label}参数在http的url中应该使用"(_)"来代替,以避免改变了url含义,指向到其他的url资源。
当我们使用git作为配置中心来存储各个微服务应用配置文件的时候,该功能会变得非常有用,通过在url中使用占位符可以帮助我们规划和实现通用的仓库配置,比如,下面的规划:
- 代码库:使用服务名作为git仓库名称,比如用户服务的代码库
http://git.oschina.net/zhihaomiao/user-service
- 配置库:使用服务名加上
-config
后缀作为git仓库名称,比如用户服务的配置库地址位置是http://git.oschina.net/zhihaomiao/user-service-config
这时,我们就可以使用spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/{application}-config
配置,来同时匹配多个不同服务的配置仓库。
配置多个仓库
config server
除了可以通过application
和profile
模式来匹配配置仓库之外,还支持通过带有通配符的表达式来匹配,以实现更为复杂的配置要求。并且当我们有多个匹配规则的时候,还可以通过逗号来分割多个{application}/{profile}配置规则,比如:
spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/config-repo
spring.cloud.config.server.git.repos.dev.pattern=dev/*
spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo
spring.cloud.config.server.git.repos.test=http://git.oschina.net/test/config-repo
spring.cloud.config.server.git.repos.prod.pattern=prod/pp*,online/oo*
spring.cloud.config.server.git.repos.prod.uri=http://git.oschina.net/prod/config-repo
上述配置内容通过配置内容spring.cloud.config.server.git.uri
属性,指定了一个默认的仓库位置,当使用{application}/{profile}
模式未能匹配到合适的仓库时,就将在该默认仓库位置下获取配置信息。除此之外,还配置了三个仓库,分别是dev
,test
,prod
。其中,dev
仓库匹配dev/*
的模式,所以无论profile
是什么,它都能匹配application
名称为dev
的应用。并且我们可以注意到,它存储的配置文件位置还采用了config server
的本地文件系统中的内容。对于此位置,我们可以通过访问http://localhost:9090/dev/profile
的请求来验证到该仓库的配置内容,其中profile
可以是任意值。而test
和prod
仓库均使用git仓库的存储,并且test仓库未配置匹配规则,所以它只匹配application
名为test
的应用;prod
仓库则需要匹配application
为prod
并且profile
为pp
开头,或者application
为online
并且profile
为oo
开头的应用和环境。
当配置多个仓库的时候,config server
在启动的时会直接克隆第一个仓库的配置库,其他的配置只有在请求时才会克隆到本地,所以对于仓库的排列可以根据配置内容的重要程度有所区分。另外,如果表达式是以通配符开始的,那么需要使用引号将配置内容引起来。
子目录存储
除了支持占位符配置,多仓库配置之外,config server
还可以将配置文件定位到git仓库的子目录中。我们在快速入门中的我们除了配置spring.cloud.config.server.git.uri
之外海配置了另外一个参数:spring.cloud.config.server.git.search-paths
,通过这个参数可以实现在http://git.oschina.net/zhihaomiao/config-repo-demo
仓库的config-repo
子目录下实现配置的存储
。
spring:
application:
name: config-server-git
cloud:
config:
server:
git:
uri: http://git.oschina.net/zhihaomiao/config-repo-demo
username:
password:
search-paths: config-repo
server:
port: 9090
通过上面的配置,我们可以实现http://git.oschina.net/zhihaomiao/config-repo-demo
仓库下,一个应用一个目录的效果。
对于spring.cloud.config.server.git.search-paths
参数的配置也支持使用{application}
,{profile}
和{label}
占位符,比如:
spring:
application:
name: config-server-git
cloud:
config:
server:
git:
uri: http://git.oschina.net/zhihaomiao/config-repo-demo
username:
password:
search-paths: {application}
server:
port: 9090
这种方式也可以一个服务一个目录,这样就可以在一个仓库中管理多个服务的配置,这种方式也比较好。
访问权限
config server
在访问git仓库的时候,若采用http的方式进行认证,那么我们需要增加username
和password
属性来配置账户,比如快速入门的demo
spring:
application:
name: config-server-git
cloud:
config:
server:
git:
uri: http://git.oschina.net/zhihaomiao/config-repo-demo
username:
password:
search-paths: config-repo
server:
port: 9090
若不采用http的认证方式,我们也可以采用ssh的方式,通过生成key并在git仓库中进行配置匹配以实现访问。
svn配置仓库
config server
除了支持git
仓库之外,也能使用svn
仓库,只需要如下配置。
- 在pom.xml中引入
svn
的依赖配置,让config server
拥有读取svn
内容的能力: - 在
application.properties
中使用svn
的配置属性来指定svn
服务器的位置,以及访问的账户名与密码:
spring.cloud.config.server.svn.uri=svn://localhost:443/didispace/config-repo
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password
通过上面的配置修改,config server
就可以使用svn
作为仓库来存储配置文件了,对于客户端来说,这个过程是透明的,所以不需要做任何变动。
本地仓库
在使用了git
或svn
仓库之后,文件都会在config server
的本地文件系统中存储一份,这些文件默认会被存储以config-repo
为前缀的临时目录中,比如/tmp/config-repo-<随机数>
的目录。由于其随机性以及临时目录的特性,可能会有一些不可预知的后果,为了避免将来可能会出现的问题,最好的方法就是指定一个固定的位置来存储这些重要信息。我们只需要通过spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
来配置一个我们准备好的目录即可。
本地文件系统
spring cloud config
也提供了一种不适用git
仓库或svn
仓库的存储方式,而是使用本地文件系统的存储方式来保存配置信息。实现方式也简单,只需要配置属性spring.profile.active=native
,config server
会默认从应用的src/main/resource
目录下搜索配置文件。如果需要指定搜索配置文件的路径,我们可以通过spring.cloud.config.server.native.searchLocations
属性来指定具体的配置文件位置。
虽然spring cloud config
提供了这样的功能,但是为了支持更好的内容管理和版本控制等强大功能,还是推荐使用git仓库的方式
git地址:https://github.com/servef-toto/SpringCloud-Demo/tree/master/config-server-file/git-config