如何将 Spring Cloud Config 与 Git 和 Vault 复合环境存储库一起使用?

Posted

技术标签:

【中文标题】如何将 Spring Cloud Config 与 Git 和 Vault 复合环境存储库一起使用?【英文标题】:How to use Spring Cloud Config with a Git and Vault composite environment repository? 【发布时间】:2017-06-29 10:00:08 【问题描述】:

我一直在修改 Spring Cloud Config,但是有一个用例,其中配置属性分为两种类型:

    开发人员应该能够查看和维护的非机密值(例如 JDBC URL 等)

    秘密值,只能由具有特殊访问权限(例如密码)的指定人员查看和维护

所以我对“Composite Environment Repositories”的支持非常感兴趣,目前在快照版本中可用。似乎我可以将 Git 用于开发人员管理的属性,将 Vault 用于秘密属性,并对其进行配置,以便在发生冲突时 Vault 始终优先于 Git。

但是,我发现 Vault 不仅始终具有优先权……它还被用作独家后端。根本不返回来自 Git 的属性。

我的application.yml 看起来像这样:

spring:
  profiles:
    active: git, vault
  cloud:
    config:
      server:
        vault:
          order: 1
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          basedir: target/config
          order: 2

我已经像这样向 Vault 写了一个属性:

vault write secret/foo foo=vault

我这样调用我的配置服务器:

curl -X "GET" "http://127.0.0.1:8888/foo/default" -H "X-Config-Token: a9384085-f048-7c99-ebd7-e607840bc24e"

但是,JSON 响应负载仅包含 Vault 属性。 Git 什么都没有:


    "name": "foo",
    "profiles": [
        "default"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        
            "name": "vault:foo",
            "source": 
                "foo": "vault"
            
        
    ]

如果我反转application.yml 中的order 设置,让Git 比Vault 具有更高的优先级,这并不重要。只要 Vault 配置文件处于活动状态,它就会充当专有后端。

但是,如果我停用保管库配置文件,则相同的 curl 操作会从 Git 后端返回结果:


    "name": "foo",
    "profiles": [
        "default"
    ],
    "label": "master",
    "version": "30f5f4a144dba41e23575ebe46369222b7cbc90d",
    "state": null,
    "propertySources": [
        
            "name": "https://github.com/spring-cloud-samples/config-repo/foo.properties",
            "source": 
                "democonfigclient.message": "hello spring io",
                "foo": "from foo props"
            
        ,
        
            "name": "https://github.com/spring-cloud-samples/config-repo/application.yml",
            "source": 
                "info.description": "Spring Cloud Samples",
                "info.url": "https://github.com/spring-cloud-samples",
                "eureka.client.serviceUrl.defaultZone": "http://localhost:8761/eureka/",
                "foo": "from-default"
            
        
    ]

有什么我可能会丢失的吗?为什么 Git 属性和 Vault 属性不能……嗯,“合成”在一起?

文档中唯一的示例显示了 Git 和 Subversion 一起使用,并且有一个注释警告您所有 repos 应该包含相同的标签(例如master)。我想知道这是否是问题所在,因为 Vault 的标签始终为 null

【问题讨论】:

嗨,史蒂夫,感谢您的报告。下个礼拜我会看看这个。 你用的是什么版本的Spring Cloud?我刚试过这个,得到了这个,它对我有用。 1.2.3(快照)。我刚刚在github.com/spring-cloud-samples/configserver 修改了示例项目 当我尝试强制将1.3.0-BUILD.SNAPSHOT 用于spring-cloud-config-server 时,启动失败,因为lib-internal 类EnvironmentRepositoryConfiguration$VaultConfiguration 无法创建Spring bean valutEnvironmentRepository(肯定是错字错误!) . 我想知道 Maven POM 是否也必须从 Camden.BUILD-SNAPSHOT 提升 spring-cloud-dependencies 的版本。如果您有一个使用任何依赖项组合的示例,那么 Maven 或 Gradle 脚本的副本将不胜感激! 【参考方案1】:

我相信您的依赖项一定有问题。我还设置了一个带有 git 和 vault 的 spring 云配置服务器,它工作得很好。 我认为强制使用 1.3.0-BUILD.SNAPSHOT 是不够的。 Spring cloud config 1.3.0-BUILD.SNAPSHOT 依赖于 spring-vault-core。您可能缺少这种依赖关系。这可能会导致您在其中一个 cmets 中提到的失败的 bean 创建。 这是带有 git 和 Vault 的示例项目的 a link。请随意查看。

【讨论】:

非常感谢@ryan-baxter 和您自己。我现在已经启动并运行了所需的配置 server 和 client。

以上是关于如何将 Spring Cloud Config 与 Git 和 Vault 复合环境存储库一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud config

如何获取 Spring-Cloud-Config-Server 管理的文件列表

Spring Cloud 如何搭建Config

Spring Cloud Consul—git2consul与配置

spring cloud 学习 - config server

如何使用Spring Cloud Config进行分布式配置,知道一个算你牛