Spring Cloud Document翻译(三)--Spring Cloud Config

第二部分 Spring Cloud Config

1.0.0.BUILD-快照

Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以有一个配置中心来跨所有的环境管理应用程序的外部属性。客户端和服务器上的概念等同于Spring EnvironmentPropertySource抽象,因此它们非常适合Spring应用程序,但可以与任何语言运行的任何应用程序一起使用。当应用程序通过部署管道从开发到测试再到生产环境时,您可以管理这些环境之间的配置,并确保应用程序迁移时具有运行所需要的所有内容。服务器存储后端的默认实现使用git,因此它可以轻松支持配置环境的标签版本,以及可用于管理内容的各种工具。添加替代实现并把它们插入Spring配置也很容易。

 

4.快速入门

这个快速入门使用Spring Cloud Config Server的服务器和客户端。

首先,启动服务器,如下所示:

$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run

服务器是一个Spring Boot应用程序,因此如果您愿意,可以从IDE运行它(主类是ConfigServerApplication)。

接下来尝试一个客户端,如下所示:

$ curl localhost:8888/foo/development
{"name":"foo","label":"master","propertySources":[
  {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
  {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
]}

定位属性源的默认策略是克隆git存储库(在spring.cloud.config.server.git.uri)并使用它来初始化一个迷你 SpringApplication。迷你应用程序的Environment用于枚举属性源并在JSON端点发布它们。

HTTP服务具有以下形式的资源:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

其中application作为spring.config.name被注入SpringApplication(在正常的Spring Boot应用程序中通常什么是application),profile是一个active profile(或逗号分隔的属性列表),并且label是一个可选的git标签(默认为master)。

Spring Cloud Config Server从各种来源为远程客户端提取配置。以下示例从git存储库(必须提供)获取配置,如以下示例所示:

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

其他来源是任何JDBC兼容的数据库,Subversion,Hashicorp Vault,Credhub和本地文件系统。

4.1客户端使用方法

要在应用程序中使用这些功能,您可以将其构建为依赖于spring-cloud-config-client的Spring Boot应用程序(例如,请参阅config-client或示例应用程序的测试用例)。添加依赖项最方便的方法是使用Spring Boot启动程序org.springframework.cloud:spring-cloud-starter-config。也有一个父pom和spring-cloud-starter-parent BOM给Maven用户,以及Gradle和Spring CLI用户使用的Spring IO版本管理属性文件。以下示例显示了典型的Maven配置:

pom.xml中。 

 <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>{spring-boot-docs-version}</version>
       <relativePath /> <!-- lookup parent from repository -->
   </parent>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>{spring-cloud-version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

<build>
	<plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
	</plugins>
</build>

   <!-- repositories also needed for snapshots and milestones -->

现在您可以创建一个标准的Spring Boot应用程序,例如以下HTTP服务器:

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

当此HTTP服务器运行时,它从端口8888上的默认本地配置服务器(如果它正在运行)中获取外部配置。要修改启动行为,您可以使用bootstrap.properties改变config server的位置(类似于application.properties但是用于应用程序上下文的引导阶段),如以下示例所示:

spring.cloud.config.uri: http://myconfigserver.com

默认情况下,如果未设置应用程序名称,将使用application。要修改名称,可以将以下属性添加到bootstrap.properties文件中:

spring.application.name: myapp
[注意]

设置属性时,${spring.application.name}请不要在应用程序名称前加上保留字,application-以防止问题解决正确的属性源。

引导属性在/env端点中显示为高优先级属性源,如以下示例所示。

$ curl localhost:8080/env
{
  "profiles":[],
  "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
  "servletContextInitParams":{},
  "systemProperties":{...},
  ...
}

名为configService:<URL of remote repository>/<file name>的属性源包含foo值为bar且优先级最高的属性。

[注意]

属性源名称中的URL是git存储库,而不是配置服务器URL。

5. Spring Cloud Config Server

Spring Cloud Config Server为外部配置(名称 - 值对或等效的YAML内容)提供基于HTTP资源的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启动它(configserver.yml在Config Server jar中)。另一种是使用您自己的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存储库的本地文件系统仅用于测试。您应该使用服务器在生产中托管配置存储库。

[警告]

如果只保留文本文件,则配置存储库的初始克隆可以快速有效。如果存储二进制文件(尤其是大型文件),则第一次配置请求或服务器中遇到内存不足错误时可能会出现延迟。

5.1环境存储库

您应该在哪里存储配置服务器的配置数据?管理此行为的策略是EnvironmentRepository,它服务于Environment对象。这Environment是来自Spring Environment的域的浅Copy(包括propertySources作为主要特征)。该Environment资源由三个参数:

  • {application},映射到客户端的spring.application.name
  • {profile},映射到客户端的spring.profiles.active(以逗号分隔的列表)。
  • {label},这是标记配置文件版本集的服务器端特性。

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

以下示例客户端应用程序具有此引导程序配置:

bootstrap.yml。 

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

 

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

如果存储库是基于文件的,则服务器会从application.yml(在所有客户端之间共享)和 foo.ymlfoo.yml优先级更高)创建一个 Environment。如果YAML文件中包含指向Spring配置文件的文档,则它们有更高的优先级(按列出的配置文件的顺序)。如果存在特定于配置文件的YAML(或属性)文件,则这些文件的优先级也高于默认值。更高的优先级转换为前面提到的Environment的PropertySource。(这些相同的规则适用于独立的Spring Boot应用程序。)

您可以将spring.cloud.config.server.accept-empty设置为false,以便在找不到应用程序时,Server将返回HTTP 404状态。默认情况下,此标志设置为true。

5.1.1 Git后端

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

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

跳过SSL证书验证

通过将git.skipSslValidation属性设置为true(默认值为false),可以禁用配置服务器对Git服务器的SSL证书的验证。

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https:
 <span style="color:#7f007f">          //example.com/my/repo skipSslValidation</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>

设置HTTP连接超时

您可以配置配置服务器等待获取HTTP连接的时间(以秒为单位)。使用该git.timeout属性。

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:<span style="color:#7f007f">          uri</span>:https
 :
 <span style="color:#7f007f">//example.com/my/repo </span><span style="color:#7f007f">          timeout</span>:4</span></span>

占位符在Git URI中

Spring Cloud Config Server支持带有占位符的git存储库URL {application}{profile}{label}如果需要,请记住该标签仍然作为git标签应用)。因此,您可以使用类似于以下的结构来支持“ 每个应用程序一个存储库 ”策略:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/myorg/ <span style="color:#7f0055"><strong>{ </strong></span><span style="color:#7f007f">application </span><span style="color:#7f0055"><strong>}</strong></span></span></span>

您还可以使用类似的模式支持“ 每个配置文件一个存储库 ”策略 {profile}

此外,在{application}参数中使用特殊字符串“(_)” 可以启用对多个组织的支持,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/ <span style="color:#7f0055"><strong>{ </strong></span><span style="color:#7f007f">application </span><span style="color:#7f0055"><strong>}</strong></span></span></span>

其中{application}被设置在请求时在以下格式:organization(_)application

模式匹配和多个存储库

Spring Cloud Config还支持更复杂的需求,并在应用程序和配置文件名称上进行模式匹配。模式格式是{application}/{profile}带有通配符的逗号分隔的名称列表(请注意,可能需要引用以通配符开头的模式),如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          repos</span>:
 <span style="color:#7f007f">            simple</span>:https://github.com/simple/config-repo
 <span style="color:#7f007f">            special</span>:
 <span style="color:#7f007f">              pattern</span>: special * / dev *,* special * / dev *
 <span style="color:#7f007f">              uri</span>:https://github.com/special/config-repo
 <span style="color:#7f007f">            local</span>:
 <span style="color:#7f007f">              pattern</span>:local *
 <span style="color:#7f007f">              uri</span>:file:/ home / configsvc / config-repo</span></span>

如果{application}/{profile}与任何模式都不匹配,则使用下面定义的默认URI spring.cloud.config.server.git.uri。在上面的示例中,对于“ 简单 ”存储库,模式是simple/*(它只匹配simple在所有配置文件中命名的一个应用程序)。在“ 本地 ”库匹配所有应用程序名称开头local的所有配置文件(该/*后缀会自动添加到没有档案资料匹配的任何模式)。

[注意]

的“ 单行 ”中所使用的短切“ 简单 ”可以使用例如仅当要设置的唯一属性是URI。如果您需要设置其他任何内容(凭据,模式等),则需要使用完整表单。

pattern在回购属性实际上是一个数组,所以可以使用一个YAML阵列(或[0][1]等在属性文件后缀)绑定到多个图案。如果要运行具有多个配置文件的应用程序,则可能需要执行此操作,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          repos</span>:
 <span style="color:#7f007f">            development</span>:
 <span style="color:#7f007f">              pattern</span>:
                - <span style="color:#2a00ff">'* / development'</span> 
                - <span style="color:#2a00ff">'* / </span>
<span style="color:#7f007f">              staging'uri</span>:https://github.com/development/config-repo
 <span style="color:#7f007f">            staging</span>:
 <span style="color:#7f007f">              pattern</span>:
                - <span style="color:#2a00ff">'* / QA'</span> 
                - <span style="color:#2a00ff">'* /生产' </span>
<span style="color:#7f007f">              URI</span>:https://github.com/staging/config-repo</span></span>
[注意]

Spring Cloud猜测包含未结束的配置文件的模式*意味着您实际上想要匹配以此模式开头的配置文件列表(因此*/staging是一个快捷方式["*/staging", "*/staging,*"],等等)。这很常见,例如,您需要在本地“ 开发 ”配置文件中运行应用程序,而远程运行“ 云 ”配置文件。

