You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Cloud无法将Vault秘钥解析至.yml配置文件的技术咨询

搞定Spring Cloud Config + Vault的配置解析问题

嘿,我明白你的痛点:想让所有微服务通过Config服务从Vault拿密钥,不用改微服务代码,现在却遇到yml里db.username解析不了,但@Value能拿到的奇怪情况。别慌,咱们一步步来解决:

1. 先给Config服务换对配置文件

你现在用的应该是application.yml吧?赶紧换成bootstrap.yml!因为Spring Cloud Config本身的配置源(比如Vault)需要在启动最早期的bootstrap阶段加载,application.yml加载太晚,会导致Config服务启动时还没连上Vault,自然没法把Vault的配置提供给微服务。

把你的Config配置移到bootstrap.yml里,再补全Config服务启用Vault作为配置源的关键配置:

spring:
  profiles:
    active: vault
  cloud:
    # 告诉Config服务要启用Vault作为配置源
    config:
      server:
        vault:
          enabled: true
          kv-version: 2
          backend: secret
          profile-separator: /
          default-context: myapp
    # Vault本身的连接配置
    vault:
      scheme: http
      host: 127.0.0.1
      port: 8200
      connection-timeout: 5000
      read-timeout: 15000
      authentication: TOKEN
      token: s.E4gdoIYAKxMvCE56MP5Etmvy
      kv:
        enabled: true
        backend: secret
        backend-version: 2
        profile-separator: /
      generic:
        enabled: false
      application-name: myapp

2. 确认Vault里的配置路径和Config服务匹配

你得保证Vault里存的配置路径和Config服务的规则对应上。比如你微服务的应用名是myapp,用的是dev环境,那Vault里的存储路径得是secret/myapp/dev(因为你设了profile-separator: /)。

用Vault命令验证下:

# 先把db.username存进去
vault kv put secret/myapp/dev db.username=your-actual-db-username
# 再验证能不能读出来
vault kv get secret/myapp/dev

要是能看到db.username的键值对,这步就没问题。

3. 给配置源排个优先级

默认情况下Config服务可能会优先用本地配置,咱们得让Vault的配置优先级更高,这样才能覆盖本地或者作为主要配置源。在Config服务的application.yml里加这段:

spring:
  cloud:
    config:
      server:
        composite:
          # Vault配置源优先级设高
          - type: vault
            priority: 10
          # 本地配置优先级调低
          - type: native
            priority: 1
        # 你的本地配置存放路径
        native:
          search-locations: classpath:/configs

这样Config服务合并配置时,Vault里的配置会排在前面,微服务拉取到的就是包含Vault密钥的完整配置了。

4. 为啥@Value能拿到但yml里解析不了?

这个问题本质是微服务的配置加载顺序。微服务得先通过bootstrap.yml拉取Config服务的配置,然后才加载自己的application.yml。如果你的微服务没配bootstrap.yml,或者bootstrap.yml里没指向Config服务,那application.yml加载的时候还没拿到Vault的配置,自然解析不了${db.username},但后续Spring上下文初始化完成后,@Value又能从环境变量里拿到值。

所以确保微服务的bootstrap.yml里有这段:

spring:
  cloud:
    config:
      # 你的Config服务地址
      uri: http://127.0.0.1:8888
      # 对应Vault里的应用名
      name: myapp
      # 对应Vault里的环境
      profile: dev

同时微服务要依赖spring-cloud-starter-config,不然没法从Config服务拉配置。

做完这些,重启Config服务和微服务,你会发现微服务yml里的db.username: ${db.username}就能正常解析啦,而且完全不用改微服务的业务代码~


内容的提问来源于stack exchange,提问作者sherybedrock

火山引擎 最新活动