对于最新的稳定版本,请使用 Spring Cloud Config 4.3.0! |
Git 后端
默认实现EnvironmentRepository
使用 Git 后端,这对于管理升级和物理环境以及审计更改非常方便。
要更改存储库的位置,您可以将spring.cloud.config.server.git.uri
配置服务器中的配置属性(例如,在application.yml
).
如果将其设置为file:
前缀,它应该从本地存储库工作,这样您就可以在没有服务器的情况下快速轻松地开始使用。但是,在这种情况下,服务器直接在本地存储库上运行,而无需克隆它(如果它不是裸露的也没关系,因为配置服务器永远不会对“远程”存储库进行更改)。
要纵向扩展配置服务器并使其高可用性,您需要让服务器的所有实例都指向同一个存储库,因此只有共享文件系统才能工作。
即使在这种情况下,最好使用ssh:
协议,以便服务器可以克隆它并使用本地工作副本作为缓存。
此存储库实现映射{label}
参数添加到 git 标签(提交 ID、分支名称或标签)。
如果 git 分支或标签名称包含斜杠 (),则应使用特殊字符串指定 HTTP URL 中的标签/
({special-string})
(以避免与其他 URL 路径的歧义)。
例如,如果标签是foo/bar
,替换斜杠将导致以下标签:foo({special-string})bar
.
包含特殊字符串({special-string})
也可以应用于{application}
参数。
如果您使用 curl 等命令行客户端,请小心 URL 中的括号 - 您应该用单引号 ('') 将它们从 shell 中转义。
跳过 SSL 证书验证
可以通过设置git.skipSslValidation
属性设置为true
(默认值为false
).
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
skipSslValidation: true
设置连接超时
您可以配置配置服务器等待获取 HTTP 或 SSH 连接的时间(以秒为单位)。使用git.timeout
属性(默认值为5
).
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
timeout: 4
Git URI 中的占位符
Spring Cloud Config Server 支持带有{application}
和{profile}
(和{label}
如果需要,但请记住,无论如何,标签都是作为 Git 标签应用的)。
因此,可以使用类似于以下内容的结构来支持“每个应用程序一个存储库”策略:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/\{application}
您还可以使用类似的模式来支持“每个配置文件一个存储库”策略,但使用{profile}
.
此外,使用特殊字符串({special-string})
在您的{application}
参数可以启用对多个
组织,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/\{application}
哪里{application}
在请求时以以下格式提供:organization({special-string})application
.
模式匹配和多个存储库
Spring Cloud Config 还包括对更复杂的要求的支持,其中包含 pattern
应用程序和配置文件名称的匹配。
模式格式是逗号分隔的列表{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
.
在上面的示例中,对于“简单”存储库,模式为simple/*
(它仅匹配一个名为simple
在所有配置文件中)。“本地”存储库匹配以local
在所有配置文件中(后缀会自动添加到任何没有配置文件匹配器的模式)。/*
仅当要设置的唯一属性是 URI 时,才能使用“简单”示例中使用的“单行”快捷方式。如果您需要设置任何其他内容(凭据、模式等),则需要使用完整形式。 |
这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,*"] ,依此类推)。例如,您需要在本地运行“开发”配置文件中的应用程序,但也需要远程运行“云”配置文件中的应用程序,这很常见。 |
每个存储库还可以选择将配置文件存储在子目录中,并且搜索这些目录的模式可以指定为search-paths
. 以下示例显示了顶层的配置文件:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
search-paths:
- 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 未为配置源启用,则配置服务器可能会在配置错误或无效的配置源的情况下成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。 |
认证
要在远程存储库上使用 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 指向 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
).
如果您不知道您的~/.git 目录是,使用git config --global 以作设置(例如,git config --global http.sslVerify false ). |
JGit 需要 PEM 格式的 RSA 密钥。下面是一个示例 ssh-keygen(来自 openssh)命令,它将生成 corect 格式的密钥:
ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa
使用 SSH 密钥时,预期的 ssh 私钥必须以
|
要纠正上述错误,必须将 RSA 密钥转换为 PEM 格式。上面提供了一个使用 openssh 以适当格式生成新密钥的示例。
使用 AWS CodeCommit 进行身份验证
Spring Cloud Config Server 还支持 AWS CodeCommit 身份验证。 AWS CodeCommit 在从命令行使用 Git 时使用身份验证帮助程序。 此帮助程序不与 JGit 库一起使用,因此如果 Git URI 与 AWS CodeCommit 模式匹配,则会为 AWS CodeCommit 创建 JGit CredentialProvider。 AWS CodeCommit URI 遵循以下模式:
https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}
如果您使用 AWS CodeCommit URI 提供用户名和密码,则它们必须是提供对存储库的访问权限的 AWS accessKeyId 和 secretAccessKey。 如果未指定用户名和密码,则使用默认凭证提供程序链检索 accessKeyId 和 secretAccessKey。
如果您的 Git URI 与 CodeCommit URI 模式匹配(如上所示),则必须在用户名和密码中或在默认凭证提供程序链支持的位置之一提供有效的 AWS 凭证。 AWS EC2 实例可以使用 EC2 实例的 IAM 角色。
这software.amazon.awssdk:auth jar 是一个可选的依赖项。如果software.amazon.awssdk:auth jar 不在您的类路径上,则不会创建 AWS Code Commit 凭证提供程序,无论 git 服务器 URI 如何。 |
使用 Google Cloud Source 进行身份验证
Spring Cloud Config Server 还支持针对 Google Cloud Source 存储库进行身份验证。
如果您的 Git URI 使用http
或https
协议,域名为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。
Google Cloud Source 凭据提供程序将使用 Google Cloud Platform 应用程序默认凭据。请参阅 Google Cloud SDK 文档,了解如何为系统创建应用默认凭据。此方法适用于开发环境中的用户帐户和生产环境中的服务帐户。
com.google.auth:google-auth-library-oauth2-http 是可选的依赖项。
如果google-auth-library-oauth2-http jar 不在您的类路径上,则不会创建 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:
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 配置属性。
属性名称 | 言论 |
---|---|
忽略 LocalSshSettings |
如果 |
私钥 |
有效的 SSH 私钥。如果出现以下情况,则必须设置 |
主机密钥 |
有效的 SSH 主机密钥。如果出现以下情况,则必须设置 |
hostKey算法 |
其中之一 |
strictHostKey检查 |
|
已知主机文件 |
自定义位置 |
preferredAuthentications |
覆盖服务器身份验证方法顺序。如果服务器在 |
Git 搜索路径中的占位符
Spring Cloud Config Server 还支持带有占位符的搜索路径{application}
和{profile}
(和{label}
如果
你需要它),如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
search-paths: '\{application}'
前面的列表会导致在存储库中搜索与目录(以及顶级)同名的文件。 通配符在带有占位符的搜索路径中也有效(任何匹配的目录都包含在搜索中)。
在 Git 存储库中强制拉取
如前所述,Spring Cloud Config Server 会克隆远程 git 存储库,以防本地副本变脏(例如, 文件夹内容由作系统进程更改),因此 Spring Cloud Config Server 无法从远程存储库更新本地副本。
为了解决这个问题,有一个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 . |
删除 Git 存储库中未跟踪的分支
由于 Spring Cloud Config Server 具有远程 git 存储库的克隆
将分支签出到本地存储库后(例如,按标签获取属性),它将保留此分支
永远或直到下一次服务器重新启动(这将创建新的本地存储库)。
因此,可能会出现远程分支被删除但仍然可以获取它的本地副本的情况。
如果 Spring Cloud Config Server 客户端服务以--spring.cloud.config.label=deletedRemoteBranch,master
它将从deletedRemoteBranch
local 分支,但不是来自master
.
为了保持本地存储库分支干净并达到远程状态 -deleteUntrackedBranches
属性可以设置。
它将使 Spring Cloud Config Server 从本地存储库中强制删除未跟踪的分支。
例:
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 存储库中获取更新的配置
被要求。如果该值为负数,则不会进行刷新。
默认标签
用于 Git 的默认标签是main
.如果您不设置spring.cloud.config.server.git.defaultLabel
以及一个名为main
不存在,则配置服务器默认还将尝试签出名为master
.如果
你想要禁用可以设置的回退分支行为spring.cloud.config.server.git.tryMasterBranch
自false
.
在容器中使用 Git 运行配置服务器
如果您收到java.io.IOException
在类似于以下内容的容器中运行配置服务器时:
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
您必须:
-
在容器内为用户提供可写的主目录。
-
设置环境变量
XDG_CONFIG_HOME
指向 Java 进程具有写入权限的目录。