每个存储库还可以选择将配置文件存储在子目录中,并且可以将搜索这些目录的模式指定为searchPaths。以下示例显示了顶级的配置文件:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          searchPaths</span>:foo,bar *</span></span>

在前面的示例中,服务器在顶级和foo/子目录以及名称以其开头的任何子目录中搜索配置文件bar

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

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://git/common/config-repo.git <span style="color:#7f007f">          repos</span>:
 <span style="color:#7f007f">            team</span> -a
 :
 <span style="color:#7f007f">                pattern</span>:team-a- *
 <span style="color:#7f007f">                cloneOnStart</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f">                uri</span>:https:// git / team -a / config-repo.git
 <span style="color:#7f007f">            team-b</span>:
 <span style="color:#7f007f">                pattern</span>:team-b- *
 <span style="color:#7f007f">                cloneOnStart</span>:<span style="color:#7f0055"><strong>false </strong></span>
<span style="color:#7f007f">                uri</span>:https://git/team-b/config-repo.git
 <span style="color:#7f007f">            team-c</span>:
 <span style="color:#7f007f">                pattern</span>:team-c- *
 <span style="color:#7f007f">                uri</span>:https://git/team-a/config-repo.git</span></span>

在前面的示例中,服务器在接受任何请求之前在启动时克隆team-a的config-repo。在请求来自存储库的配置之前,不会克隆所有其他存储库。

[注意]

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

认证

要在远程存储库上使用HTTP基本身份验证,请单独添加usernamepassword属性(不在URL中),如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          用户名</span>:trolley
 <span style="color:#7f007f">          密码</span>:strongpassword</span></span>

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

[小费]

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

使用AWS CodeCommit进行身份验证

Spring Cloud Config Server还支持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默认凭据提供程序链检索accessKeyId和secretAccessKey 。

