SpringCloud Git后端
EnvironmentRepository
的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置spring.cloud.config.server.git.uri
配置属性(例如,在application.yml
中)。如果您使用file:
前缀进行设置,则它应在本地存储库中运行,以便无需服务器即可快速轻松地开始使用。但是,在那种情况下,服务器直接在本地存储库上运行而无需克隆它(如果它不是裸露的,这并不重要,因为Config
Server从不对“远程”存储库进行更改)。要扩展Config Server并使其高度可用,您需要使服务器的所有实例都指向同一存储库,因此仅共享文件系统可以工作。即使在那种情况下,最好对共享文件系统存储库使用ssh:
协议,以便服务器可以克隆它并将本地工作副本用作缓存。
此存储库实现将HTTP资源的{label}
参数映射到git标签(提交ID,分支名称或标记)。如果git分支或标记名称包含斜杠(/
),则应使用特殊字符串(_)
在HTTP URL中指定标签(以避免与其他URL路径产生歧义)。例如,如果标签为foo/bar
,则替换斜杠将产生以下标签:foo(_)bar
。特殊字符串(_)
的包含内容也可以应用于{application}
参数。如果您使用命令行客户端(例如curl),请注意URL中的括号-您应使用单引号('')将其从外壳中移出。
跳过SSL证书验证
可以通过将git.skipSslValidation
属性设置为true
(默认值为false
)来禁用配置服务器对Git服务器的SSL证书的验证。
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
skipSslValidation: true
设置HTTP连接超时
您可以配置配置服务器将等待获取HTTP连接的时间(以秒为单位)。使用git.timeout
属性。
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
timeout: 4
Git URI中的占位符
Spring Cloud Config服务器支持带有{application}
和{profile}
(如果需要的话还有{label}
)占位符的git存储库URL,但是请记住该标签始终用作git标签。因此,您可以使用类似于以下的结构来支持“ 每个应用程序一个存储库 ”策略:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
您也可以使用类似的模式({profile}
)来支持“ 每个配置文件一个存储库 ”策略。
此外,在{application}
参数中使用特殊字符串“(_)”可以启用对多个组织的支持,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/{application}
其中在请求时以以下格式提供{application}
:organization(_)application
。
模式匹配和多个Repositories
Spring Cloud Config还通过在应用程序和概要文件名称上进行模式匹配来支持更复杂的需求。模式格式是以逗号分隔的{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
的应用程序)。在“ 本地 ”库匹配,在所有配置文件(该/*
后缀会自动添加到没有档案资料匹配的任何模式)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,*"]
的快捷方式,等等)。例如,这很普遍,例如,您需要在本地的“ 开发 ”配置文件中运行应用程序,而又需要在远程的“ 云 ”配置文件中运行应用程序。
每个存储库还可以选择将配置文件存储在子目录中,用于搜索这些目录的模式可以指定为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。在请求从存储库进行配置之前,不会克隆所有其他存储库。
设置要在Config Server启动时克隆的存储库有助于在Config Server启动时快速识别配置错误的配置源(例如无效的存储库URI)。在未为配置源启用
cloneOnStart
的情况下,Config Server可能会以配置错误或无效的配置源成功启动,并且直到应用程序从该配置源请求配置时才检测到错误。
认证方式
要在远程存储库上使用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位置(例如git@github.com:configuration/cloud-configuration
)时,SSH也应立即可用。重要的是,~/.ssh/known_hosts
文件中应包含Git服务器的条目,并且其格式应为ssh-rsa
。不支持其他格式(例如ecdsa-sha2-nistp256
)。为避免意外,您应确保Git服务器的known_hosts
文件中仅存在一个条目,并且该条目与您提供给配置服务器的URL匹配。如果在URL中使用主机名,则要在known_hosts
文件中完全使用该主机名(而不是IP)。使用JGit访问存储库,因此您找到的任何文档都应该适用。HTTPS代理设置可以在~/.git/config
中设置,也可以(使用与其他JVM进程相同的方式)使用系统属性(-Dhttps.proxyHost
和-Dhttps.proxyPort
)进行设置。
如果您不知道
~/.git
目录在哪里,请使用git config --global
来操纵设置(例如,git config --global http.sslVerify false
)。
使用AWS CodeCommit进行身份验证
Spring Cloud Config服务器还支持AWS CodeCommit身份验证。从命令行使用Git时,AWS CodeCommit使用身份验证帮助程序。该帮助程序未与JGit库一起使用,因此,如果Git URI与AWS CodeCommit模式匹配,则会为AWS CodeCommit创建一个JGit CredentialProvider。AWS CodeCommit URI遵循以下模式://git-codecommit.${AWS_REGION}.amazonaws.com/${repopath}。
如果您提供带有AWS CodeCommit URI的用户名和密码,则它们必须是提供对存储库访问权限的AWS accessKeyId和secretAccessKey。如果您未指定用户名和密码,则使用AWS Default Credential Provider链检索accessKeyId和secretAccessKey 。
如果您的Git URI与CodeCommit URI模式(如前所示)匹配,则必须在用户名和密码或默认凭据提供商链支持的位置之一中提供有效的AWS凭据。AWS EC2实例可以将IAM角色用于EC2实例。
aws-java-sdk-core
jar是可选的依赖项。如果aws-java-sdk-core
jar不在您的类路径中,则无论git服务器URI如何,都不会创建AWS Code Commit凭证提供程序。
使用属性进行Git SSH配置
默认情况下,当使用SSH URI连接到Git存储库时,Spring Cloud Config服务器使用的JGit库使用SSH配置文件,例如~/.ssh/known_hosts
和/etc/ssh/ssh_config
。在Cloud Foundry之类的云环境中,本地文件系统可能是临时的,或者不容易访问。在这种情况下,可以使用Java属性设置SSH配置。为了激活基于属性的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配置属性。
表5.1 SSH配置Properties
Property名称 | 备注 |
---|---|
ignoreLocalSshSettings |
如果为 |
私钥 |
有效的SSH私钥。如果 |
hostKey |
有效的SSH主机密钥。如果还设置了 |
hostKeyAlgorithm |
|
strictHostKeyChecking |
|
knownHostsFile |
自定义 |
preferredAuthentications |
覆盖服务器身份验证方法顺序。如果服务器在 |
Git搜索路径中的占位符
Spring Cloud Config服务器还支持带有{application}
和{profile}
(如果需要的话还有{label}
)占位符的搜索路径,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}'
上面的清单导致在存储库中搜索与目录(以及顶层)同名的文件。通配符在带有占位符的搜索路径中也有效(搜索中包括任何匹配的目录)。
强制拉动Git Repositories
如前所述,Spring Cloud Config服务器会复制远程git存储库,以防本地副本变脏(例如,操作系统进程更改了文件夹内容),使得Spring Cloud Config服务器无法从远程更新本地副本。资料库。
要解决此问题,有一个force-pull
属性,如果本地副本脏了,则可以使Spring Cloud Config服务器从远程存储库强制拉出,如以下示例所示:
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 Repositories中未跟踪的分支
由于Spring Cloud Config服务器在检出分支到本地存储库(例如,通过标签获取属性)后具有远程git存储库的克隆,因此它将永久保留该分支,直到下一个服务器重新启动(这将创建新的本地存储库)。因此,可能会删除远程分支,但仍可获取其本地副本。而且,如果Spring Cloud Config服务器客户端服务以--spring.cloud.config.label=deletedRemoteBranch,master
开头,它将从deletedRemoteBranch
本地分支获取属性,而不是从master
获取属性。
为了使本地存储库分支保持整洁并保持远程状态-可以设置deleteUntrackedBranches
属性。这将使Spring Cloud Config服务器从本地存储库中强制删除未跟踪的分支。例:
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
控制配置服务器多久从Git后端获取更新的配置数据。以秒为单位指定此属性的值。默认情况下,该值为0,这意味着配置服务器将在每次请求时从Git存储库中获取更新的配置。
更多建议: