Spring Cloud 系列教程之Spring Cloud Config Server 外部配置

Spring Cloud 配置服务器

Spring Cloud Config Server 为外部配置(名称-值对或等效的 YAML 内容)提供了一个基于 HTTP 资源的 API。通过使用@EnableConfigServer注解,服务器可以嵌入到 Spring Boot 应用程序中。因此,以下应用程序是配置服务器:

配置服务器.java

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

与所有 Spring Boot 应用程序一样,它默认在 8080 端口上运行,但您可以通过各种方式将其切换到更常规的 8888 端口。最简单的也设置默认配置存储库的方法是使用启动它spring.config.name=configserverconfigserver.yml在 Config Server jar 中有一个)。另一种是使用自己的application.properties,如下例所示:

应用程序属性

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

${user.home}/config-repo包含 YAML 和属性文件的 git 存储库在哪里。

环境存储库

您应该将配置服务器的配置数据存储在哪里?控制这种行为的策略是EnvironmentRepository, 服务Environment对象。这Environment是来自 Spring 的域的浅拷贝Environment(包括propertySources作为主要功能)。资源由Environment三个变量参数化:

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

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

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

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

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

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

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

Git 后端

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

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

跳过 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 Server 支持带有占位符的 git 存储库 URL{application}{profile}{label}如果您需要它,但请记住该标签无论如何都是作为 git 标签应用的)。因此,您可以使用类似于以下的结构来支持“每个应用程序一个存储库”策略:

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

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

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

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

where{application}在请求时以以下格式提供:organization(_)application.

模式匹配和多个存储库

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}不匹配任何模式,则使用定义在 下的默认 URI spring.cloud.config.server.git.uri。在上面的示例中,对于“简单”存储库,模式是simple/*(它只匹配simple所有配置文件中命名的一个应用程序)。local“本地”存储库匹配以所有配置文件开头的所有应用程序名称(/*后缀会自动添加到没有配置文件匹配器的任何模式)。

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

每个存储库还可以选择将配置文件存储在子目录中,搜索这些目录的模式可以指定为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,然后再接受任何请求。在请求来自存储库的配置之前,不会克隆所有其他存储库。

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

要在远程存储库上使用 HTTP 基本身份验证,请单独添加usernamepassword属性(不在 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. 重要的是 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)。

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

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

警告:使用 SSH 密钥时,预期的 ssh 私钥必须以-----BEGIN RSA PRIVATE KEY-----. 如果密钥以开头,-----BEGIN OPENSSH PRIVATE KEY-----则启动 spring-cloud-config 服务器时将不会加载 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 格式。上面提供了一个使用 openssh 的示例,用于以适当的格式生成新密钥。使用属性的 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: 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 配置属性。

属性名称评论
忽略LocalSshSettings如果true是,请使用基于属性而不是基于文件的 SSH 配置。必须设置为 as spring.cloud.config.server.git.ignoreLocalSshSettings而不是在存储库定义中。
私钥有效的 SSH 私钥。ignoreLocalSshSettings如果为 true 且 Git URI 为 SSH 格式,则必须设置。
主机密钥有效的 SSH 主机密钥。hostKeyAlgorithm如果也设置了,则必须设置。
主机密钥算法之一ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521hostKey如果也设置了,则必须设置。
严格主机密钥检查truefalse。如果为 false,则忽略主机密钥的错误。
已知主机文件自定义.known_hosts文件的位置。
首选身份验证覆盖服务器身份验证方法顺序。如果服务器在方法之前具有键盘交互式身份验证,这应该允许规避登录提示publickey
Git 搜索路径中的占位符

Spring Cloud Config Server 还支持带有{application}and占位符的搜索路径{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 存储库,以防本地副本变脏(例如,OS 进程更改文件夹内容),使得 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本地分支获取属性,而不是从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 刷新率

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

默认标签

Git 使用的默认标签是main. 如果你没有设置spring.cloud.config.server.git.defaultLabel并且一个名为的分支main 不存在,配置服务器默认也会尝试检出一个名为master. 如果您想禁用回退分支行为,您可以设置 spring.cloud.config.server.git.tryMasterBranchfalse.

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

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

记住要file:为文件资源使用前缀(没有前缀的默认值通常是类路径)。与任何 Spring Boot 配置一样,您可以嵌入${}-style 环境占位符,但请记住 Windows 中的绝对路径需要额外的/(例如,file:///${user.home}/config-repo)。
的默认值searchLocations与本地 Spring Boot 应用程序(即[classpath:/, classpath:/config, file:./, file:./config])相同。这不会将application.properties来自服务器的属性暴露给所有客户端,因为服务器中存在的任何属性源在发送到客户端之前都会被删除。
文件系统后端非常适合快速入门和测试。要在生产中使用它,您需要确保文件系统是可靠的并且在 Config Server 的所有实例之间共享。

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

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

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 属性:

名称默认值
主持人127.0.0.1
港口8200
方案http
后端秘密
默认键应用
轮廓分隔符,
kv版本1
跳过SslValidation错误的
暂停5
命名空间空值
上表中的所有属性都必须添加前缀spring.cloud.config.server.vault或放置在复合配置的正确 Vault 部分中。

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

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

或者,支持 Vault EnterpriseX-Vault-Namespace标头。要将其发送到 Vault 设置namespace属性。

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

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

$ vault kv put secret/application foo=bar baz=bam
$ vault kv put secret/myapp foo=myappsbar

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

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

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

{
   "name":"myapp",
   "profiles":[
      "default"
   ],
   "label":null,
   "version":null,
   "state":null,
   "propertySources":[
      {
         "name":"vault:myapp",
         "source":{
            "foo":"myappsbar"
         }
      },
      {
         "name":"vault:application",
         "source":{
            "baz":"bam",
            "foo":"bar"
         }
      }
   ]
}

客户端提供必要身份验证以让 Config Server 与 Vault 对话的默认方式是设置 X-Config-Token 标头。但是,您可以通过设置与 Spring Cloud Vault 相同的配置属性来省略标头并在服务器中配置身份验证。要设置的属性是spring.cloud.config.server.vault.authentication。它应该设置为支持的身份验证方法之一。您可能还需要设置特定于您使用的身份验证方法的其他属性,方法是使用与文档中相同的属性名称,spring.cloud.vault但使用spring.cloud.config.server.vault前缀。有关更多详细信息,请参阅Spring Cloud Vault 参考指南

如果您省略 X-Config-Token 标头并使用服务器属性来设置身份验证,则 Config Server 应用程序需要对 Spring Vault 的附加依赖以启用附加身份验证选项。有关如何添加该依赖项的 信息,请参阅Spring Vault 参考指南。
多个属性源

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

secret/myApp,dev
secret/myApp
secret/application,dev
secret/application

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

通过代理访问后端

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

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

属性名称评论
主持人代理的主机。
港口用于访问代理的端口。
非代理主机配置服务器应在代理之外访问的任何主机。proxy.http.nonProxyHosts如果为和都提供了值,则将使用proxy.https.nonProxyHosts该值。proxy.http
用户名用于向代理进行身份验证的用户名。proxy.http.username如果为和都提供了值,则将使用proxy.https.username该值。proxy.http
密码用于向代理进行身份验证的密码。proxy.http.password如果为和都提供了值,则将使用proxy.https.password该值。proxy.http

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

spring:
  profiles:
    active: git
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          proxy:
            https:
              host: my-proxy.host.io
              password: myproxypassword
              port: '3128'
              username: myproxyusername
              nonProxyHosts: example.com
与所有应用程序共享配置

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

基于文件的存储库

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

属性覆盖功能也可用于设置全局默认值,允许占位符应用程序在本地覆盖它们。

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

使用 Vault 作为后端时,您可以通过将配置放入secret/application. 例如,如果您运行以下 Vault 命令,则使用配置服务器的所有应用程序都将具有这些属性foobaz可供它们使用:

$ vault write secret/application foo=bar baz=bam
CredHub 服务器

当使用 CredHub 作为后端时,您可以通过将配置放入/application/或将其放入应用程序的配置文件中default来与所有应用程序共享配置。例如,如果您运行以下 CredHub 命令,则使用配置服务器的所有应用程序都将具有属性shared.color1并对shared.color2它们可用:

credhub set --name "/application/profile/master/shared" --type=json
value: {"shared.color1": "blue", "shared.color": "red"}
credhub set --name "/my-app/default/master/more-shared" --type=json
value: {"shared.word1": "hello", "shared.word2": "world"}
JDBC 后端

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

JdbcEnvironmentRepository您可以通过将spring.cloud.config.server.jdbc.enabled属性设置为 来禁用自动配置false

数据库需要有一个PROPERTIES名为 、 和 (具有通常含义)的列APPLICATIONPROFILE以及LABEL用于Environment样式KEYVALUE的键和值对的Properties表。Java 中的所有字段都是 String 类型,因此您可以将它们VARCHAR设置为所需的任何长度。属性值的行为方式与它们来自名为 的 Spring Boot 属性文件时的行为方式相同{application}-{profile}.properties,包括所有加密和解密,这些将作为后处理步骤应用(即,不直接在存储库实现中)。

Redis 后端

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

pom.xml

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
</dependencies>

以下配置使用 Spring DataRedisTemplate访问 Redis。我们可以使用spring.redis.*属性来覆盖默认连接设置。

spring:
  profiles:
    active: redis
  redis:
    host: redis
    port: 16379

属性应存储为哈希中的字段。hash 的名称应与and的spring.application.name属性或连词相同。spring.application.name``spring.profiles.active[n]

HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1"

运行上面可见的命令后,哈希应该包含以下带有值的键:

HGETALL 示例应用程序
{
  "server.port": "8100",
  “sample.topic.name”:“测试”,
  “test.property1”:“property1”
}
组合使用

In some scenarios, you may wish to pull configuration data from multiple environment repositories. To do so, you can enable the composite profile in your configuration server’s application properties or YAML file. If, for example, you want to pull configuration data from a Subversion repository as well as two Git repositories, you can set the following properties for your configuration server:

spring:
  profiles:
    active: composite
  cloud:
    config:
      server:
        composite:
        -
          type: svn
          uri: file:///path/to/svn/repo
        -
          type: git
          uri: file:///path/to/rex/git/repo
        -
          type: git
          uri: file:///path/to/walter/git/repo

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

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

spring:
  profiles:
    active: git, vault
  cloud:
    config:
      server:
        git:
          uri: file:///path/to/git/repo
          order: 2
        vault:
          host: 127.0.0.1
          port: 8200
          order: 1

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

如果您的复合环境包括上一个示例中的 Vault 服务器,则必须在向配置服务器发出的每个请求中包含一个 Vault 令牌。请参阅Vault 后端
从环境存储库中检索值时的任何类型的失败都会导致整个复合环境失败。如果您希望组合在存储库失败时继续进行,您可以设置spring.cloud.config.server.failOnCompositeErrorfalse.
使用复合环境时,所有存储库都包含相同的标签很重要。如果您的环境类似于前面示例中的环境,并且您请求带有master标签的配置数据,但 Subversion 存储库不包含名为 的分支master,则整个请求将失败。
自定义复合环境存储库

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

属性覆盖

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

spring:
  cloud:
    config:
      server:
        overrides:
          foo: bar

前面的示例使作为配置客户端的所有应用程序都可以读取foo=bar,而与它们自己的配置无关。

配置系统不能强制应用程序以任何特定方式使用配置数据。因此,覆盖是不可强制执行的。但是,它们确实为 Spring Cloud Config 客户端提供了有用的默认行为。
通常,Spring 环境占位符${}可以通过使用反斜杠 ( \) 来转义(并在客户端解析)来转义${. 例如,\${app.foo:bar}解析为bar,除非应用程序提供自己的app.foo.
在 YAML 中,您不需要转义反斜杠本身。但是,在属性文件中,当您在服务器上配置覆盖时,您确实需要转义反斜杠。

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

健康指标

Config Server 带有一个健康指示器,用于检查配置EnvironmentRepository是否正常工作。默认情况下,它会询问EnvironmentRepository名为 的应用程序appdefault配置文件和实现提供的默认标签EnvironmentRepository

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

spring:
  cloud:
    config:
      server:
        health:
          repositories:
            myservice:
              label: mylabel
            myservice-dev:
              name: myservice
              profiles: development

您可以通过设置禁用运行状况指示器management.health.config.enabled=false

安全

您可以以任何对您有意义的方式保护您的配置服务器(从物理网络安全到 OAuth2 不记名令牌),因为 Spring Security 和 Spring Boot 为许多安全安排提供支持。

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

执行器和安全性

一些平台配置健康检查或类似的东西并指向/actuator/health或其他执行器端点。如果执行器不是配置服务器的依赖项,则请求将匹配配置服务器 API,****可能会泄漏安全信息。请记住在这种情况下添加依赖项并配置用户,以使调用的用户无权访问配置服务器 API 。 /actuator//{application}/{label}``spring-boot-starter-actuator``/actuator//{application}/{label}

加密和解密

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

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

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

应用程序.yml

spring:
  datasource:
    username: dbuser
    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'

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

应用程序属性

spring.datasource.username:dbuser
spring.datasource.password:{密码}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

您可以安全地将这个纯文本推送到共享的 git 存储库,并且秘密密码仍然受到保护。

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

$ curl localhost:8888/encrypt -s -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 进行测试,则使用--data-urlencode(而不是-d) 并为要加密的值添加前缀=(curl 需要这样做)或设置显式Content-Type: text/plain以确保 curl 在有特殊字符时正确编码数据(’+’ 特别棘手) .
确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用-s选项使它们静音的原因。将值输出到文件可以帮助避免这个问题。

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

$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密

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

/encrypt/decrypt端点也都接受 形式的路径,当/*/{application}/{profiles}客户端调用主环境资源时,可用于在每个应用程序(名称)和每个配置文件的基础上控制加密。

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

命令行spring客户端(安装了 Spring Cloud CLI 扩展)也可以用于加密和解密,如下例所示:

$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$弹簧解密--key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密

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

$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
--key参数是强制性的(尽管有--前缀)。

密钥管理

配置服务器可以使用对称(共享)密钥或非对称密钥(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.

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

创建用于测试的密钥库

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

$ keytool -genkeypair -alias mytestkey -keyalg RSA \
  -dname "CN=Web 服务器,OU=Unit,O=Organization,L=City,S=State,C=US" \
  -keypass changeme -keystore server.jks -storepass letmein
使用 JDK 11 或更高版本时,使用上述命令时可能会收到以下警告。在这种情况下,您可能希望确保keypassstorepass值匹配。
警告:PKCS12 KeyStore 不支持不同的存储和密钥密码。忽略用户指定的 -keypass 值。

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

encrypt:
  keyStore:
    location: classpath:/server.jks
    password: letmein
    alias: mytestkey
    secret: changeme

使用多个键和键轮换

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

foo:
  bar: `{cipher}{key:testkey}...`

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

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

如果您想让配置服务器处理所有加密和解密,{name:value}也可以将前缀添加为发布到/encrypt端点的纯文本,.

提供加密属性

有时您希望客户端在本地解密配置,而不是在服务器中进行。在这种情况下,如果您提供encrypt.*配置来定位密钥,您仍然可以拥有/encrypt和端点,但您需要通过放置in/decrypt显式关闭传出属性的解密。如果您不关心端点,那么如果您不配置密钥或启用标志,它应该可以工作。spring.cloud.config.server.encrypt.enabled=false``bootstrap.[yml|properties]

提供替代格式

来自环境端点的默认 JSON 格式非常适合 Spring 应用程序使用,因为它直接映射到Environment抽象。如果您愿意,可以通过向资源路径添加后缀(“.yml”、“.yaml”或“.properties”)来使用与 YAML 或 Java 属性相同的数据。这对于不关心 JSON 端点结构或它们提供的额外元数据的应用程序的使用非常有用(例如,不使用 Spring 的应用程序可能会从这种方法的简单性中受益)。

YAML 和属性表示有一个额外的标志(作为一个名为 的布尔查询参数提供resolvePlaceholders)来表示源文档中的占位符(以标准 Spring${…}形式)应该在可能的情况下在渲染之前在输出中解析。对于不了解 Spring 占位符约定的消费者来说,这是一个有用的功能。

使用 YAML 或属性格式存在限制,主要与元数据的丢失有关。例如,JSON 结构为属性源的有序列表,其名称与源相关。YAML 和属性表单被合并到一个映射中,即使值的来源有多个来源,并且原始源文件的名称丢失了。此外,YAML 表示也不一定是支持存储库中 YAML 源的忠实表示。它是由平面属性源列表构建的,并且必须对键的形式做出假设。

提供纯文本

Environment您的应用程序可能需要针对其环境定制的通用纯文本配置文件,而不是使用抽象(或它的 YAML 或属性格式的替代表示之一)。配置服务器通过额外的端点提供这些/{application}/{profile}/{label}/{path},其中application,profilelabel具有与常规环境端点相同的含义,但是path是文件名的路径(例如log.xml)。此端点的源文件的位置与环境端点的位置相同。相同的搜索路径用于属性和 YAML 文件。但是,不是聚合所有匹配的资源,而是只返回第一个匹配的资源。

找到资源后,使用提供的应用程序名称、配置文件和标签${…}的有效值来解析普通格式 ( ) 的占位符。Environment通过这种方式,资源端点与环境端点紧密集成。

与环境配置的源文件一样,profile用于解析文件名。因此,如果您想要一个特定于配置文件的文件,/*/development/*/logback.xml可以通过一个名为logback-development.xml(优先于logback.xml)的文件来解决。
如果您不想提供label并让服务器使用默认标签,则可以提供useDefaultLabel请求参数。因此,前面的default配置文件示例可能是/sample/default/nginx.conf?useDefaultLabel.

目前,Spring Cloud Config 可以为 git、SVN、原生后端和 AWS S3 提供明文。对 git、SVN 和本机后端的支持是相同的。AWS S3 的工作方式略有不同。以下部分展示了每个部分的工作原理:

Git、SVN 和本机后端

对于 GIT 或 SVN 存储库或本机后端,请考虑以下示例:

application.yml
nginx.conf

nginx.conf可能类似于以下列表:

server {
    listen              80;
    server_name         ${nginx.server.name};
}

application.yml 可能类似于以下清单:

nginx:
  server:
    name: example.com
---
spring:
  profiles: development
nginx:
  server:
    name: develop.com

/sample/default/master/nginx.conf资源可能如下:

server {
    listen              80;
    server_name         example.com;
}

/sample/development/master/nginx.conf 可能如下:

server {
    listen              80;
    server_name         develop.com;
}

AWS S3

要为 AWS s3 提供纯文本服务,Config Server 应用程序需要包含对 Spring Cloud AWS 的依赖。有关如何设置该依赖项的详细信息,请参阅 Spring Cloud AWS 参考指南。然后您需要配置 Spring Cloud AWS,如 Spring Cloud AWS 参考指南中所述。

解密纯文本

默认情况下,纯文本文件中的加密值不会被解密。为了启用对纯文本文件的解密,设置spring.cloud.config.server.encrypt.enabled=truespring.cloud.config.server.encrypt.plainTextEncrypt=truebootstrap.[yml|properties]

仅 YAML、JSON 和属性文件扩展名支持解密纯文本文件。

如果启用此功能,并且请求了不受支持的文件扩展名,则文件中的任何加密值都不会被解密。

嵌入配置服务器

Config Server 最好作为独立应用程序运行。但是,如果需要,您可以将其嵌入到另一个应用程序中。为此,请使用@EnableConfigServer注释。在这种情况下,一个名为的可选属性spring.cloud.config.server.bootstrap可能很有用。它是一个标志,指示服务器是否应该从其自己的远程存储库中配置自己。默认情况下,该标志是关闭的,因为它可以延迟启动。但是,当嵌入到另一个应用程序中时,以与任何其他应用程序相同的方式进行初始化是有意义的。设置spring.cloud.config.server.bootstraptrue您还必须使用复合环境存储库配置。例如

spring:
  application:
    name: configserver
  profiles:
    active: composite
  cloud:
    config:
      server:
        composite:
          - type: native
            search-locations: ${HOME}/Desktop/config
        bootstrap: true
如果您使用引导标志,则配置服务器需要将其名称和存储库 URI 配置为bootstrap.yml.

要更改服务器端点的位置,您可以(可选地)设置spring.cloud.config.server.prefix(例如,/config)以在前缀下提供资源。前缀应该以 . 开头但不能以 . 结尾/。它应用于@RequestMappingsConfig Server 中(即在 Spring Bootserver.servletPathserver.contextPath前缀之下)。

如果您想直接从后端存储库(而不是从配置服务器)读取应用程序的配置,您基本上需要一个没有端点的嵌入式配置服务器。@EnableConfigServer您可以不使用注释 (set )完全关闭端点spring.cloud.config.server.bootstrap=true

推送通知和 Spring Cloud Bus

许多源代码存储库提供商(例如 Github、Gitlab、Gitea、Gitee、Gogs 或 Bitbucket)通过 webhook 通知您存储库中的更改。您可以通过提供者的用户界面将 webhook 配置为 URL 和您感兴趣的一组事件。例如,Github使用 POST 到 webhook,其 JSON 主体包含提交列表和标头 ( X-Github-Event) 设置为push. 如果您添加对库的依赖项spring-cloud-config-monitor并在配置服务器中激活 Spring Cloud Bus,则/monitor启用端点。

当 webhook 被激活时,配置服务器会RefreshRemoteApplicationEvent针对它认为可能已经改变的应用程序发送一个目标。可以对变化检测进行策略化。但是,默认情况下,它会查找与应用程序名称匹配的文件中的更改(例如,foo.properties针对foo应用程序,而application.properties针对所有应用程序)。当您想要覆盖行为时使用的策略是PropertyPathNotificationExtractor,它接受请求标头和正文作为参数并返回更改的文件路径列表。

默认配置适用于 Github、Gitlab、Gitea、Gitee、Gogs 或 Bitbucket。除了来自 Github、Gitlab、Gitee 或 Bitbucket 的 JSON 通知之外,您还可以通过/monitor使用path={application}. 这样做会向匹配{application}模式(可以包含通配符)的应用程序广播。

仅当在配置服务器和客户端应用程序中都激活时 RefreshRemoteApplicationEvent才会传输。spring-cloud-bus
默认配置还检测本地 git 存储库中的文件系统更改。在这种情况下,不使用 webhook。但是,一旦您编辑配置文件,就会广播刷新。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吕布辕门

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

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

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

打赏作者

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

抵扣说明:

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

余额充值