如果您的Git URI与CodeCommit URI模式匹配(如前所示),则必须在用户名和密码中或默认凭据提供程序链支持的某个位置提供有效的AWS凭据。AWS EC2实例可以将IAM角色用于EC2实例

[注意]

aws-java-sdk-core罐是一个可选的依赖。如果aws-java-sdk-corejar不在您的类路径上,则无论git服务器URI如何,都不会创建AWS Code Commit凭证提供程序。

使用属性进行Git SSH配置

默认情况下,春季云配置服务器使用JGit库使用SSH配置文件,如~/.ssh/known_hosts/etc/ssh/ssh_config通过使用SSH URI连接到Git仓库时。在Cloud Foundry等云环境中,本地文件系统可能是短暂的或不易访问的。对于这些情况,可以使用Java属性设置SSH配置。要激活基于属性的SSH配置,spring.cloud.config.server.git.ignoreLocalSshSettings必须将该属性设置为true,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">  spring</span>:
 <span style="color:#7f007f">    cloud</span>:
 <span style="color:#7f007f">      config</span>:
 <span style="color:#7f007f">        server</span>:
 <span style="color:#7f007f">          git</span>:
 <span style="color:#7f007f">            uri</span>:git <em><span style="color:gray">@ gitserver.com:team / repo1.git</span></em>
<span style="color:#7f007f">             ignoreLocalSshSettings</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f">            hostKey</span>:someHostKey
 <span style="color:#7f007f">            hostKeyAlgorithm</span>:ssh-rsa
 <span style="color:#7f007f">            privateKey</span>:|
                         -----开始RSA私钥-----
                         MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
                         IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM + o7ds7FRES5RTjv2RT / JVNJCoqF
                         OL8 + ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq + ObBBNhg5N + hOwKjjpzdj2Ud
                         1l 7R + wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
                         oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
                         DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
                         fY6yTiKxFzwb38IQP0ojIUWNrq0 + 9 Xt + NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
                         BO56 / RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD + valhfD75MxoXU7s3FK7yjxy3rsG
                         EmfA6tHV8 / 4 a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
                          5 MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
                         + AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ / 28 I4BX / mOSe
                         pZVnfRixAoGBAO6Uiwt40 / PKs53mCEWngslSCsh9oGAaLTf / XdvMns5VmuyyAyKG
                         ti8Ol5wqBMi4GIUzjbgUvSUt + IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
                         xrtWZ9eNj2TsIAMp / svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx / AoGBANYW
                         dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
                         PhKpeaeIiAaNnFo8m9aoTKr + 7 I6 / uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
                         VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
                         FwlJc / xlFqDusrcHL7abW5qq0L4v3R + FrJw3ZYufzLTVcKfdj6GelwJJO + 8 wBm + R
                         gTKYJItEhT48duLIfTDyIpHGVm9 + I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
                         VAykcNgyDvtAVODP + 4 m6JvhjAoGBALbtTqErKN47V0 + JJpapLnF0KxGrqeGIjIRV
                         cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
                         KTbTjefRFhVUjQqnucAvfGi29f + 9 oE3Ei9f7wA + H35ocF6JvTYUsHNMIO / 3 gZ38N
                         CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC /围兜
                         q0TY3we + ERB40U8Z2BvU61QuwaunJ2 + uGadHo58VSVdggqAo0BSkH58innKKt96J
                         69 pcVH / 4 rmLbXdcmNYGm6iu + MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
                         ----- END RSA私钥-----</span></span>

下表介绍了SSH配置属性。

表5.1。SSH配置属性

Property名称 备注

ignoreLocalSshSettings

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

专用密钥

有效的SSH私钥。如果ignoreLocalSshSettings为true,则必须设置,并且Git URI是SSH格式。

hostKey

有效的SSH主机密钥。如果hostKeyAlgorithm也设置,则必须设置。

hostKeyAlgorithm

其中一个ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521。如果hostKey也设置,则必须设置。

strictHostKeyChecking

truefalse。如果为false,则忽略主机密钥错误。

knownHostsFile

自定义.known_hosts文件的位置。

preferredAuthentications

覆盖服务器身份验证方法顺序。如果服务器在publickey方法之前具有键盘交互式身份验证,则应允许避免登录提示。

 

占位符在Git搜索路径中

Spring Cloud Config Server还支持带{application}{profile}{label}如果需要)占位符的搜索路径,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          searchPaths</span>:<span style="color:#2a00ff">'{application}'</span></span></span>

上面的清单导致在存储库中搜索与目录(以及顶层)同名的文件。通配符在带占位符的搜索路径中也有效(搜索中包含任何匹配的目录)。

强行拉入Git存储库

如前所述,Spring Cloud Config Server会在本地副本变脏(例如,OS进程更改文件夹内容)时复制远程git存储库,以使Spring Cloud Config Server无法从远程存储库更新本地副本。

要解决此问题,force-pull如果本地副本是脏的,则有一个属性可以从远程存储库强制提取Spring Cloud Config Server,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          force-pull</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>

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

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://git/common/config-repo.git <span style="color:#7f007f">          force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f">          repos</span>:
 <span style="color:#7f007f">            team</span> -a
 :
 <span style="color:#7f007f">                pattern</span>:team-a- *
 <span style="color:#7f007f">                uri</span>:https:// git /team-a/config-repo.git
 <span style="color:#7f007f">                force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f">            team-b</span>:
 <span style="color:#7f007f">                pattern</span>:team-b- *
 <span style="color:#7f007f">                uri</span>:https://git/team-b/config-repo.git
 <span style="color:#7f007f">                force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f">            team-c</span>:
 <span style="color:#7f007f">                pattern</span>:team-c- *
 <span style="color:#7f007f">                uri</span>:https://git/team-a/config-repo.git</span></span>
