Spring Cloud Stream - 去神秘化與簡化

工程 | Oleg Zhurakousky | 2019年10月14日 | ...

這是系列部落格文章中的第一篇,旨在澄清並預覽 spring-cloud-streamspring-cloud-function 即將釋出的版本(均為 3.0.0)中的內容。

最近,我與一位使用者進行了一次討論,聽到了一些事情,促使我開始一系列部落格文章(從這篇開始),旨在揭開 Spring Cloud StreamSpring Cloud Function 專案的真正目標,並展示它們的新特性。

Spring Integration 包裝器?

促成這一切的具體說法是——“Spring Cloud Stream,作為一個輕量級的 Spring Integration 輸入/輸出路由器……”。這是一個有趣的看法,但我不得不提出異議。雖然它可能受到了企業整合模式(EIP)的啟發,並建立在 Spring Integration(SI)之上,但後半部分真的只是一個實現細節。Spring Cloud Stream(SCSt)作為一個框架,從來都不是為了“成為一個輕量級的 Spring Integration 輸入/輸出路由器”。事實上,這個說法揭示了部分問題,即 SI(為了支援 SCSt 的一些內部需求而選擇的框架)不知何故被認為是 SCSt 的核心,以至於許多人認為 SCSt 是 SI 的一個擴充套件或包裝器。它不是。它一直以來都是關於純粹的微服務,並將它們繫結到資料目標(即訊息系統)。就這麼簡單。如果你從足夠遠的距離抽象自己,不去了解 SCSt 的內部實現,你會很快意識到它實際上是一個繫結和啟用框架。它將一段程式碼(由使用者提供)繫結到由繫結器暴露的資料來源/目標,並根據繫結器實現(例如,訊息到達等)啟用該程式碼。基本上就是這樣。

是函式,還是不函式?

從歷史上看,Spring Cloud Stream 暴露了一個基於註解的配置模型,要求使用者提供大量本可以輕鬆推斷的資訊,從而簡化配置。

讓我們看以下兩個程式碼片段

基於註解

@SpringBootApplication
@EnableBinding(Processor.class)
public class SampleApplication  {
    @StreamListener(Processor.INPUT)
    @SendTo(Processor.OUTPUT)
    public String uppercase(String value) {
        return value.toUpperCase();
    }
}

基於函式(自 v2.1.0 起)

@SpringBootApplication
public class SampleApplication  {
    @Bean
    public Function<String, String> uppercase() {
        return value -> value.toUpperCase();
    }
}

兩者都是有效且功能齊全的 SCSt 應用程式。兩者都做同樣的事情併產生相同的結果——不同之處在於,在基於註解的示例中,使用者必須瞭解 SCSt 抽象(即訊息傳遞、通道、繫結等),而實際使用者程式碼與它們中的任何一個都無關。這引發了一個問題:為什麼?Spring 一直以來都是關於“你擔心功能需求,我們負責非功能性(樣板程式碼)”。因此,在 SCSt 作為一個框架及其“繫結和啟用/觸發”的核心目標的背景下,我們很快意識到這些抽象是樣板程式碼,不應洩露到使用者程式碼中,尤其是以註解的形式,因為它們無故導致了此類程式碼對 SCSt 的二進位制依賴。此外,鑑於 Spring 組合中大多數新框架的基礎是 Spring Boot,請思考 Spring Boot 的核心資訊——依賴項(例如 JAR)包含自動配置,這實際上是關於我們(Spring)認為事物應該如何運作的觀點,同時為你提供選擇退出的方式。因此,在這種情況下,為什麼你需要提供如此多的指令,特別是透過註解(EnableBinding、Processor、StreamListener 等),而人們只需遵循一些約定就可以輕鬆提取或推斷出相同的資訊(在 SCSt 的上下文中)。例如,SCSt 上下文中的函式 bean 是一個處理器。我們知道處理器只有一個輸入目標和一個輸出,並且我們知道它們的名稱,那麼為什麼我們需要明確說明已知和顯而易見的東西呢?等等……此外,請記住,在推匯出所有這些的同時,我們仍然保留了現有消費者和生產者屬性以及所有其他配置選項的使用。它們仍然適用於此處,讓你能夠像使用 StreamListener 一樣配置和重新配置相同的事物。

因此,我也想說,我們正在開始緩慢地從基於註解的程式設計模型轉向更敏捷、更簡單、更符合 Spring Boot 的、具有明確文件和直觀約定的、且使用者只需少量開箱即用配置的“有主見”模型。

有關 spring-cloud-stream 中功能支援的最新資訊,請關注此連結

歡迎提供任何反饋。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有