此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Vault 3.1.2! |
反应式基础设施
本节涵盖了有关使用 Spring Vault 的反应式编程支持的基本信息。
什么是反应式编程?
简单来说,反应式编程是关于非阻塞应用程序 异步和事件驱动,并且需要少量线程来垂直扩展 (即在 JVM 中)而不是水平(即通过集群)。
响应式应用程序的一个关键方面是背压的概念,这是一种机制 确保生产者不会压倒消费者。例如,在 reactive 的管道中 组件从数据库扩展到 HTTP 响应(当 HTTP 连接为 太慢,数据存储库也可能减慢或完全停止,直到网络容量释放。
反应式 Vault 客户端
Spring Vault 的反应式客户端支持建立在可组合的身份验证步骤和 Spring 的功能WebClient
通过 Reactor Netty 或 Jetty,它们都具有完全无阻塞、事件驱动的 HTTP 客户端。
它暴露了VaultTokenSupplier
作为VaultToken
对 HTTP 请求进行身份验证
和ReactiveVaultOperations
作为主要入口点。
的核心配置VaultEndpoint
,ClientOptions
和 SSL 在
各种客户端实现。
类ReactiveVaultTemplate
,位于包装中org.springframework.vault.core
,
是 Spring 的反应式 Vault 支持的中心类,提供了丰富的功能集,以
与 Vault 交互。该模板提供了方便的读取、写入和
删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。
配置完成后,ReactiveVaultTemplate 是线程安全的,并且可以在
多个实例。 |
Vault 文档和域类之间的映射是通过委托给WebClient
及其编解码器。
这ReactiveVaultTemplate
类实现接口ReactiveVaultOperations
.
尽可能地使用ReactiveVaultOperations
以方法
在 Vault API 上提供,以使现有 Vault 开发人员熟悉 API
他们习惯了 API 和 CLI。例如,您将找到诸如
“write”、“delete” 和 “read” 来获取。
设计目标是尽可能轻松地在
使用 Vault API 和ReactiveVaultOperations
.两者之间的主要区别
这两个 API 是ReactiveVaultOperations
可以传递域对象而不是
JSON 键值对。
引用ReactiveVaultTemplate 实例
通过其接口ReactiveVaultOperations . |
未由ReactiveVaultTemplate
您可以使用以下
多个 execute 回调方法以访问底层 API。执行回调
将为您提供对WebClient
对象。
有关更多信息,请参阅 执行回调 部分。
现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。
注册和配置 Spring Vault bean
使用 Spring Vault 不需要 Spring Context。但是,ReactiveVaultTemplate
和VaultTokenSupplier
在 Managed Context 中注册将参与
在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用
应用程序关闭。您还可以从重复使用中受益ReactiveVaultTemplate
实例。
Spring Vault 附带了一个支持 bean 定义的配置类
在 Spring 上下文中使用。应用程序配置
类通常从AbstractVaultConfiguration
并且需要
提供特定于环境的其他详细信息。
扩展自AbstractVaultConfiguration
需要实现
' VaultEndpoint vaultEndpoint()' 和ClientAuthentication clientAuthentication()
方法。
@Configuration
public class AppConfig extends AbstractReactiveVaultConfiguration {
/**
* Specify an endpoint for connecting to Vault.
*/
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint(); (1)
}
/**
* Configure a client authentication.
* Please consider a more secure authentication method
* for production use.
*/
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…"); (2)
}
}
1 | 新建VaultEndpoint 默认指向https://localhost:8200 . |
2 | 此示例使用TokenAuthentication 以快速入门。
有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。 |
会话管理
Spring Vault 需要一个令牌来验证 Vault 请求。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
反应式客户端需要一个非阻塞的代币供应商,其合约已定义
在VaultTokenSupplier
.令牌可以是静态的,也可以通过声明的身份验证流程获取。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
会话令牌应在整个会话中保留。
这方面由实现 session manager 的 session manager 处理ReactiveSessionManager
如ReactiveLifecycleAwareSessionManager
.
执行回调
所有 Spring 模板类的一个共同设计特性是所有功能
路由到其中一个模板执行回调方法。这有助于确保
执行异常和可能需要的任何资源管理
一致性。虽然在 JDBC 和 JMS 的情况下,这更需要
与 Vault 相比,它仍然提供一个用于访问和日志记录的位置。
因此,使用 execute 回调是访问 Vault API 的首选方式
执行我们尚未作为方法公开的不常见作ReactiveVaultTemplate
.
以下是 execute 回调方法的列表。
-
<T> T
doWithVault(Function<WebClient, ? extends T> clientCallback)
编写一个 reactive 对给定的WebClient
,允许在没有会话上下文的情况下与 Vault 进行交互。 -
<T> T
doWithSession 会话(Function<WebClient, ? extends T> clientCallback)
编写一个 reactive 对给定的WebClient
,允许在经过身份验证的会话中与 Vault 进行交互。
下面是一个使用回调初始化 Vault 的示例:
reactiveVaultOperations.doWithVault(webClient -> {
return webClient.put()
.uri("/sys/init")
.syncBody(request)
.retrieve()
.toEntity(VaultInitializationResponse.class);
});