[注意]

force-pull属性的默认值是false

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

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

为了保持本地存储库分支的清洁和远程 - deleteUntrackedBranches可以设置属性。它将使Spring Cloud Config Server 强制从本地存储库中删除未跟踪的分支。例:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          deleteUntrackedBranches</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>
[注意]

deleteUntrackedBranches属性的默认值是false

Git刷新率

您可以使用控制来控制配置服务器从Git后端获取更新配置数据的频率spring.cloud.config.server.git.refreshRate。此属性的值以秒为单位指定。默认情况下,该值为0,这意味着配置服务器将在每次请求时从Git存储库获取更新的配置。

5.1.2版本控制后端文件系统使用

[警告]

使用基于VCS的后端(git,svn),文件将被签出或克隆到本地文件系统。默认情况下,它们放在系统临时目录中,前缀为config-repo-。例如,在Linux上,它可能是/tmp/config-repo-<randomid>。某些操作系统会定期清理临时目录。这可能会导致意外行为,例如缺少属性。要避免此问题,请通过设置更改Config Server使用的目录,spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir更改不驻留在系统临时结构中的目录。

5.1.3文件系统后端

Config Server中还有一个“ 本机 ”配置文件,它不使用Git,但从本地类路径或文件系统(您想要指向的任何静态URL)加载配置文件spring.cloud.config.server.native.searchLocations。要使用本机配置文件,请启动配置服务器spring.profiles.active=native

[注意]

