本节介绍有关使用 Spring Vault 的响应式编程支持的基本信息。Spring中文文档

什么是反应式编程?

简单来说,响应式编程是关于非阻塞应用程序的,这些应用程序是 异步和事件驱动,需要少量线程才能垂直扩展 (即在 JVM 中)而不是水平(即通过聚类)。Spring中文文档

反应应用的一个关键方面是背压的概念,它是一种机制 以确保生产者不会让消费者不知所措。例如,在反应式管道中 当 HTTP 连接 太慢,数据存储库也会变慢或完全停止,直到网络容量释放。Spring中文文档

Reactive Vault 客户端

Spring Vault 的响应式客户端支持建立在可组合身份验证步骤之上,Spring 通过 Reactor Netty 或 Jetty 运行,它们具有完全非阻塞、事件驱动的 HTTP 客户端。WebClientSpring中文文档

它公开为对 HTTP 请求进行身份验证的供应商 并作为主要切入点。和 SSL 的核心配置在 各种客户端实现。VaultTokenSupplierVaultTokenReactiveVaultOperationsVaultEndpointClientOptionsSpring中文文档

类,位于包中, 是 Spring 的反应式 Vault 支持的核心类,提供丰富的功能集 与 Vault 交互。该模板提供了读取、写入和 删除 Vault 中的数据,并提供域对象和 Vault 数据之间的映射。ReactiveVaultTemplateorg.springframework.vault.coreSpring中文文档

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

Vault 文档和域类之间的映射是通过委派 to 及其编解码器来完成的。WebClientSpring中文文档

该类实现接口 。 在尽可能的情况下,上的方法都以方法命名 在 Vault API 上可用,使现有 Vault 开发人员熟悉 API 习惯了 API 和 CLI 的人。例如,您将找到诸如 “写入”、“删除”和“读取”。 设计目标是尽可能轻松地在 Vault API 的使用和 .两者之间的主要区别 这两个 API 是可以传递域对象而不是 JSON 键值对。ReactiveVaultTemplateReactiveVaultOperationsReactiveVaultOperationsReactiveVaultOperationsReactiveVaultOperationsSpring中文文档

引用实例上的操作的首选方式 是通过它的接口。ReactiveVaultTemplateReactiveVaultOperations

您可以使用以下之一的未显式公开的功能 多个执行回调方法来访问底层 API。execute 回调 将为您提供对对象的引用。 有关详细信息,请参阅执行回调部分。ReactiveVaultTemplateWebClientSpring中文文档

现在,让我们看一下如何在 Spring 容器的上下文中使用 Vault 的示例。Spring中文文档

配置后,是线程安全的,可以跨 多个实例。ReactiveVaultTemplate
引用实例上的操作的首选方式 是通过它的接口。ReactiveVaultTemplateReactiveVaultOperations

注册和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring Context。但是,托管上下文中注册的实例将参与其中 在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处置活动 Vault 会话非常有用 应用程序关闭。您还可以从在应用程序中重用同一实例中受益。ReactiveVaultTemplateVaultTokenSupplierReactiveVaultTemplateSpring中文文档

Spring Vault 附带了一个支持配置类,该类提供 Bean 定义 用于 Spring 上下文。应用程序配置 类通常扩展自 并且需要 提供特定于环境的其他详细信息。AbstractVaultConfigurationSpring中文文档

从需求扩展到实现 “VaultEndpoint vaultEndpoint()”和方法。AbstractVaultConfigurationClientAuthentication clientAuthentication()Spring中文文档

例 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 创建一个默认指向 的新建。VaultEndpointhttps://localhost:8200
2 此示例用于快速入门。 有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。TokenAuthentication
1 创建一个默认指向 的新建。VaultEndpointhttps://localhost:8200
2 此示例用于快速入门。 有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。TokenAuthentication

会话管理

Spring Vault 需要令牌来验证 Vault 请求。 有关身份验证的详细信息,请参阅 [vault.core.authentication]。 反应式客户端需要一个非阻塞代币供应商,其合约已定义 在。令牌可以是静态的,也可以通过声明的身份验证流获取。 Vault 登录不应在每次经过身份验证的 Vault 交互中发生,但 会话令牌应跨会话保留。这方面由 会话管理器实现 ,例如 .VaultTokenSupplierReactiveSessionManagerReactiveLifecycleAwareSessionManagerSpring中文文档

执行回调

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

下面是执行回调方法的列表。Spring中文文档

  • <T> T doWithVault 组成一个反应式 对给定的 进行排序,允许在没有会话上下文的情况下与 Vault 进行交互。(Function<WebClient, ? extends T> clientCallback)WebClientSpring中文文档

  • <T> T doWithSession 组成一个反应式 对给定的序列,允许在经过身份验证的会话中与 Vault 进行交互。(Function<WebClient, ? extends T> clientCallback)WebClientSpring中文文档

下面是一个使用回调初始化 Vault 的示例:Spring中文文档

reactiveVaultOperations.doWithVault(webClient -> {

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