Spring Cloud Config 配置中心使用说明(2) -- 服务器+git库

spring cloud config 服务器提供了基于HTTP 的外部配置(名称值对或等效的YAML内容)资源API 。服务器可以使用@EnableConfigServer注释轻松嵌入到Spring Boot应用程序中。所以下面这个应用程序是一个配置服务器:

ConfigServer.java

@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
  public static void main(String[] args) {
    SpringApplication.run(ConfigServer.class, args);
  }
}

像所有的Spring boot程序一样,它默认运行在8080端口,但是你可以通过多种方法把端口改为8888。最简单的设置默认配置存储库是通过使用spring.config.name=configserver启动(在Config Server jar中有一个configserver.yml)。另一个是使用你自己的application.properties,例如
application.properties

server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo

其中${user.home}/config-repo是包含YAML和属性文件的git仓库。

提示
在Windows中,如果文件URL为带有驱动器前缀的绝对路径,例如file:///${user.home}/config-repo,则需要额外的“/”。

以下是上面示例中创建git仓库的方法:

$ cd $HOME
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"

注意:
使用本地文件系统进行git存储库仅用于测试。在生产环境中应使用服务器托管配置库。

注意:
如果您只保留文本文件,则配置库的初始克隆将会快速有效。如果您存储二进制文件,尤其是较大的文件,则可能会遇到服务器中第一个配置请求延迟或内存不足错误。

1. 配置文件仓库

您要在哪里存储配置服务器的配置数据?管理此行为的策略是EnvironmentRepository,服务于Environment对象。这个Environment是Spring Environment(包括propertySources作为主要功能)的域的浅层副本。Environment资源有三个变量:

  • {application}映射到客户端的“spring.application.name”;
  • {profile}映射到客户端上的“spring.profiles.active”(逗号分隔列表)
  • {label}这是一个服务器端功能,标记“版本”的一组配置文件。

存储库实现通常表现得像一个Spring Boot应用程序,加载的配置文件中“spring.config.name”等于{application},“spring.profiles.active”等于{profiles}参数。配置文件的优先级规则也与常规启动应用程序中的相同:活动配置文件优先于默认配置,如果存在多个配置文件,则取最后一个配置文件(类似向Map添加条目))。

下面例子包含启动配置:
bootstrap.yml

spring:
  application:
    name: foo
  profiles:
    active: dev,mysql

(像往常的Spring Boot应用程序一样,这些属性也可以设置为环境变量或命令行参数)。

如果存储库是基于文件的,则服务器将从application.yml(在所有配置之间共享)和foo.yml(以foo.yml优先)创建环境变量。如果YAML文件中有指定Spring profile,则它指定的那些有较高优先级(按照列出的配置文件的顺序)。并且如果存在特定profile的YAML(或属性)文件,那么这些文件的优先级高于默认值。指定的配置文件中那些较高优先级的属性转换为环境变量中的属性源。(这些规则与独立的Spring Boot应用程序相同。)

你可以将spring.cloud.config.server.accept-empty设为false,当应用找不到时,服务器会返回404。默认情况下,该值为true。

1.1 Git后端

EnvironmentRepository的默认实现使用Git仓库,这对于管理升级、物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置属性(例如application.yml)。如果您使用file:前缀进行设置,则应用从本地存储库中运行,以便在没有服务器的情况下快速方便地启动。但在这种情况下,服务器将直接在本地存储库中进行操作,而不会克隆它(它不是裸机也没关系,因为配置服务器永远不会更改“远程”资源库)。要扩展Config Server并使其高度可用,您需要将服务器的所有实例指向同一个存储库,因此只有共享文件系统才能正常工作。即使在这种情况下,最好使用共享文件系统存储库的ssh:协议,以便服务器可以将其克隆并使用本地工作副本作为缓存。

该存储库实现将HTTP资源的{label}参数映射到git标签(提交ID,分支名称或标签)。如果git分支或标签名称包含斜杠(“/”),则应使用特殊字符串“()”替换,以避免与其他URL路径弄混。例如,如果标签是foo/bar,则替换斜杠将导致类似于foo()bar的标签。{application}参数也同样适用。如果您使用像curl这样的命令行客户端,请小心URL中的括号,你应该使用单引号括起来。

1.2 跳过SSL证书检查

配置中心服务器对git库的SSL证书检查可以禁止掉,只要将git.skipSslValidation属性设为true即可(默认为false)

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.com/my/repo
          skipSslValidation: true

1.3 设置HTTP连接超时

你可以设置配置服务器 建立http连接的等待时间,单位为秒。对应的属性是git.timeout。

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.com/my/repo
          timeout: 4

1.4 Git URI中的占位符

