对于最新的稳定版本,请使用 Spring Cloud Config 4.3.0spring-doc.cadn.net.cn

Git 后端

默认实现EnvironmentRepository使用 Git 后端,这对于管理升级和物理环境以及审计更改非常方便。 要更改存储库的位置,您可以将spring.cloud.config.server.git.uri配置服务器中的配置属性(例如,在application.yml). 如果将其设置为file:前缀,它应该从本地存储库工作,这样您就可以在没有服务器的情况下快速轻松地开始使用。但是,在这种情况下,服务器直接在本地存储库上运行,而无需克隆它(如果它不是裸露的也没关系,因为配置服务器永远不会对“远程”存储库进行更改)。 要纵向扩展配置服务器并使其高可用性,您需要让服务器的所有实例都指向同一个存储库,因此只有共享文件系统才能工作。 即使在这种情况下,最好使用ssh:协议,以便服务器可以克隆它并使用本地工作副本作为缓存。spring-doc.cadn.net.cn

此存储库实现映射{label}参数添加到 git 标签(提交 ID、分支名称或标签)。 如果 git 分支或标签名称包含斜杠 (),则应使用特殊字符串指定 HTTP URL 中的标签/({special-string})(以避免与其他 URL 路径的歧义)。 例如,如果标签是foo/bar,替换斜杠将导致以下标签:foo({special-string})bar. 包含特殊字符串({special-string})也可以应用于{application}参数。 如果您使用 curl 等命令行客户端,请小心 URL 中的括号 - 您应该用单引号 ('') 将它们从 shell 中转义。spring-doc.cadn.net.cn

跳过 SSL 证书验证

可以通过设置git.skipSslValidation属性设置为true(默认值为false).spring-doc.cadn.net.cn

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

设置连接超时

您可以配置配置服务器等待获取 HTTP 或 SSH 连接的时间(以秒为单位)。使用git.timeout属性(默认值为5).spring-doc.cadn.net.cn

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

Git URI 中的占位符

Spring Cloud Config Server 支持带有{application}{profile}(和{label}如果需要,但请记住,无论如何,标签都是作为 Git 标签应用的)。 因此,可以使用类似于以下内容的结构来支持“每个应用程序一个存储库”策略:spring-doc.cadn.net.cn

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

您还可以使用类似的模式来支持“每个配置文件一个存储库”策略,但使用{profile}.spring-doc.cadn.net.cn

此外,使用特殊字符串({special-string})在您的{application}参数可以启用对多个 组织,如以下示例所示:spring-doc.cadn.net.cn

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

哪里{application}在请求时以以下格式提供:organization({special-string})application.spring-doc.cadn.net.cn

模式匹配和多个存储库

