springcloud系列—Config—第6章-2: Spring Cloud Config 服务端详解、git(svn、本地仓库)配置

资料参考:《Spring Cloud 微服务实战》

目录

服务端详解

基本架构

git配置仓库

占位符配置url

配置多个仓库

子目录存储

访问权限

svn配置仓库

本地仓库

本地文件系统


服务端详解

前面一篇《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请求获取配置信息来进行加载。

二:客户端应用从配置管理中获取配置信息遵从下面的执行流程

  1.  应用启动时,根据bootstrap.yml中配置的应用名{application},环境名{profile},分支名{label},向config server请求获取配置信息
  2. config server根据自己维护的git仓库信息和客户端传递过来的配置信息去查找配置信息。
  3. 根据git clone命令将找到的配置信息下载到Config Server的文件系统中
  4. Config Server创建Spring的ApplictionContext实例,并从git本地仓库中加载配置文件,最后将这些配置内容读取出来返回给客户端应用。
  5. 客户端应用在获取外部配置文件后加载到客户端的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.basedirspring.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除了可以通过applicationprofile模式来匹配配置仓库之外,还支持通过带有通配符的表达式来匹配,以实现更为复杂的配置要求并且当我们有多个匹配规则的时候,还可以通过逗号来分割多个{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}模式未能匹配到合适的仓库时,就将在该默认仓库位置下获取配置信息。除此之外,还配置了三个仓库,分别是devtestprod。其中,dev仓库匹配dev/*的模式,所以无论profile是什么,它都能匹配application名称为dev的应用。并且我们可以注意到,它存储的配置文件位置还采用了config server的本地文件系统中的内容。对于此位置,我们可以通过访问http://localhost:9090/dev/profile的请求来验证到该仓库的配置内容,其中profile可以是任意值。而testprod仓库均使用git仓库的存储,并且test仓库未配置匹配规则,所以它只匹配application名为test的应用;prod仓库则需要匹配applicationprod并且profilepp开头,或者applicationonline并且profileoo开头的应用和环境。

当配置多个仓库的时候,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的方式进行认证,那么我们需要增加usernamepassword属性来配置账户,比如快速入门的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作为仓库来存储配置文件了,对于客户端来说,这个过程是透明的,所以不需要做任何变动。

本地仓库

在使用了gitsvn仓库之后,文件都会在config server的本地文件系统中存储一份,这些文件默认会被存储以config-repo为前缀的临时目录中,比如/tmp/config-repo-<随机数>的目录由于其随机性以及临时目录的特性,可能会有一些不可预知的后果,为了避免将来可能会出现的问题,最好的方法就是指定一个固定的位置来存储这些重要信息。我们只需要通过spring.cloud.config.server.git.basedirspring.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

猜你喜欢

转载自blog.csdn.net/weixin_40663800/article/details/85273516