Spring Cloud Config服务器支持一个Git仓库URL中包含{application}和{profile}(以及{label})的占位符,请记住,标签为git标签。因此,您可以轻松支持“每个应用程序的一个repo”策略,如下:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}

或使用{profile}实现“每个profile环境一个git库”策略。

1.5 模式匹配和多个存储库

还可以通过应用程序和配置文件名称的模式匹配来支持更复杂的需求。模式格式是带有通配符的{application}/{profile}以逗号分隔的列表(其中以通配符开头的模式可能需要引用起来)。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

如果{application}/{profile}没匹配任何模式,它将使用在“spring.cloud.config.server.git.uri”下定义的默认uri。在上面的例子中,对于“simple”存储库,模式是simple/*(即所有配置文件中只匹配一个名为“simple”的应用程序)。“local”存储库与所有配置文件中以“local”开头的所有应用程序名称匹配(自动将/*后缀添加到任何没有指定profile的模式)。

提示:
在上述“simple”示例中使用的“单行”快捷方式只能在只设置了URI的情况下使用。如果您需要设置其他任何内容(凭据,模式等),则需要使用完整的格式。

repo中的pattern属性实际上是一个数组,因此您可以使用属性文件中的YAML数组(或[0],[1]等后缀)绑定到多个模式。如果要运行具有多个配置文件的应用程序,则可能需要执行此操作。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            development:
              pattern:
                - '*/development'
                - '*/staging'
              uri: https://github.com/development/config-repo
            staging:
              pattern:
                - '*/qa'
                - '*/production'
              uri: https://github.com/staging/config-repo

提示:
Spring Cloud猜测不以结尾的配置文件模式意味着您实际上希望匹配以该模式开始的配置文件列表(所以/staging是["/staging", "/staging,*"]的快捷方式) 。这是常见的,您需要在本地的“development”配置文件中运行应用程序,但也可以远程运行“cloud”配置文件。

每个存储库还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以在searchPaths中指定。例如在顶层搜索:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: foo,bar*

在此示例中,在服务器顶级目录搜索“foo”子目录以及名称以“bar”开头的任何子目录中的配置文件。

默认情况下,首次请求配置时,服务器克隆远程存储库。服务器可以配置为在启动时克隆存储库。例如下面的最高级例子:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          repos:
            team-a:
                pattern: team-a-*
                cloneOnStart: true
                uri: https://git/team-a/config-repo.git
            team-b:
                pattern: team-b-*
                cloneOnStart: false
                uri: https://git/team-b/config-repo.git
            team-c:
                pattern: team-c-*
                uri: https://git/team-a/config-repo.git

在此示例中,服务器在启动时克隆了team-a的config-repo。所有其他存储库将不被克隆,直到存储库配置被请求。

提示:
在配置服务器启动时设置要克隆的存储库可以帮助在配置服务器启动时快速识别错误配置的源(例如,无效的存储库URI)。配置源不启用cloneOnStart时,配置服务器可能启动成功但配置错误或无效的配置源,并且直到应用程序从该配置源请求配置为止不会检测到错误。

1.6 认证

要在远程存储库上使用HTTP基本身份验证,请分别添加“username”和“password”属性(不在URL中),例如

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          username: trolley
          password: strongpassword

如果你不使用https和用户凭据,也可以使用指向SSH位置的URI git@github.com:configuration/cloud-configuration,同时ssh的密钥要保存在默认目录(~/.ssh)。重要的是," ~/.ssh/known_hosts"文件中要有git服务器对应的记录,同时它的格式是ssh-rsa。其它的格式(如ecdsa-sha2-nistp256)是不支持的。为了避免意外,您应该确保known_hosts文件中Git服务器对应的条目只有一个,并且与您提供给配置服务器的URL匹配。如果您在URL中使用了一个主机名,那么在known_hosts文件中也使用该主机名,而不是IP。使用JGit访问存储库,因此上面的任何文档都应适用。HTTPS代理设置可以在 ~/.git/config设置,也可以通过系统属性(-Dhttps.proxyHost和-Dhttps.proxyPort)设置,与任何其他JVM进程相同。

提示:
如果您不知道~/.git目录在何处,使用git config --global命令修改设置(例如git config --global http.sslVerify false)。

JGit要求PEM格式的RSA密钥。下面是生成密钥的命令:

ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa

注意:使用SSH密钥时,ssh私钥必须以“-----BEGIN RSA PRIVATE KEY-----”开始。如果私钥以“-----BEGIN OPENSSH PRIVATE KEY-----”开始,则RSA密钥在服务器启动时不会被加载,会报以下错误:

Error in object ‘spring.cloud.config.server.git’: codes [PrivateKeyIsValid.spring.cloud.config.server.git,PrivateKeyIsValid]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.cloud.config.server.git.,]; arguments []; default message []]; default message [Property ‘spring.cloud.config.server.git.privateKey’ is not a valid private key]

