反应式基础设施
本节涵盖了有关使用 Spring Vault 的反应式编程支持的基本信息。
什么是反应式编程?
简单来说,反应式编程是关于非阻塞应用程序 异步和事件驱动,并且需要少量线程来垂直扩展 (即在 JVM 中)而不是水平(即通过集群)。
响应式应用程序的一个关键方面是背压的概念,这是一种机制 确保生产者不会压倒消费者。例如,在 reactive 的管道中 组件从数据库扩展到 HTTP 响应(当 HTTP 连接为 太慢,数据存储库也可能减慢或完全停止,直到网络容量释放。
反应式 Vault 客户端
Spring Vault 的反应式客户端支持建立在可组合的身份验证步骤和 Spring 通过 Reactor Netty 或 Jetty 的功能之上,它们都具有完全无阻塞的、事件驱动的 HTTP 客户端。WebClient
它将 VaultTokenSupplier
公开为 VaultToken
的提供者,以验证 HTTP 请求
和 ReactiveVaultOperations
作为主入口点。
的核心配置和 SSL 在
各种客户端实现。VaultEndpoint
ClientOptions
类 ReactiveVaultTemplate
位于包
是 Spring 的反应式 Vault 支持的中心类,提供了丰富的功能集,以
与 Vault 交互。该模板提供了方便的读取、写入和
删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。org.springframework.vault.core
配置完成后,ReactiveVaultTemplate 是线程安全的,可以在
多个实例。 |
Vault 文档和域类之间的映射是通过 declarating to 及其编解码器完成的。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
实例将参与
在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用
应用程序关闭。您还可以在应用程序中重用相同的 ReactiveVaultTemplate
实例。VaultTokenSupplier
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 | 创建一个 默认指向 .https://localhost:8200 |
2 | 此示例使用 TokenAuthentication 快速入门。
有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。 |
会话管理
Spring Vault 需要一个令牌来验证 Vault 请求。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
反应式客户端需要一个非阻塞的代币供应商,其合约已定义
在。令牌可以是静态的,也可以通过声明的身份验证流程获取。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
会话令牌应在整个会话中保留。
这方面由实现 ReactiveSessionManager
的 session 管理器处理,例如 ReactiveLifecycleAwareSessionManager
。VaultTokenSupplier
执行回调
所有 Spring 模板类的一个共同设计特性是所有功能
路由到其中一个模板执行回调方法。这有助于确保
执行异常和可能需要的任何资源管理
一致性。虽然在 JDBC 和 JMS 的情况下,这更需要
与 Vault 相比,它仍然提供一个用于访问和日志记录的位置。
因此,使用 execute 回调是访问 Vault API 的首选方式
来执行我们尚未在 ReactiveVaultTemplate
上作为方法公开的不常见操作。
以下是 execute 回调方法的列表。
-
<T> T
doWithVault 编写一个 reactive sequence 给定的 ,允许在没有会话上下文的情况下与 Vault 交互。(Function<WebClient, ? extends T> clientCallback)
WebClient
-
<T> T
doWithSession 会话 编写一个 reactive sequence 中给定的 ,允许在经过身份验证的会话中与 Vault 进行交互。(Function<WebClient, ? extends T> clientCallback)
WebClient
下面是一个使用回调初始化 Vault 的示例:
reactiveVaultOperations.doWithVault(webClient -> {
return webClient.put()
.uri("/sys/init")
.syncBody(request)
.retrieve()
.toEntity(VaultInitializationResponse.class);
});