響應式基礎設施

本節涵蓋使用 Spring Vault 實現響應式程式設計支援的基本資訊。

什麼是響應式程式設計?

簡單來說,響應式程式設計是指非阻塞應用程式,它們是非同步的、事件驅動的,並且需要少量執行緒才能垂直(即在 JVM 內)而不是水平(即透過叢集)擴充套件。

響應式應用程式的一個關鍵方面是背壓的概念,這是一種確保生產者不會壓倒消費者的機制。例如,在一個從資料庫到 HTTP 響應的響應式元件管道中,當 HTTP 連線太慢時,資料儲存庫也可以減慢或完全停止,直到網路容量釋放。

響應式 Vault 客戶端

Spring Vault 的響應式客戶端支援構建在可組合身份驗證步驟和 Spring 的函式式 WebClient(透過 Reactor Netty 或 Jetty)之上,它們都具有完全非阻塞、事件驅動的 HTTP 客戶端。

它公開了 VaultTokenSupplier 作為 VaultToken 的提供者以進行 HTTP 請求身份驗證,以及 ReactiveVaultOperations 作為主要入口點。VaultEndpointClientOptionsSSL 的核心配置在各種客戶端實現中重用。

位於 org.springframework.vault.core 包中的 ReactiveVaultTemplate 類是 Spring 響應式 Vault 支援的核心類,提供豐富的功能集以與 Vault 互動。該模板提供便捷的操作來在 Vault 中讀取、寫入和刪除資料,並提供您的領域物件與 Vault 資料之間的對映。

配置完成後,ReactiveVaultTemplate 是執行緒安全的,可以在多個例項之間重用。

Vault 文件和領域類之間的對映透過委託給 WebClient 及其編解碼器來完成。

ReactiveVaultTemplate 類實現了 ReactiveVaultOperations 介面。儘可能地,ReactiveVaultOperations 上的方法名稱與 Vault API 上可用的方法名稱一致,以便熟悉 API 和 CLI 的現有 Vault 開發人員熟悉該 API。例如,您會找到“write”、“delete”和“read”等方法。設計目標是儘可能簡化 Vault API 和 ReactiveVaultOperations 之間的轉換。這兩個 API 之間的主要區別在於 ReactiveVaultOperations 可以傳遞領域物件而不是 JSON 鍵值對。

ReactiveVaultTemplate(以及可從其訪問的介面)中使用的路徑被認為是相對於 VaultEndpoint 的。完全限定的 URI 路徑可用於在已認證的上下文中訪問 Vault 叢集成員。為防止不必要的完整 URI 訪問,請確保在將路徑傳遞給 ReactiveVaultTemplate 之前對其進行清理。

引用 ReactiveVaultTemplate 例項操作的首選方式是透過其介面 ReactiveVaultOperations

ReactiveVaultTemplate 未明確暴露的功能,您可以使用幾種 execute 回撥方法之一來訪問底層 API。execute 回撥將為您提供一個 WebClient 物件的引用。有關更多資訊,請參閱執行回撥部分。

現在,讓我們看一些如何在 Spring 容器中使用 Vault 的示例。

註冊和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring 上下文。然而,在託管上下文中註冊的 ReactiveVaultTemplateVaultTokenSupplier 例項將參與 Spring IoC 容器提供的生命週期事件。這對於在應用程式關閉時處置活動的 Vault 會話非常有用。您還可以從在整個應用程式中重用相同的 ReactiveVaultTemplate 例項中受益。

Spring Vault 附帶了一個支援配置類,該類提供用於 Spring 上下文的 bean 定義。應用程式配置類通常繼承自 AbstractVaultConfiguration,並且需要提供特定於環境的附加詳細資訊。

繼承自 AbstractVaultConfiguration 需要實現 `VaultEndpoint vaultEndpoint()` 和 ClientAuthentication clientAuthentication() 方法。

示例 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 建立一個新的 VaultEndpoint,它預設指向 https://:8200
2 此示例使用 TokenAuthentication 以快速入門。有關支援的身份驗證方法的詳細資訊,請參閱 [vault.core.authentication]

會話管理

Spring Vault 需要一個令牌來驗證 Vault 請求。有關身份驗證的詳細資訊,請參閱 [vault.core.authentication]。響應式客戶端需要一個非阻塞令牌提供者,其契約在 VaultTokenSupplier 中定義。令牌可以是靜態的,也可以透過宣告的身份驗證流程獲取。Vault 登入不應在每次經過身份驗證的 Vault 互動時都發生,而應將會話令牌保持在整個會話中。這方面由實現 ReactiveSessionManager 的會話管理器處理,例如 ReactiveLifecycleAwareSessionManager

執行回撥

所有 Spring 模板類的一個共同設計特點是,所有功能都透過其中一個模板的執行回撥方法進行路由。這有助於確保一致地執行異常處理和可能需要的任何資源管理。雖然這在 JDBC 和 JMS 的情況下比 Vault 更需要,但它仍然為訪問和日誌記錄提供了一個單一的入口點。因此,使用執行回撥是訪問 Vault API 以執行我們未在 ReactiveVaultTemplate 上作為方法公開的不常見操作的首選方式。

以下是執行回撥方法的列表。

  • <T> T doWithVault (Function<WebClient, ? extends T> clientCallback) 使用給定的 WebClient 組合響應式序列,允許在沒有會話上下文的情況下與 Vault 互動。

  • <T> T doWithSession (Function<WebClient, ? extends T> clientCallback) 使用給定的 WebClient 組合響應式序列,允許在已認證的會話中與 Vault 互動。

這是一個使用回撥初始化 Vault 的示例

reactiveVaultOperations.doWithVault(webClient -> {

    return webClient.put()
                    .uri("/sys/init")
                    .syncBody(request)
                    .retrieve()
                    .toEntity(VaultInitializationResponse.class);
});
© . This site is unofficial and not affiliated with VMware.