此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Vault 3.2.0! |
响应式基础设施
本节介绍有关使用 Spring Vault 的响应式编程支持的基本信息。
什么是响应式编程?
简单来说,响应式编程是关于非阻塞应用程序,这些应用程序是 异步和事件驱动,需要少量线程才能垂直扩展 (即在 JVM 内)而不是水平(即通过聚类)。
响应式应用的一个关键方面是背压的概念,这是一种机制 以确保生产者不会压垮消费者。例如,在响应式管道中 当 HTTP 连接 太慢的数据存储库也会变慢或完全停止,直到网络容量释放。
响应式保管库客户端
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
class 实现接口ReactiveVaultOperations
.
在尽可能多的方法中ReactiveVaultOperations
以方法命名
在 Vault API 上可用,以使现有 Vault 开发人员熟悉该 API
他们习惯了 API 和 CLI。例如,您会发现诸如
“写入”、“删除”和“读取”。
设计目标是尽可能轻松地在
Vault API 的使用和ReactiveVaultOperations
.两者之间的主要区别
这两个 API 是ReactiveVaultOperations
可以传递域对象,而不是
JSON 键值对。
用于ReactiveVaultTemplate
(以及从那里访问的接口)被考虑
相对于VaultEndpoint
.可以使用完全限定的 URI 路径
以访问经过身份验证的上下文中的 Vault 集群成员。防止不需要的
完整的 URI 访问权限,请确保在将路径传递给ReactiveVaultTemplate
.
引用ReactiveVaultTemplate 实例
是通过其接口ReactiveVaultOperations . |
未显式公开的功能ReactiveVaultTemplate
您可以使用以下选项之一
多个执行回调方法来访问底层 API。执行回调
将为您提供对WebClient
对象。
有关更多信息,请参阅执行回调部分。
现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。
注册和配置 Spring Vault Bean
使用 Spring Vault 不需要 Spring Context。但是,实例ReactiveVaultTemplate
和VaultTokenSupplier
在托管上下文中注册将参与
在 Spring IoC 容器提供的生命周期事件中。这对于在
应用程序关闭。您还可以从重复使用相同的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 需要Tokens来验证 Vault 请求。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
响应式客户端需要一个非阻塞Tokens提供商,其合约已定义
在VaultTokenSupplier
.Tokens可以是静态的,也可以是通过声明的身份验证流获取的。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
会话Tokens应在会话中保留。
这方面由实现的会话管理器处理ReactiveSessionManager
如ReactiveLifecycleAwareSessionManager
.
执行回调
所有 Spring 模板类的一个共同设计特征是所有功能
路由到模板执行回调方法之一。这有助于确保
执行异常和可能需要的任何资源管理
一致性。虽然在 JDBC 和 JMS 的情况下,这更需要
与 Vault 相比,它仍然提供一个访问和日志记录的位置。
因此,使用执行回调是访问 Vault API 的首选方式
执行我们未作为方法公开的不常见作ReactiveVaultTemplate
.
下面是执行回调方法的列表。
-
<T> T
doWithVault(Function<WebClient, ? extends T> clientCallback)
组成一个响应式 对给定的WebClient
,允许在没有会话上下文的情况下与 Vault 进行交互。 -
<T> T
doWith会话(Function<WebClient, ? extends T> clientCallback)
组成一个响应式 对给定的WebClient
,允许在经过身份验证的会话中与 Vault 进行交互。
下面是一个使用回调初始化 Vault 的示例:
reactiveVaultOperations.doWithVault(webClient -> {
return webClient.put()
.uri("/sys/init")
.syncBody(request)
.retrieve()
.toEntity(VaultInitializationResponse.class);
});