要解决这个问题,必须把RSA密钥转为PEM格式。生成密钥的命令上面已经提供。

1.7 在属性文件中配置git ssh

默认情况下,Spring Cloud Config 服务器使用的JGit库通过SSH地址连接git库的时候,使用的配置文件是~/.ssh/known_hosts和/etc/ssh/ssh_config。在类似 Cloud Foundry的云端环境中,本地文件系统可能是临时或难以访问的。在那种情况下,SSH配置可以写在Java属性文件中。要激活属性文件的SSH配置,需要把spring.cloud.config.server.git.ignoreLocalSshSettings属性设置为true,例如:

spring:
    cloud:
      config:
        server:
          git:
            uri: git@gitserver.com:team/repo1.git
            ignoreLocalSshSettings: true
            hostKey: someHostKey
            hostKeyAlgorithm: ssh-rsa
            privateKey: |
                         -----BEGIN RSA PRIVATE KEY-----
                         MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
                         IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
                         ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
                         1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
                         oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
                         DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
                         fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
                         BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
                         EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
                         5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
                         +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
                         pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
                         ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
                         xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
                         dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
                         PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
                         VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
                         FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
                         gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
                         VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
                         cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
                         KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
                         CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
                         q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
                         69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
                         -----END RSA PRIVATE KEY-----

SSH配置有如下属性:
Table 1. SSH Configuration Properties

属性名说明
ignoreLocalSshSettings如果设为true,使用属性文件中的SSH配置代替文件系统中的配置。
privateKeyssh连接的私钥
hostKey合法的SSH主机key,对应known_hosts文件中的值。如果设置了hostKeyAlgorithm,同时必须设置此属性
hostKeyAlgorithmssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384 或 ecdsa-sha2-nistp521 中的一个。与hostKey必须同时设置
strictHostKeyCheckingtrue 或 false。如果是false,忽略主机key错误
knownHostsFile自定义.known_hosts文件位置
preferredAuthentications重写服务器认证方法的顺序。在使用 publickey方法认证前,服务器可以通过键盘输入认证

1.8 Git搜索路径中的占位符

Spring Cloud Config服务器还支持在搜索路径中使用占位符 {application}和{profile}以及{label}(如果需要)。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: '{application}'

在资源库指定名称的目录(以及顶级)中搜索文件。通配符在具有占位符的搜索路径中也是有效的(搜索任何匹配的目录)。

1.9 强制拉取Git库

如前所述Spring Cloud Config服务器克隆远程git存储库,如果某种原因本地副本变脏(例如,由操作系统进程更改文件夹内容),则Spring Cloud Config服务器不会从远程存储库更新本地副本。

要解决这个问题,有一个force-pull属性 将使Spring Cloud Config Server当本地副本是脏的时 强制从远程存储库中拉取。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          force-pull: true

如果您有多个存储库配置,则可以为每个存储库配置force-pull属性。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          force-pull: true
          repos:
            team-a:
                pattern: team-a-*
                uri: https://git/team-a/config-repo.git
                force-pull: true
            team-b:
                pattern: team-b-*
                uri: https://git/team-b/config-repo.git
                force-pull: true
            team-c:
                pattern: team-c-*
                uri: https://git/team-a/config-repo.git

提示:
force-pull属性默认值为false

1.10 删除无关分支

配置服务器启动时,会从git库中拉取分支(由label指定),这些分支会一直保留直到服务器重启。所以会出现远程git库删除了分支,但本地还存在的情况。如果客户端启动时指定了参数–spring.cloud.config.label=deletedRemoteBranch,master,则会从配置中心本地分支deletedRemoteBranch中获取属性,而不是master。
为了使用本地的仓库分支与远程服务器一致,deleteUntrackedBranches属性需要被设置。它会使配置中心删除本地多余的分支。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          deleteUntrackedBranches: true

提示:
deleteUntrackedBranches属性的默认值为false

1.11 git刷新频率

通过属性spring.cloud.config.server.git.refreshRate,你可以控制配置中心刷新配置数据的频率。单位是秒。默认值是0,表示每次请求数据都会从git库拉取更新。

Spring Cloud Config 使用说明(1) – 快速开始
Spring Cloud Config 配置中心使用说明(2) – 服务器+git库
Spring Cloud Config 配置中心使用说明(3) – 服务器+文件存储
Spring Cloud Config 配置中心使用说明(4) – 服务器+数据库存储
Spring Cloud Config 配置中心使用说明(5) – 服务器健康与安全配置
Spring Cloud Config 配置中心使用说明(6) – 服务器 配置文件格式
Spring Cloud Config 配置中心使用说明(7) – 服务器 配置变更通知
Spring Cloud Config 配置中心使用说明(8) – 客户端

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值