请记住使用file:文件资源的前缀(没有前缀的默认值通常是类路径)。与任何Spring Boot配置一样,您可以嵌入式${}环境占位符,但请记住,Windows中的绝对路径需要额外的/(例如file:///${user.home}/config-repo)。

[警告]

它的默认值searchLocations与本地Spring Boot应用程序(即[classpath:/, classpath:/config, file:./, file:./config])相同。这不会将application.properties服务器暴露给所有客户端,因为服务器中存在的任何属性源在被发送到客户端之前都会被删除。

[小费]

文件系统后端非常适合快速入门和测试。要在生产中使用它,您需要确保文件系统可靠并在Config Server的所有实例之间共享。

搜索位置可以包含占位符{application}{profile}{label}。通过这种方式,您可以隔离路径中的目录并选择对您有意义的策略(例如每个应用程序的子目录或每个配置文件的子目录)。

如果您不在搜索位置使用占位符,则此存储库还会将{label}HTTP资源的参数附加到搜索路径上的后缀,因此将从每个搜索位置与该标签同名的子目录中加载属性文件(标记的属性在Spring环境中优先。因此,没有占位符的默认行为与添加以/{label}/。结尾的搜索位置相同。例如,file:/tmp/config与...相同file:/tmp/config,file:/tmp/config/{label}。可以通过设置禁用此行为spring.cloud.config.server.native.addLabelLocations=false

5.1.4 Vault后端

Spring Cloud Config Server还支持Vault作为后端。

 

Vault是一种安全访问机密的工具。秘密就是您要严格控制访问的任何内容,例如API密钥,密码,证书和其他敏感信息。Vault为任何机密提供统一的界面,同时提供严格的访问控制并记录详细的审计日志。

有关Vault的详细信息,请参阅Vault快速入门指南

要使配置服务器能够使用Vault后端,您可以使用vault配置文件运行配置服务器。例如,在配置服务器中application.properties,您可以添加spring.profiles.active=vault

默认情况下,配置服务器假定您的Vault服务器运行于http://127.0.0.1:8200。它还假设后端的名称是secret,密钥是application。所有这些默认值都可以在配置服务器中配置application.properties。下表介绍了可配置的Vault属性:

名称 默认值

host

127.0.0.1

port

8200

scheme

HTTP

backend

secret

defaultKey

application

profileSeparator

kvVersion

1

skipSslValidation

false

timeout

5

namespace

null

[重要] 重要

上表中的所有属性都必须以spring.cloud.config.server.vault复合配置的正确Vault部分为前缀或放置在其中。

所有可配置的属性都可以在中找到org.springframework.cloud.config.server.environment.VaultEnvironmentProperties

Vault 0.10.0引入了一个版本化的键值后端(k / v后端版本2),它暴露了与早期版本不同的API,它现在需要data/在挂载路径和实际上下文路径之间并在data对象中包装秘密。设置kvVersion=2将考虑到这一点。

(可选)支持Vault Enterprise X-Vault-Namespace标头。要将其发送到Vault,请设置该namespace属性。

在配置服务器运行时,您可以向服务器发出HTTP请求以从Vault后端检索值。为此,您需要Vault服务器的令牌。

首先,在Vault中放置一些数据,如以下示例所示:

<span style="color:#333333"><span style="color:#000000">$ vault kv put secret / application foo = bar baz = bam
$ vault kv put secret / myapp foo = myappsbar</span></span>

其次,向配置服务器发出HTTP请求以检索值,如以下示例所示:

$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"

您应该看到类似于以下内容的响应:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f0055"><strong>{ </strong></span>
   <span style="color:#2a00ff">“name”</span>:<span style="color:#2a00ff">“myapp” </span><span style="color:#7f0055"><strong>,</strong></span>
   <span style="color:#2a00ff">“profiles”</span>:<span style="color:#7f0055"><strong>[ </strong></span>
      <span style="color:#2a00ff">“default”</span> 
   ] <span style="color:#7f0055"><strong>,</strong></span>
   <span style="color:#2a00ff">“label”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
   <span style="color:#2a00ff">“version”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
   <span style="color:#2a00ff">“state”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
   <span style="color:#2a00ff">“propertySources”</span>:<span style="color:#7f0055"><strong>[ </strong></span>
      <span style="color:#7f0055"><strong>{ </strong></span>
         <span style="color:#2a00ff">“name”</span>:<span style="color:#2a00ff">“vault: myapp“ </span><span style="color:#7f0055"><strong>,</strong></span>
         <span style="color:#2a00ff">”source“</span>:<span style="color:#7f0055"><strong>{ </strong></span>
            <span style="color:#2a00ff">”foo“</span>:<span style="color:#2a00ff">”myappsbar“ </span>
         <span style="color:#7f0055"><strong>} </strong></span>
      <span style="color:#7f0055"><strong>},</strong></span>
      <span style="color:#7f0055"><strong>{ </strong></span>
         <span style="color:#2a00ff">”name“</span>:<span style="color:#2a00ff">”vault:application“ </span><span style="color:#7f0055"><strong>,</strong></span>
         <span style="color:#2a00ff">”source“</span>:<span style="color:#7f0055"><strong>{ </strong></span>
            <span style="color:#2a00ff">“baz”</span>:<span style="color:#2a00ff">“bam” </span><span style="color:#7f0055"><strong>,</strong></span>
            <span style="color:#2a00ff">“foo”</span>:<span style="color:#2a00ff">“bar” </span>
         <span style="color:#7f0055"><strong>} </strong></span>
      <span style="color:#7f0055"><strong>} </strong></span>
   <span style="color:#7f0055"><strong>] </strong></span>
<span style="color:#7f0055"><strong>}</strong></span></span></span>

多个属性源

使用Vault时,您可以为应用程序提供多个属性源。例如,假设您已将数据写入Vault中的以下路径:

<span style="color:#333333"><span style="color:#000000">秘密/对myApp,开发
秘密/对myApp
秘密/应用开发
秘密/应用</span></span>

写入的属性secret/application可供使用Config Server的所有应用程序使用。名称为的应用程序myApp将具有写入secret/myAppsecret/application可用的任何属性。如果启用myAppdev配置文件,则可以使用写入所有上述路径的属性,列表中第一个路径中的属性优先于其他路径。

5.1.5通过代理访问后端

配置服务器可以通过HTTP或HTTPS代理访问Git或Vault后端。通过proxy.http和下的设置可以控制Git或Vault的此行为proxy.https。这些设置是每个存储库,因此如果您使用的是复合环境存储库,则必须单独为复合中的每个后端配置代理设置。如果使用需要单独的代理服务器用于HTTP和HTTPS URL的网络,则可以为单个后端配置HTTP和HTTPS代理设置。

下表描述了HTTP和HTTPS代理的代理配置属性。所有这些属性必须以proxy.http或为前缀proxy.https

表5.2。代理配置属性

物业名称 备注

主办

代理的主机。

港口

用于访问代理的端口。

nonProxyHosts

配置服务器应在代理外部访问的任何主机。如果提供两个值proxy.http.nonProxyHostsproxy.https.nonProxyHosts,在proxy.http将被使用的价值。

用户名

用于向代理进行身份验证的用户名。如果提供两个值proxy.http.usernameproxy.https.username,在proxy.http将被使用的价值。

密码

用于向代理进行身份验证的密码。如果提供两个值proxy.http.passwordproxy.https.password,在proxy.http将被使用的价值。

 

以下配置使用HTTPS代理访问Git存储库。

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:git
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:https://github.com/spring-cloud-samples/config-repo
 <span style="color:#7f007f">          proxy</span>:
 <span style="color:#7f007f">            https</span>:
 <span style="color:#7f007f">              host</span>:my-proxy.host.io
 <span style="color:#7f007f">              password</span>:myproxypassword
 <span style="color:#7f007f">              port</span>:<span style="color:#2a00ff">'3128' </span>
<span style="color:#7f007f">              用户名</span>:myproxyusername
 <span style="color:#7f007f">              nonProxyHosts</span>:example.com</span></span>

5.1.6与所有应用程序共享配置

所有应用程序之间的共享配置因您采用的方法而异,如以下主题中所述:

基于文件的存储库

基于文件(GIT,SVN和本地)仓库,并在文件名的资源application*application.propertiesapplication.ymlapplication-*.properties,等)的所有客户端应用程序之间共享。您可以使用具有这些文件名的资源来配置全局默认值,并根据需要由特定于应用程序的文件覆盖它们。

#_property_overrides [property overrides]功能也可用于设置全局默认值,允许占位符应用程序在本地覆盖它们。

[小费]

使用“ 本机 ”配置文件(本地文件系统后端),您应该使用不属于服务器自身配置的显式搜索位置。否则,application*默认搜索位置中的资源将被删除,因为它们是服务器的一部分。

Vault服务器

使用Vault作为后端时,您可以通过放置配置来与所有应用程序共享配置secret/application。例如,如果您运行下面的命令库,使用配置服务器的所有应用程序将具有的属性foo,并baz提供给他们:

<span style="color:#333333"><span style="color:#000000">$ vault写秘密/应用程序foo = bar baz = bam</span></span>

5.1.7 JDBC后端

Spring Cloud Config Server支持JDBC(关系数据库)作为配置属性的后端。您可以通过添加spring-jdbc到类路径并使用jdbc配置文件或添加类型的bean 来启用此功能JdbcEnvironmentRepository。如果在类路径中包含正确的依赖项(有关详细信息,请参阅用户指南),Spring Boot会配置数据源。

数据库需要有一个叫做表PROPERTIES一个名为列APPLICATIONPROFILE以及LABEL(与通常的Environment意思),再加上KEYVALUE在键和值对Properties风格。所有字段都是Java中的String类型,因此您可以根据VARCHAR需要设置它们。属性值的行为方式与它们来自命名的Spring Boot属性文件{application}-{profile}.properties(包括所有加密和解密)的行为方式相同,后者将作为后处理步骤(即不直接在存储库实现中)应用。

