領先一步
VMware 提供培訓和認證,助你快速進步。
瞭解更多這是系列部落格文章的第一篇,旨在闡明和預覽即將釋出的 spring-cloud-stream 和 spring-cloud-function (都是 3.0.0) 版本中的新內容。
最近,我與一位使用者進行了討論,聽到了一些話促使我開始撰寫一系列部落格文章(從這篇開始),目的是揭示 Spring Cloud Stream 和 Spring Cloud Function 專案的真正目標,並展示它們的新特性。
引發這一切的具體說法是——“Spring Cloud Stream,是一個輕量級的 Spring Integration 輸入/輸出路由器……”。這是一個有趣的看法,但我不得不表示異議。雖然它可能受到了企業整合模式 (EIP) 的啟發,並且構建在 Spring Integration (SI) 之上,但後一部分實際上只是實現細節。Spring Cloud Stream (SCSt) 作為一個框架,從來就不是關於“作為一個輕量級的 Spring Integration 輸入/輸出路由器”。事實上,這個說法揭示了問題的一部分,即 SI(作為支援 SCSt 一些內部需求的框架選擇) somehow 被認為是 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 對齊的、有明確立場(opinionated)的模型,該模型具有清晰文件記錄且直觀的約定,並且對使用者所需的開箱即用配置有限。
有關 spring-cloud-stream 中函式支援的最新資訊,請參閱此連結。
歡迎隨時提供反饋。