响应式基础设施
本节介绍了使用 Spring Vault 进行响应式编程支持的基本信息。
什么是响应式编程?
简单来说,响应式编程指的是非阻塞的应用程序异步且事件驱动,需要少量线程来垂直扩展(即在JVM内)而非水平扩展(即通过聚类)。
响应式应用的一个关键方面是背压的概念,这是一种机制以确保生产者不会让消费者感到压力。例如,在一个响应式组件从数据库延伸到HTTP响应的管道中,当HTTP连接速度过慢时,数据存储库也可能减慢甚至完全停止,直到网络容量被释放。
响应式保险库客户端
Spring Vault 的响应式客户端支持建立在可组合认证步骤和 Spring 功能之上Web客户端通过Reactor Netty或Jetty,这两者都配备了完全非阻塞、事件驱动的HTTP客户端。
它暴露了VaultTokenSupplier作为VaultToken(金库Tokens)用于认证HTTP请求 和ReactiveVault运营作为主要入口。核心配置VaultEndpoint,客户端选项SSL在各种客户端实现中被重复使用。
该级别ReactiveVault模板,位于包中org.springframework.vault.core, 是 Spring 响应式 Vault 支持的核心类,提供了丰富的功能集与 Vault 交互。该模板提供了便捷的作,用于读取、写入和删除 Vault 中的数据,并提供你的域对象与 Vault 数据之间的映射。
一旦配置好,ReactiveVault模板线程安全,且可在多个实例间重用。 |
Vault 文档与域类之间的映射通过委派至Web客户端以及其编解码器。
这ReactiveVault模板类实现了该接口ReactiveVault运营. 尽可能地,方法在ReactiveVault运营以 Vault API 中可用的方法命名以便现有 Vault 开发者熟悉该 API他们习惯于 API 和 CLI。例如,你会找到诸如“写”、“删除”和“读取”等方法。设计目标是尽可能方便地在Vault API 的使用 和ReactiveVault运营. 两个API之间的一个主要区别是两个API之间ReactiveVault运营可以传递域对象,而不是JSON 键值对。
使用的路径ReactiveVault模板(以及从那里访问的接口)被认为是相对于VaultEndpoint. 完全限定的URI路径可以使用在认证上下文中访问Vault集群成员。为了防止不必要的完整URI访问,确保在传递给路径前对它们进行净化处理ReactiveVault模板.
引用 的首选作方式ReactiveVault模板实例 是通过其接口ReactiveVault运营. |
未被ReactiveVault模板你可以使用其中一种执行回调方法来访问底层API。执行回调会给你一个引用Web客户端对象。 更多信息请参阅“执行回访”部分。
现在让我们看看如何在 Spring 容器的语境下使用 Vault 的示例。
注册和配置Spring Vault豆子
使用 Spring Vault 不需要 Spring 上下文。然而,以下实例ReactiveVault模板和VaultTokenSupplier注册在受管理上下文中的将参与Spring IoC 容器提供的生命周期事件。这对于在应用关闭时处置活跃的 Vault 会话非常有用。你还能从重复使用该会话中受益ReactiveVault模板在你的应用中实例。
Spring Vault 自带一个支持的配置类,提供 bean 定义用于在 Spring 上下文中使用。应用配置类通常从 扩展到摘要Vault配置并且必须提供环境特定的额外细节。
从摘要Vault配置需要实现' VaultEndpoint vaultEndpoint()' 和客户端认证 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 | 此示例使用Tokens认证快速开始。详见 [vault.core.authentication] 支持的认证方法。 |
会话管理
Spring Vault 需要一个Tokens来认证 Vault 请求。有关认证的详细信息请参见 [vault.core.authentication]。响应式客户端需要一个非阻塞的Tokens提供商,其合同已被定义 在VaultTokenSupplier. Tokens可以是静态的,也可以通过声明的认证流程获得。Vault 登录不应在每次认证后的 Vault 交互中发生,但会话Tokens应在整个会话中保留。这一方面由实现的会话管理器处理ReactiveSessionManager如ReactiveLifecycleAwareSessionManager.
执行回调
所有 Spring 模板类的一个共同设计特征是所有功能都被路由到某个模板执行回调方法中。这有助于确保异常以及可能需要的资源管理能够得到执行 一致性。 虽然这在JDBC和JMS中需求更大但相比Vault,它仍然提供了一个访问和日志的单一点。因此,使用执行回调是访问Vault API的首选方式用于执行我们未公开的方法ReactiveVault模板.
以下是执行回调方法的列表。
-
<T> TdoWithVault(函数<WebClient, ? 扩展 T>clientCallback)组成响应式给定序列Web客户端允许在没有会话上下文的情况下与Vault交互。 -
<T> TdoWithSession(函数<WebClient, ? 扩展 T>clientCallback)组成响应式给定序列Web客户端允许在认证会话中与Vault交互。
这里有一个使用回调来初始化 Vault 的示例:
reactiveVaultOperations.doWithVault(webClient -> {
return webClient.put()
.uri("/sys/init")
.syncBody(request)
.retrieve()
.toEntity(VaultInitializationResponse.class);
});