【问题标题】:Spring Cloud Config Vault does not work with the default profileSpring Cloud Config Vault 不适用于默认配置文件
【发布时间】:2023-02-15 10:11:40
【问题描述】:

我正在按照 Manning 的书 Spring microservices in action 2e 进行配置服务器的实现,我遇到了配置服务器不从默认配置文件读取属性的问题。

我的保管库路径是secret/licensing-service/default,我可以通过此命令读取默认配置文件的保管库配置

curl -X GET -H "X-Vault-Token:myroot" http://127.0.0.1:8200/v1/secret/data/licensing-service/default | jq

但是,当我启用调试日志记录并发出请求时:

curl -X "GET" "http://localhost:8071/licensing-service/default" -H "X-Config-Token: myroot" | jq                    
{
  "name": "licensing-service",
  "profiles": [
    "default"
  ],
  "label": null,
  "version": null,
  "state": null,
  "propertySources": []
}

我看到 spring 尝试发出以下 HTTP 请求:

2022-11-13 15:41:41.272 DEBUG 92277 --- [nio-8071-exec-9] o.s.web.client.RestTemplate
              : HTTP GET http://127.0.0.1:8200/v1/secret/data/licensing-service
2022-11-13 15:41:42.100 DEBUG 92277 --- [nio-8071-exec-9] o.s.web.client.RestTemplate
              : HTTP GET http://127.0.0.1:8200/v1/secret/data/application

可以看出它从 URL 中删除了一个默认关键字,我发现它在以下类中这样做 - https://github.com/spring-cloud/spring-cloud-config/blob/main/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AbstractVaultEnvironmentRepository.java 特别是这里:

private List<String> scrubProfiles(String[] profiles) {
        List<String> scrubbedProfiles = new ArrayList<>(Arrays.asList(profiles));
        scrubbedProfiles.remove("default");
        return scrubbedProfiles;
    }

我做错了什么以及如何让它从默认配置文件中读取数据?上面描述的所有内容都适用于 vault path secret/licensing-service/dev 的开发配置文件 这是我的配置服务器的配置:

spring:
  application:
    name: config-server
  profiles:
    active: vault
  cloud:
    config:
      server:
        vault:
          port: 8200
          host: 127.0.0.1
          kv-version: 2
          profile-separator: /


server:
  port: 8071

【问题讨论】:

    标签: java spring-cloud spring-cloud-config spring-cloud-vault-config


    【解决方案1】:

    你在哪里创造你的秘密? 如果您创建了“秘密/许可秘密”,则意味着您在“秘密”引擎中创建了“许可服务”秘密。然后你可以像这样使用 curl 从 Spring Config API 请求属性:

    curl -X "GET" "http://localhost:8071/licensing-service/default" -H "X-Config-Token: myroot"

    您在日志中看到的以下两个请求意味着:

    HTTP GET http://127.0.0.1:8200/v1/secret/data/licensing-service 是您的实际要求。

    HTTP GET http://127.0.0.1:8200/v1/secret/data/application 是 Spring 本身发出的请求,因为默认情况下,所有使用 Spring Config 的应用程序都可以使用在“secret/application”中创建的属性。

    如果您在“许可服务”引擎中创建了“许可服务”秘密,那么您必须设置该属性spring.cloud.config.server.vault.backend=许可服务

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2016-03-21
      • 2012-12-10
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多