Spring Cloud Stream - 組合函式或 EIP

工程 | Oleg Zhurakousky | 2019 年 11 月 04 日 | ...

為了準備即將發布的 Spring Cloud Stream (SCSt) 3.0.0 - Horsham 和 Spring Cloud Function (SCF) 3.0.0,我們一直在發布一系列文章,討論和展示新功能和增強功能。我們提供了從基於註解的程式設計模型轉向函數式模型的動機和理由,然後我們提供了關於函數式方法以及反應式函式的更多細節。在另一篇文章中,該文章與我們將在此討論的內容相關,Artem 展示了將函數式方法與 Spring Integration 專案結合的好處。我們也在上一篇文章中談到了事件路由

在這篇文章中,我們討論了函數組合和 企業整合模式 (EIP)、它們的共性、它們的差異,以及它們如何在 SCSt 的上下文中相互補充。

「沒有複雜的問題這種東西,因為每個複雜的問題不過是一系列簡單問題的組合。」

函數組合

函數組合是 SCF 的一項功能,可讓您以宣告式方式將多個函數組合在一起。以下範例說明如何執行此操作

--spring.cloud.function.definition=uppercase|reverse

在這裡,我們有效地提供了一個單一函數的定義,它本身是名為 uppercase 的函數和名為 reverse 的函數的組合。您也可以認為我們 *編排* 了一個簡單的管線,該管線包括運行 uppercase 函數,然後將其輸出發送到 reverse 函數。術語 *編排* 在這裡很重要,我們將在文章後面更詳細地介紹它。

企業整合模式 (EIP)

企業整合模式是一組模式,可讓您將業務案例描述為一組明確定義且廣為人知的模式的集合。一些例子是 *filter*、*transformer*、*router* 等。有關 EIP 的更多詳細信息,請參閱 此連結。 Spring 通過 Spring Integration 框架提供了 EIP 的參考實現。例如,通過使用與之前相同的兩個函數範例,我們可以構建一個使用 SI 的 Java DSL 的管線,如下所示

IntegrationFlow.fromChannel(inputChannel)
        .transform(uppercase)
        .transform(reverse);

有關 SI 的 Java DSL 的更多資訊,請參閱 Java DSL 文件 以及此 快速教學

這裡的核心重點是,我們剛剛演示了通過編排管線來解決同一問題的兩種方法。兩者都可以被視為複雜功能的編排者

  • 通過組合進行編排:您得到一個單一函數。
  • 通過委派進行編排:您會得到某種流程。

為什麼這很重要?如前所述,沒有複雜的問題這種東西,因為每個複雜的問題不過是一系列簡單問題的組合。所以複雜性是一種組合。然而,即使是複雜性也可以被視為簡單或複雜的東西。讓我們看幾個用例來設定情境

  • a) 考慮這樣一種情況:您需要計算一些東西 . . . 並將其儲存到資料庫中。
  • b) 考慮另一種情況:您需要計算一些東西,但是,如果缺少某些屬性或未準備好,您需要將其發送回去以獲取更多資訊,然後再次計算(如果已提供足夠的資訊),然後將其儲存到資料庫中。

本著將複雜性分解為簡單性的精神,第一種情況可以分解為序列中的兩個服務:compute -> save(類似於我們之前的 uppercase -> reverse 範例)。第二種情況雖然類似,但包含一個決策點,該決策點可以觸發一個迴圈,其中包含某種類型的額外服務呼叫(等等)。換句話說,它不像簡單的 compute -> save 那樣直接。

Spring Integration 或 Spring Cloud Function 組合?

首先,讓我們快速聲明 EIP 及其實現 Spring Integration 可以輕鬆處理這兩個用例。它們提供

  • 將一個進程的結果按順序交給另一個進程的模式
  • 迴圈的能力
  • 基於某些條件進行路由或過濾
  • 更多選項

另一方面,SCF 及其函數組合功能可以輕鬆處理第一個用例,這是理所當然的。畢竟,compute -> save 是一系列按順序排列的功能的集合 - computeFunction.andThen(saveFunction).andThen(..) 或使用 SCF 表示法 computeFunction | saveFunction。此外,由於 SCF 和 SI 之間的內部實現存在差異,因此使用 SCF 組合顯著更簡單且性能更高。但是,第二個用例(未完全按步驟順序排列)如果不是不可能,則很難通過函數組合實現。在這種情況下,使用像 SI 這樣的框架將是首選選項。

好消息是,當分解後,複雜性仍然可以被實現為可以被 SCF 和 SI 識別為一等公民的函數,如 Artem Bilan 的 這篇文章中所述。這意味著您可以推遲關於您的編排方法的決策,以便稍後選擇 SI 或 SCF 或兩者的組合。

摘要

SCF 組合更適合於編排按順序排列的功能,而 SI 是適合 EIP 類別中所有其他內容的更好選擇。

取得 Spring 電子報

通過 Spring 電子報保持聯繫

訂閱

取得領先

VMware 提供培訓和認證,以加速您的進展。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔。

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部