此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Vault 3.1.2spring-doc.cn

反应式基础设施

本节涵盖了有关使用 Spring Vault 的反应式编程支持的基本信息。spring-doc.cn

什么是反应式编程?

简单来说,反应式编程是关于非阻塞应用程序 异步和事件驱动,并且需要少量线程来垂直扩展 (即在 JVM 中)而不是水平(即通过集群)。spring-doc.cn

响应式应用程序的一个关键方面是背压的概念,这是一种机制 确保生产者不会压倒消费者。例如,在 reactive 的管道中 组件从数据库扩展到 HTTP 响应(当 HTTP 连接为 太慢,数据存储库也可能减慢或完全停止,直到网络容量释放。spring-doc.cn

反应式 Vault 客户端

Spring Vault 的反应式客户端支持建立在可组合的身份验证步骤和 Spring 通过 Reactor Netty 或 Jetty 的功能之上,它们都具有完全无阻塞的、事件驱动的 HTTP 客户端。WebClientspring-doc.cn

它将 VaultTokenSupplier 公开为 VaultToken 的提供者,以验证 HTTP 请求 和 ReactiveVaultOperations 作为主入口点。 的核心配置和 SSL 在 各种客户端实现。VaultEndpointClientOptionsspring-doc.cn

类 ReactiveVaultTemplate 位于包 是 Spring 的反应式 Vault 支持的中心类,提供了丰富的功能集,以 与 Vault 交互。该模板提供了方便的读取、写入和 删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。org.springframework.vault.corespring-doc.cn

配置完成后,ReactiveVaultTemplate 是线程安全的,可以在 多个实例。

Vault 文档和域类之间的映射是通过 declarating to 及其编解码器完成的。WebClientspring-doc.cn

ReactiveVaultTemplate 类实现了 ReactiveVaultOperations 接口。 ReactiveVaultOperations 上的方法尽可能以方法 在 Vault API 上提供,以使现有 Vault 开发人员熟悉 API 他们习惯了 API 和 CLI。例如,您将找到诸如 “write”、“delete” 和 “read” 来获取。 设计目标是尽可能轻松地在 使用 Vault API 和 ReactiveVaultOperations。两者之间的主要区别 这两个 API 是 ReactiveVaultOperations 可以传递域对象,而不是 JSON 键值对。spring-doc.cn

引用 ReactiveVaultTemplate 实例上的操作的首选方式 通过其接口 ReactiveVaultOperations 进行。

ReactiveVaultTemplate 未显式公开的功能,您可以使用以下 多个 execute 回调方法以访问底层 API。执行回调 将为您提供对对象的引用。 有关更多信息,请参阅 执行回调 部分。WebClientspring-doc.cn

现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。spring-doc.cn

注册和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring Context。但是,在托管上下文中注册的 ReactiveVaultTemplate 实例将参与 在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用 应用程序关闭。您还可以在应用程序中重用相同的 ReactiveVaultTemplate 实例。VaultTokenSupplierspring-doc.cn

Spring Vault 附带了一个支持 bean 定义的配置类 在 Spring 上下文中使用。应用程序配置 类通常从 AbstractVaultConfiguration 扩展而来,并且需要 提供特定于环境的其他详细信息。spring-doc.cn

AbstractVaultConfiguration 扩展需要实现 ' VaultEndpoint vaultEndpoint()' 和方法。ClientAuthentication clientAuthentication()spring-doc.cn

示例 1.使用基于 Java 的 bean 元数据注册 Spring Vault 对象
@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 管理器处理,例如 ReactiveLifecycleAwareSessionManagerVaultTokenSupplierspring-doc.cn

执行回调

所有 Spring 模板类的一个共同设计特性是所有功能 路由到其中一个模板执行回调方法。这有助于确保 执行异常和可能需要的任何资源管理 一致性。虽然在 JDBC 和 JMS 的情况下,这更需要 与 Vault 相比,它仍然提供一个用于访问和日志记录的位置。 因此,使用 execute 回调是访问 Vault API 的首选方式 来执行我们尚未在 ReactiveVaultTemplate 上作为方法公开的不常见操作。spring-doc.cn

以下是 execute 回调方法的列表。spring-doc.cn

  • <T> T doWithVault 编写一个 reactive sequence 给定的 ,允许在没有会话上下文的情况下与 Vault 交互。(Function<WebClient, ? extends T> clientCallback)WebClientspring-doc.cn

  • <T> T doWithSession 会话 编写一个 reactive sequence 中给定的 ,允许在经过身份验证的会话中与 Vault 进行交互。(Function<WebClient, ? extends T> clientCallback)WebClientspring-doc.cn

下面是一个使用回调初始化 Vault 的示例:spring-doc.cn

reactiveVaultOperations.doWithVault(webClient -> {

    return webClient.put()
                    .uri("/sys/init")
                    .syncBody(request)
                    .retrieve()
                    .toEntity(VaultInitializationResponse.class);
});