5.1.8 CredHub后端

Spring Cloud Config Server支持CredHub作为配置属性的后端。您可以通过向Spring CredHub添加依赖项来启用此功能。

pom.xml中。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#3f7f7f"><dependencies> </span>
	<span style="color:#3f7f7f"><dependency> </span>
		<span style="color:#3f7f7f"><groupId></span> org.springframework.credhub <span style="color:#3f7f7f"></ groupId> </span>
		<span style="color:#3f7f7f"><artifactId></span> spring-credhub-starter <span style="color:#3f7f7f"></ artifactId> </span>
	<span style="color:#3f7f7f"></ dependency> </span>
<span style="color:#3f7f7f"></ dependencies></span></span></span>

 

以下配置使用相互TLS访问CredHub:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:credhub
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        credhub</span>:
 <span style="color:#7f007f">          url</span>:https:// credhub:8844</span></span>

属性应存储为JSON,例如:

<span style="color:#333333"><span style="color:#000000">credhub set --name“/ demo-app / default / master / toggles”--type = json
value:{“toggle.button”:“blue”,“toggle.link”:“red”}</span></span>
<span style="color:#333333"><span style="color:#000000">credhub set --name“/ demo-app / default / master / abs”--type = json
value:{“marketing.enabled”:true,“external.enabled”:false}</span></span>

具有该名称的所有客户端应用程序spring.cloud.config.name=demo-app将具有以下可用属性:

<span style="color:#333333"><span style="color:#000000">{
    toggle.button:“blue”,
    toggle.link:“red”,
    marketing.enabled:是的,
    external.enabled:false
}</span></span>
[注意]

如果未指定配置文件,default则将使用未指定标签的时间master将用作默认值。

OAuth 2.0

您可以使用UAA作为提供程序对OAuth 2.0进行身份验证。

pom.xml中。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#3f7f7f"><dependencies> </span>
	<span style="color:#3f7f7f"><dependency> </span>
		<span style="color:#3f7f7f"><groupId></span> org.springframework.security <span style="color:#3f7f7f"></ groupId> </span>
		<span style="color:#3f7f7f"><artifactId></span> spring-security-config <span style="color:#3f7f7f"></ artifactId> </span>
	<span style="color:#3f7f7f"></ dependency> </span>
	<span style="color:#3f7f7f"><dependency> </span>
		<span style="color:#3f7f7f"><groupId></span> org.springframework.security <span style="color:#3f7f7f"></ groupId> </span>
		<span style="color:#3f7f7f">< artifactId></span> spring-security-oauth2-client <span style="color:#3f7f7f"></ artifactId> </span>
	<span style="color:#3f7f7f"></ dependency> </span>
<span style="color:#3f7f7f"></ dependencies></span></span></span>

 

以下配置使用OAuth 2.0和UAA访问CredHub:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:credhub
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        credhub</span>:
 <span style="color:#7f007f">          url</span>:https:// credhub:8844 
<span style="color:#7f007f">          oauth2</span>:
 <span style="color:#7f007f">            registration-id</span>:credhub-client
 <span style="color:#7f007f">  security</span>:
 <span style="color:#7f007f">    oauth2</span>:
 <span style="color:#7f007f">      client</span>:
 <span style="color:#7f007f">        registration</span>:
 <span style="color:#7f007f">          credhub-client</span>:
 <span style="color:#7f007f">            provider</span>:uaa
 <span style="color:#7f007f">            client- id</span>:credhub_config_server
 <span style="color:#7f007f">            client-secret</span>:asecret
 <span style="color:#7f007f">            authorization-grant-type</span>:client_credentials
 <span style="color:#7f007f">        provider</span>:
 <span style="color:#7f007f">          uaa</span>:
 <span style="color:#7f007f">            token-uri</span>:https:// uaa:8443 / oauth / token</span></span>
[注意]

使用的UAA client-id应具有credhub.read作为范围。

5.1.9复合环境存储库

在某些情况下,您可能希望从多个环境存储库中提取配置数据。为此,您可以composite在配置服务器的应用程序属性或YAML文件中启用配置文件。例如,如果要从Subversion存储库以及两个Git存储库中提取配置数据,可以为配置服务器设置以下属性:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:composite
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        composite</span>:
        - 
<span style="color:#7f007f">          type</span>:svn
 <span style="color:#7f007f">          uri</span>:file:/// path / to / svn / repo
        - 
<span style="color:#7f007f">          type</span>:git
 <span style="color:#7f007f">          uri</span>:file:/// path / to / rex / git / repo
        - 
<span style="color:#7f007f">          type</span>:git
 <span style="color:#7f007f">          uri</span>:file:/// path / to / walter / git / repo</span></span>

使用此配置,优先级由composite密钥下列出存储库的顺序决定。在上面的示例中,首先列出Subversion存储库,因此在Subversion存储库中找到的值将覆盖在其中一个Git存储库中为相同属性找到的值。在为rexGit存储库中的相同属性找到的值之前,将使用Git存储库中找到的值walter

如果只想从每个不同类型的存储库中提取配置数据,则可以composite在配置服务器的应用程序属性或YAML文件中启用相应的配置文件,而不是配置文件。例如,如果要从单个Git存储库和单个HashiCorp Vault服务器提取配置数据,可以为配置服务器设置以下属性:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:git <span style="color:#7f0055"><strong>,</strong></span> vault
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        git</span>:
 <span style="color:#7f007f">          uri</span>:file:/// path / to / git / repo
 <span style="color:#7f007f">          order</span>:2 
<span style="color:#7f007f">        vault</span>:
 <span style="color:#7f007f">          host</span>:127.0。0.1 
<span style="color:#7f007f">          端口</span>:8200 
<span style="color:#7f007f">          订单</span>:1</span></span>