Spring Cloud Config 还包括对更复杂的要求的支持,其中包含 pattern 应用程序和配置文件名称的匹配。 模式格式是逗号分隔的列表{application}/{profile}带有通配符的名称(请注意,以通配符开头的模式可能需要引用),如以下示例所示:spring-doc.cadn.net.cn

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. 在上面的示例中,对于“简单”存储库,模式为simple/*(它仅匹配一个名为simple在所有配置文件中)。“本地”存储库匹配以local在所有配置文件中(后缀会自动添加到任何没有配置文件匹配器的模式)。/*spring-doc.cadn.net.cn

仅当要设置的唯一属性是 URI 时,才能使用“简单”示例中使用的“单行”快捷方式。如果您需要设置任何其他内容(凭据、模式等),则需要使用完整形式。

pattern属性实际上是一个数组,因此您可以使用 YAML 数组(或[0],[1]等属性文件中的后缀)绑定到多个模式。如果您要运行具有多个配置文件的应用程序,则可能需要这样做,如以下示例所示:spring-doc.cadn.net.cn

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,*"],依此类推)。例如,您需要在本地运行“开发”配置文件中的应用程序,但也需要远程运行“云”配置文件中的应用程序,这很常见。

每个存储库还可以选择将配置文件存储在子目录中,并且搜索这些目录的模式可以指定为search-paths. 以下示例显示了顶层的配置文件:spring-doc.cadn.net.cn

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

在前面的示例中,服务器在顶层和foo/子目录以及名称以bar.spring-doc.cadn.net.cn

默认情况下,服务器在首次请求配置时克隆远程存储库。可以将服务器配置为在启动时克隆存储库,如以下顶级示例所示:spring-doc.cadn.net.cn

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,在它之前 接受任何请求。 在请求存储库的配置之前,不会克隆所有其他存储库。spring-doc.cadn.net.cn

将存储库设置为在配置服务器启动时克隆,有助于在配置服务器启动时快速识别配置错误的配置源(例如无效的存储库 URI)。 跟cloneOnStart未为配置源启用,则配置服务器可能会在配置错误或无效的配置源的情况下成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。

认证

要在远程存储库上使用 HTTP 基本身份验证,请将usernamepassword属性(不在 URL 中),如以下示例所示:spring-doc.cadn.net.cn

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

如果您不使用 HTTPS 和用户凭据,当您将密钥存储在默认目录 (~/.ssh),URI 指向 SSH 位置,例如[email protected]:configuration/cloud-configuration. Git 服务器的条目必须存在于~/.ssh/known_hosts文件,并且它位于ssh-rsa格式。 其他格式(例如ecdsa-sha2-nistp256) 不支持。 为避免意外,应确保known_hosts文件,并且它与您提供给配置服务器的 URL 匹配。 如果您在 URL 中使用主机名,则希望在known_hosts文件。 该存储库是使用 JGit 访问的,因此您在其中找到的任何文档都应该适用。 HTTPS 代理设置可以在~/.git/config或者(与任何其他 JVM 进程相同)与 系统属性 (-Dhttps.proxyHost-Dhttps.proxyPort).spring-doc.cadn.net.cn

如果您不知道您的~/.git目录是,使用git config --global以作设置(例如,git config --global http.sslVerify false).

JGit 需要 PEM 格式的 RSA 密钥。下面是一个示例 ssh-keygen(来自 openssh)命令,它将生成 corect 格式的密钥:spring-doc.cadn.net.cn

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 密钥将不会在启动 spring-cloud-config 服务器时加载。错误如下所示:spring-doc.cadn.net.cn

- 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 格式。上面提供了一个使用 openssh 以适当格式生成新密钥的示例。spring-doc.cadn.net.cn

使用 AWS CodeCommit 进行身份验证

Spring Cloud Config Server 还支持 AWS CodeCommit 身份验证。 AWS CodeCommit 在从命令行使用 Git 时使用身份验证帮助程序。 此帮助程序不与 JGit 库一起使用,因此如果 Git URI 与 AWS CodeCommit 模式匹配,则会为 AWS CodeCommit 创建 JGit CredentialProvider。 AWS CodeCommit URI 遵循以下模式:spring-doc.cadn.net.cn

https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}

如果您使用 AWS CodeCommit URI 提供用户名和密码,则它们必须是提供对存储库的访问权限的 AWS accessKeyId 和 secretAccessKey。 如果未指定用户名和密码,则使用默认凭证提供程序链检索 accessKeyId 和 secretAccessKey。spring-doc.cadn.net.cn

如果您的 Git URI 与 CodeCommit URI 模式匹配(如上所示),则必须在用户名和密码中或在默认凭证提供程序链支持的位置之一提供有效的 AWS 凭证。 AWS EC2 实例可以使用 EC2 实例的 IAM 角色spring-doc.cadn.net.cn

software.amazon.awssdk:authjar 是一个可选的依赖项。如果software.amazon.awssdk:authjar 不在您的类路径上,则不会创建 AWS Code Commit 凭证提供程序,无论 git 服务器 URI 如何。

使用 Google Cloud Source 进行身份验证

Spring Cloud Config Server 还支持针对 Google Cloud Source 存储库进行身份验证。spring-doc.cadn.net.cn

如果您的 Git URI 使用httphttps协议,域名为source.developers.google.com,则将使用 Google Cloud Source 凭据提供程序。Google Cloud Source 存储库 URI 的格式为source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}. 要获取存储库的 URI,请单击 Google Cloud Source UI 中的“克隆”,然后选择“手动生成的凭据”。不要生成任何凭据,只需复制显示的 URI。spring-doc.cadn.net.cn

Google Cloud Source 凭据提供程序将使用 Google Cloud Platform 应用程序默认凭据。请参阅 Google Cloud SDK 文档,了解如何为系统创建应用默认凭据。此方法适用于开发环境中的用户帐户和生产环境中的服务帐户。spring-doc.cadn.net.cn

com.google.auth:google-auth-library-oauth2-http是可选的依赖项。 如果google-auth-library-oauth2-httpjar 不在您的类路径上,则不会创建 Google Cloud Source 凭据提供程序,无论 git 服务器 URI 如何。

使用属性的 Git SSH 配置

默认情况下,Spring Cloud Config Server 使用的 JGit 库使用 SSH 配置文件,例如~/.ssh/known_hosts/etc/ssh/ssh_config使用 SSH URI 连接到 Git 存储库时。 在 Cloud Foundry 等云环境中,本地文件系统可能是短暂的或不易访问的。 对于这些情况,可以使用 Java 属性设置 SSH 配置。 为了激活基于属性的 SSH 配置,请spring.cloud.config.server.git.ignoreLocalSshSettings属性必须设置为true,如以下示例所示:spring-doc.cadn.net.cn

  spring:
    cloud:
      config:
        server:
          git:
            uri: [email protected]: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 配置属性。spring-doc.cadn.net.cn

表 1.SSH 配置属性
属性名称 言论

忽略 LocalSshSettingsspring-doc.cadn.net.cn

如果true,则使用基于属性而不是基于文件的 SSH 配置。必须设置为spring.cloud.config.server.git.ignoreLocalSshSettings而不是在存储库定义中。spring-doc.cadn.net.cn

私钥spring-doc.cadn.net.cn

有效的 SSH 私钥。如果出现以下情况,则必须设置ignoreLocalSshSettings为 true,并且 Git URI 是 SSH 格式。spring-doc.cadn.net.cn

主机密钥spring-doc.cadn.net.cn

有效的 SSH 主机密钥。如果出现以下情况,则必须设置hostKeyAlgorithm也设置了。spring-doc.cadn.net.cn

hostKey算法spring-doc.cadn.net.cn

其中之一ssh-dss, ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521.如果出现以下情况,则必须设置hostKey也设置了。spring-doc.cadn.net.cn

strictHostKey检查spring-doc.cadn.net.cn

truefalse.如果为 false,则忽略主机密钥的错误。spring-doc.cadn.net.cn

已知主机文件spring-doc.cadn.net.cn

自定义位置.known_hosts文件。spring-doc.cadn.net.cn

preferredAuthenticationsspring-doc.cadn.net.cn

覆盖服务器身份验证方法顺序。如果服务器在publickey方法。spring-doc.cadn.net.cn

Git 搜索路径中的占位符

Spring Cloud Config Server 还支持带有占位符的搜索路径{application}{profile}(和{label}如果 你需要它),如以下示例所示:spring-doc.cadn.net.cn

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

前面的列表会导致在存储库中搜索与目录(以及顶级)同名的文件。 通配符在带有占位符的搜索路径中也有效(任何匹配的目录都包含在搜索中)。spring-doc.cadn.net.cn

在 Git 存储库中强制拉取

如前所述,Spring Cloud Config Server 会克隆远程 git 存储库,以防本地副本变脏(例如, 文件夹内容由作系统进程更改),因此 Spring Cloud Config Server 无法从远程存储库更新本地副本。spring-doc.cadn.net.cn

为了解决这个问题,有一个force-pull如果本地副本是脏的,则使 Spring Cloud Config Server 强制从远程存储库中拉取,如以下示例所示:spring-doc.cadn.net.cn

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

如果您有多个存储库配置,则可以配置force-pull属性,如以下示例所示:spring-doc.cadn.net.cn

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.

删除 Git 存储库中未跟踪的分支

由于 Spring Cloud Config Server 具有远程 git 存储库的克隆 将分支签出到本地存储库后(例如,按标签获取属性),它将保留此分支 永远或直到下一次服务器重新启动(这将创建新的本地存储库)。 因此,可能会出现远程分支被删除但仍然可以获取它的本地副本的情况。 如果 Spring Cloud Config Server 客户端服务以--spring.cloud.config.label=deletedRemoteBranch,master它将从deletedRemoteBranchlocal 分支,但不是来自master.spring-doc.cadn.net.cn

为了保持本地存储库分支干净并达到远程状态 -deleteUntrackedBranches属性可以设置。 它将使 Spring Cloud Config Server 从本地存储库中强制删除未跟踪的分支。 例:spring-doc.cadn.net.cn

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          deleteUntrackedBranches: true
的默认值deleteUntrackedBranches属性是false.

Git 刷新率

您可以控制配置服务器获取更新配置数据的频率 使用spring.cloud.config.server.git.refreshRate.这 此属性的值以秒为单位指定。默认情况下,该值为 0,这意味着 配置服务器每次都会从 Git 存储库中获取更新的配置 被要求。如果该值为负数,则不会进行刷新。spring-doc.cadn.net.cn

默认标签

用于 Git 的默认标签是main.如果您不设置spring.cloud.config.server.git.defaultLabel以及一个名为main不存在,则配置服务器默认还将尝试签出名为master.如果 你想要禁用可以设置的回退分支行为spring.cloud.config.server.git.tryMasterBranchfalse.spring-doc.cadn.net.cn

在容器中使用 Git 运行配置服务器

如果您收到java.io.IOException在类似于以下内容的容器中运行配置服务器时:spring-doc.cadn.net.cn

2022-01-03 20:04:02,892 [tributeWriter-2] ERROR org.eclipse.jgit.util.FS$FileStoreAttributes.saveToConfig - Cannot save config file 'FileBasedConfig[/.config/jgit/config]'
java.io.IOException: Creating directories for /.config/jgit failed
  1. 在容器内为用户提供可写的主目录。spring-doc.cadn.net.cn

  2. 设置环境变量XDG_CONFIG_HOME指向 Java 进程具有写入权限的目录。spring-doc.cadn.net.cn