我正在按照 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-云配置服务器/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;
}
我做错了什么以及如何让它从默认配置文件中读取数据?上面描述的所有内容都适用于具有保险库路径的开发配置文件
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
书错了你在哪里创造你的秘密? 如果您创建了“秘密/许可秘密”,则意味着您在“秘密”引擎中创建了“许可服务”秘密。然后你可以像这样使用 curl 从 Spring Config API 请求属性:
curl -X "GET" "http://localhost:8071/licensing-service/default" -H "X-Config-Token: myroot"
您在日志中看到的以下两个请求是这样的:
HTTP 获取http://127.0.0.1:8200/v1/secret/data/licensing-service 是您的实际要求。
HTTP 获取http://127.0.0.1:8200/v1/secret/data/application 是 Spring 本身发出的请求,因为在“secret/application”中创建的属性默认情况下可用于所有使用 Spring Config 的应用程序。
如果您在“许可服务”引擎中创建了“许可服务”秘密,则必须设置属性 spring.cloud.config.server.vault.backend=licensing-service