使用此配置,优先级可以由order属性确定。您可以使用该order属性指定所有存储库的优先级顺序。order属性的数值越低,它的优先级越高。存储库的优先级顺序有助于解决包含相同属性值的存储库之间的任何潜在冲突。

[注意]

如果复合环境包含Vault服务器,如上例所示,则必须在对配置服务器发出的每个请求中包含Vault令牌。请参阅Vault后端

[注意]

从环境存储库检索值时的任何类型的故障都会导致整个复合环境失败。

[注意]

使用复合环境时,所有存储库都必须包含相同的标签。如果您具有与前面示例中的环境类似的环境,并且您使用master标签请求配置数据但Subversion存储库不包含调用的分支master,则整个请求将失败。

自定义复合环境存储库

除了使用Spring Cloud中的一个环境存储库之外,您还可以提供自己的EnvironmentRepositorybean作为复合环境的一部分。为此,您的bean必须实现该EnvironmentRepository接口。如果要EnvironmentRepository在复合环境中控制自定义的优先级,还应实现该Ordered接口并覆盖该getOrdered方法。如果您未实现该Ordered接口,EnvironmentRepository则优先级最低。

5.1.10Property覆盖

Config Server具有“ 覆盖 ”功能,允许操作员为所有应用程序提供配置属性。使用普通Spring Boot挂钩的应用程序不会意外更改被覆盖的属性。要声明复盖,请添加名称 - 值对的映射spring.cloud.config.server.overrides,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        overrides</span>:
 <span style="color:#7f007f">          foo</span>:bar</span></span>

上述示例使得所有配置客户端应用程序都可以读取foo=bar,而与其自身配置无关。

[注意]

配置系统不能强制应用程序以任何特定方式使用配置数据。因此,覆盖是不可执行的。但是,它们确实为Spring Cloud Config客户端提供了有用的默认行为。

[小费]

