在 application.run 之前安装 Spring Cloud Vault 的代理工厂
使用 bootstrap 注册表钩子来访问 ConfigData,这种访问可能发生在普通应用 Bean 出现之前。
当 Vault 提供 ConfigData 时,它的第一个请求可能在普通的代理定制 Bean 存在之前发生。请改用 bootstrap 注册表安装请求工厂。
对于 Spring Framework 6.1 或更高版本的栈:
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.http.HttpClient;
import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.vault.config.AbstractVaultConfiguration
.ClientFactoryWrapper;
var http = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("proxy.example.net", 8080)))
.build();
application.addBootstrapRegistryInitializer(registry ->
registry.register(ClientFactoryWrapper.class, context ->
new ClientFactoryWrapper(
new JdkClientHttpRequestFactory(http))));application 是现有的 SpringApplication。在调用 run 之前添加这个初始化器,同时保留 Vault URI 和认证设置。
ClientFactoryWrapper 将这个工厂暴露给 Vault 的 bootstrap 基础设施;它不会为不相关的 HTTP 客户端安装应用级默认值。
使用项目兼容的 Cloud Vault/Boot 依赖集。Apache 4 的示例不能复制到 Spring Framework 6 的 Apache 5 请求工厂中。
也要在 bootstrap 之前让代理地址可用。对于位于允许公共代理的路由上的公开可访问 Vault 服务器,请在应用启动前从HTTP 代理列表中选择一个 HTTP 候选。如果它只存储在 Vault 中,应用就无法发现该第一次 Vault 请求所需的路线。