響應式基礎設施
本節涵蓋使用 Spring Vault 實現響應式程式設計支援的基本資訊。
什麼是響應式程式設計?
簡單來說,響應式程式設計是指非阻塞應用程式,它們是非同步的、事件驅動的,並且需要少量執行緒才能垂直(即在 JVM 內)而不是水平(即透過叢集)擴充套件。
響應式應用程式的一個關鍵方面是背壓的概念,這是一種確保生產者不會壓倒消費者的機制。例如,在一個從資料庫到 HTTP 響應的響應式元件管道中,當 HTTP 連線太慢時,資料儲存庫也可以減慢或完全停止,直到網路容量釋放。
響應式 Vault 客戶端
Spring Vault 的響應式客戶端支援構建在可組合身份驗證步驟和 Spring 的函式式 WebClient(透過 Reactor Netty 或 Jetty)之上,它們都具有完全非阻塞、事件驅動的 HTTP 客戶端。
它公開了 VaultTokenSupplier 作為 VaultToken 的提供者以進行 HTTP 請求身份驗證,以及 ReactiveVaultOperations 作為主要入口點。VaultEndpoint、ClientOptions 和 SSL 的核心配置在各種客戶端實現中重用。
位於 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 上下文。然而,在託管上下文中註冊的 ReactiveVaultTemplate 和 VaultTokenSupplier 例項將參與 Spring IoC 容器提供的生命週期事件。這對於在應用程式關閉時處置活動的 Vault 會話非常有用。您還可以從在整個應用程式中重用相同的 ReactiveVaultTemplate 例項中受益。
Spring Vault 附帶了一個支援配置類,該類提供用於 Spring 上下文的 bean 定義。應用程式配置類通常繼承自 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 | 建立一個新的 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> TdoWithVault(Function<WebClient, ? extends T> clientCallback)使用給定的WebClient組合響應式序列,允許在沒有會話上下文的情況下與 Vault 互動。 -
<T> TdoWithSession(Function<WebClient, ? extends T> clientCallback)使用給定的WebClient組合響應式序列,允許在已認證的會話中與 Vault 互動。
這是一個使用回撥初始化 Vault 的示例
reactiveVaultOperations.doWithVault(webClient -> {
return webClient.put()
.uri("/sys/init")
.syncBody(request)
.retrieve()
.toEntity(VaultInitializationResponse.class);
});