通常,Spring环境占位符${}可以使用反斜杠(\)来转义(并在客户端上解析)以转义$或转义{。例如,\${app.foo:bar}解析为bar,除非应用程序提供自己的app.foo

[注意]

在YAML中,您不需要逃避反斜杠本身。但是,在属性文件中,在服务器上配置替代时,需要转义反斜杠。

您可以通过spring.cloud.config.overrideNone=true在远程存储库中设置标志(默认值为false),将客户端中所有覆盖的优先级更改为更像默认值,让应用程序在环境变量或系统属性中提供自己的值。

5.2健康指标

Config Server附带一个运行状况指示器,用于检查配置EnvironmentRepository是否正常。默认情况下,它会询问EnvironmentRepository名为的应用程序appdefault配置文件以及EnvironmentRepository实现提供的默认标签。

您可以配置运行状况指示器以检查更多应用程序以及自定义配置文件和自定义标签,如以下示例所示:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        health</span>:
 <span style="color:#7f007f">          repositories</span>:
 <span style="color:#7f007f">            myservice</span>:
 <span style="color:#7f007f">              label</span>:mylabel
 <span style="color:#7f007f">            myservice-dev</span>:
 <span style="color:#7f007f">              name</span>:myservice
 <span style="color:#7f007f">              profiles</span>:development</span></span>

您可以通过设置禁用健康指标spring.cloud.config.server.health.enabled=false

5.3安全

您可以以对您有意义的任何方式保护您的Config Server(从物理网络安全到OAuth2承载令牌),因为Spring Security和Spring Boot为许多安全安排提供支持。

要使用默认的Spring Boot配置的HTTP Basic安全性,请在类路径中包含Spring Security(例如,通过spring-boot-starter-security)。默认值是用户名user和随机生成的密码。随机密码在实践中没有用,因此我们建议您配置密码(通过设置spring.security.user.password)并对其进行加密(有关如何执行此操作的说明,请参阅下文)。

5.4加密和解密

[重要] 重要

要使用加密和解密功能,您需要在JVM中安装全功能JCE(默认情况下不包括它)。您可以从Oracle 下载“ Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files ”并按照安装说明进行操作(实质上,您需要将JRE lib / security目录中的两个策略文件替换为您下载的那些)。

如果远程属性源包含加密内容(以...开头的值{cipher}),则在通过HTTP发送到客户端之前对它们进行解密。此设置的主要优点是,属性值在“ 静止 ”时不必是纯文本格式(例如,在git存储库中)。如果某个值无法解密,则会从属性源中删除invalid该值,并添加一个附加属性,该属性具有相同的键但前缀为“ 不适用 ”(通常<n/a>)的值。这主要是为了防止密文被用作密码并意外泄露。

如果为配置客户端应用程序设置远程配置存储库,则它可能包含application.yml类似于以下内容:

application.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  datasource</span>:
 <span style="color:#7f007f">    用户名</span>:dbuser
 <span style="color:#7f007f">    密码</span>:<span style="color:#2a00ff">'{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ'</span></span></span>

 

.properties文件中的加密值不得用引号括起来。否则,该值不会被解密。以下示例显示了可行的值:

application.properties。 

<span style="color:#333333"><span style="color:#000000">spring.datasource.username:dbuser
spring.datasource.password:{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ</span></span>

 

您可以安全地将此纯文本推送到共享的git存储库,并且密码保密。

服务器还公开/encrypt/decrypt终止(假设这些是安全的并且只能由授权代理访问)。如果编辑远程配置文件,则可以使用Config Server通过POST到/encrypt端点来加密值,如以下示例所示:

<span style="color:#333333"><span style="color:#000000">$ curl localhost:8888 / encrypt -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda</span></span>
[注意]

如果您加密的值中包含需要进行URL编码的字符,则应使用该--data-urlencode选项以curl确保它们已正确编码。

[小费]

请确保不要在加密值中包含任何curl命令统计信息。将值输出到文件可以帮助避免此问题。

通过/decrypt(如果服务器配置了对称密钥或完整密钥对),也可以使用反向操作,如以下示例所示:

<span style="color:#333333"><span style="color:#000000">$ curl localhost:8888 / decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密</span></span>
[小费]

如果你使用curl进行测试,那么使用--data-urlencode(而不是-d)或设置一个显式Content-Type: text/plain来确保curl在有特殊字符时正确编码数据('+'特别棘手)。

获取加密值并添加{cipher}前缀,然后再将其放入YAML或属性文件中,然后再提交并将其推送到远程(可能不安全)存储。

/encrypt/decrypt终点还兼有接受的形式路径/*/{name}/{profiles},它可以用来控制每个应用程序(名称)加密和每个配置文件的基础,当客户打电话到主环境资源。

[注意]

要以这种精细的方式控制加密,您还必须提供一种@Bean类型TextEncryptorLocator,以便为每个名称和配置文件创建不同的加密器。默认情况下提供的那个不会这样做(所有加密都使用相同的密钥)。

spring命令行客户机(安装弹簧云CLI扩展)也可以用于加密和解密,因为显示在下面的例子:

<span style="color:#333333"><span style="color:#000000">$ spring加密mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密</span></span>

要在文件中使用密钥(例如用于加密的RSA公钥),请在密钥值前加上“@”并提供文件路径,如以下示例所示:

<span style="color:#333333"><span style="color:#000000">$ spring encrypt mysecret --key @ $ {HOME} /.ssh / id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv / QHiY5sI2dRcR + ...</span></span>
[注意]

--key参数是强制性的(尽管有--前缀)。

5.5密钥管理

Config Server可以使用对称(共享)密钥或非对称密钥(RSA密钥对)。非对称选择在安全性方面是优越的,但是使用对称密钥通常更方便,因为它是在单元中配置的单个属性值bootstrap.properties

要配置对称密钥,需要设置encrypt.key为秘密字符串(或使用ENCRYPT_KEY环境变量使其不受纯文本配置文件的影响)。

[注意]

您无法使用配置非对称密钥encrypt.key

要配置非对称密钥,请使用密钥库(例如,由keytoolJDK附带的实用程序创建)。密钥存储属性是encrypt.keyStore.**等于

属性 描述

encrypt.keyStore.location

包含一个Resource位置

encrypt.keyStore.password

保存解锁密钥库的密码

encrypt.keyStore.alias

标识要使用的商店中的哪个键

encrypt.keyStore.type

要创建的KeyStore的类型。默认为jks

加密是使用公钥完成的,并且需要私钥进行解密。因此,原则上,如果您只想加密(并准备在本地使用私钥解密值),则只能在服务器中配置公钥。实际上,您可能不希望在本地进行解密,因为它会围绕所有客户端传播密钥管理过程,而不是将其集中在服务器中。另一方面,如果您的配置服务器相对不安全且只有少数客户端需要加密属性,那么它可能是一个有用的选项。

5.6创建用于测试的密钥库

要创建用于测试的密钥库,可以使用类似于以下内容的命令:

<span style="color:#333333"><span style="color:#000000">$ keytool -genkeypair -alias mytestkey -keyalg RSA \
  -dname“CN = Web服务器,OU =单位,O =组织,L =城市,S =州,C = US”
  -keypass changeme -keystore server.jks -storepass letmein</span></span>

server.jks文件放在类路径中(例如),然后在您bootstrap.yml的Config Server中创建以下设置:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">encrypt</span>:
 <span style="color:#7f007f">  keyStore</span>:
 <span style="color:#7f007f">    location</span>:classpath:/server.jks
 <span style="color:#7f007f">    密码</span>:letmein
 <span style="color:#7f007f">    别名</span>:mytestkey
 <span style="color:#7f007f">    secret</span>:changeme</span></span>

5.7使用多个键和键旋转

除了{cipher}加密属性值中的前缀之外,Config Server 还会{name:value}在(Base64编码的)密码文本开始之前查找零个或多个前缀。密钥传递给a TextEncryptorLocator,它可以执行TextEncryptor为密码定位所需的任何逻辑。如果已配置密钥库(encrypt.keystore.location),则默认定位器将查找具有key前缀提供的别名的密钥,密码文本类似于以下内容:

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">foo</span>:
 <span style="color:#7f007f">  bar</span>:`{cipher} {key:testkey} ...`</span></span>

定位器查找名为“testkey”的密钥。也可以使用{secret:…​}前缀中的值来提供秘密。但是,如果未提供,则默认使用密钥库密码(这是您在构建密钥库时未获得的密码)。如果您确实提供了秘密,则还应使用自定义加密秘密SecretLocator

当密钥仅用于加密几个字节的配置数据时(即,它们未在其他地方使用),在加密方面几乎不需要密钥轮换。但是,您可能偶尔需要更改密钥(例如,在发生安全漏洞的情况下)。在这种情况下,所有客户端都需要更改其源配置文件(例如,在git中)并{key:…​}在所有密码中使用新的前缀。请注意,客户端需要首先检查Config Server密钥库中的密钥别名是否可用。

[小费]

如果您想让Config Server处理所有加密和解密,{name:value}前缀也可以作为发布到/encrypt端点的纯文本添加。

5.8提供加密属性

有时您希望客户端在本地解密配置,而不是在服务器中执行此操作。在这种情况下,如果你提供的encrypt.*配置定位的关键,你仍然可以拥有/encrypt/decrypt终点,但你需要通过将明确地关掉传出性质的解密spring.cloud.config.server.encrypt.enabled=falsebootstrap.[yml|properties]。如果您不关心端点,那么如果您不配置密钥或启用标志,它应该可以工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章