Spring Cloud Stream 應用程式的 Java 函式介紹 - 第 0 部分

版本釋出 | David Turanski | 2020年7月13日 | ...

我們很高興地宣佈釋出 Spring Cloud Stream applications 2020.0.0-M2。該版本是對遺留的 Spring Cloud Stream App Starters 的全面改造。從此版本開始,我們不再使用基於主題的版本列車名稱(按字母順序排列的著名科學家),而是轉向基於日曆的版本控制。當前的 GA 版本稱為 Einstein,我們很高興推出 2020.0.0-M2。我們也在棄用 app starters。在重組、重新打包並(在某些情況下)重寫底層程式碼後,我們現在有了新的 Git 倉庫: spring-cloud/stream-applications: Functions and Spring Cloud Stream Applications for data driven microservices

我們是怎麼走到這一步的?

自 2016 年 Spring Cloud Data Flow 誕生以來,Spring 團隊一直維護基於 Spring Cloud Stream 的預打包應用程式。這些是生產就緒的應用程式,建立在 Spring 和 Spring Integration 的成熟能力之上,可提供與常用開源資料儲存、訊息代理、線上服務和通訊協議的開箱即用整合。實際上,我們提供用於企業開發人員構建關鍵業務系統的底層元件已經有十多年了。下面的時間表總結了從 Spring Integration 元件到預打包應用程式的演變過程。

Stream Applications Timeline

這些應用程式讓您在使用 Data Flow 編排資料流管道或直接將它們用作資料微服務時可以快速啟動。一如既往,秉承 Spring 的理念,我們為您承擔繁重的工作,讓您專注於業務邏輯。

其核心是,Spring Cloud Stream 應用程式是一個 Spring Boot 應用程式 (uber jar),它包含 Spring Cloud Stream binder 依賴。binder 暴露了一個服務提供者介面,用於抽象那些利用底層訊息中介軟體(例如 Apache Kafka、RabbitMQ、Amazon Kinesis、Google Pub Sub 和 Solace)進行分散式通訊的實現,從而對應用程式隱藏中介軟體的具體細節。因此,應用程式不知道它用於通訊的底層中介軟體是什麼。

這種架構使我們能夠實現核心功能而無需 binder,形式為 Spring Cloud Stream App Starters。我們使用了一個定製的 Maven 外掛來生成 Maven pom 檔案(Apache Kafka binder 和 RabbitMQ binder 各一個),以及一個匯入 app starter 配置的通用 Spring Boot main 類。該 pom 檔案還包括 監控 和安全支援。預打包的 stream 應用程式可與 Apache Kafka 或 RabbitMQ 一起使用,並作為 Spring Boot 可執行 jar 和 Docker 映象釋出到公共倉庫。

在許多方面,預打包的 stream 應用程式可以與 Kafka Connect 相媲美。雖然這不是直接的“蘋果對蘋果”比較,但 stream 應用程式可以用來替代 Kafka Connect 應用程式。Kafka Connect 應用程式需要 Apache Kafka 來生產和消費資料,而 Spring Cloud Stream 應用程式則可以使用各種中介軟體技術,包括前面提到的 Kafka。請注意,我們所有的預打包應用程式都是免費和開源的,而許多 Kafka connector 則需要商業許可。

有什麼變化?

Java 函式

Java 和 Spring 生態系統的不斷進步促使我們重新思考我們的方法。最顯著的變化是我們實現了一種分層架構,其中以前由 app starters 提供的核心功能現在作為 Java 函式提供,實現了 java.util.function 包中的標準介面。

此版本中的函式式元件可以作為標準的 Spring bean 暴露,然後透過直接將其嵌入到應用程式中來滿足您的資料整合需求。透過在自定義應用程式中注入這些函式,您可以立即受益於底層庫提供的功能。例如,其中許多函式都使用了 Spring Integration 介面卡。您可以直接呼叫該函式,使用 Spring Cloud Function 透過 REST 端點呼叫它,或在無伺服器環境中使用它。與 app starters 不同,函式式元件不依賴於 Spring Cloud Stream。然而,它們現在是 stream 應用程式的核心元件。下圖展示了元件和應用程式之間的關係

Stream Applications Layered Architecture

Stream 應用程式

透過使用 Spring Cloud Stream,我們可以利用 java.util.function 型別(Supplier、Function、Consumer)與 Spring Cloud Stream 概念(分別為 source、processor 和 sink)的邏輯等價性。像以前一樣,我們使用新的改進的 Maven 外掛 來生成 Spring Boot main 類、application.properties 檔案以及具有內建 監控 和安全支援的特定於 binder 的 Maven pom。除少數例外,我們無需額外程式碼即可構建 Spring Cloud Stream 應用程式。

新方法具有以下幾個優勢

  • Spring Cloud Stream v3.x 引入了一個基於 Spring Cloud Function 的強大函數語言程式設計模型。這種方法優於遺留的基於註解的模型(@EnableBinding, @StreamListener)。Spring Cloud Stream 可以直接繫結到 Function @Bean 的輸入和輸出。使用此模型,既不需要遺留的 Spring Cloud Stream 註解,也不需要 Source、Processor 和 Sink 介面。

下圖透過使用打包為 Spring Cloud Stream 應用程式的簡單函式來說明此概念。binder 實現和外部配置屬性使應用程式能夠透過訊息代理進行通訊,但應用程式程式碼不關心這些細節。Spring Cloud Stream 會在 time 主題收到訊息時呼叫 ProcessorApplication 中的 helloTime 函式,並將其輸出定向到 hello 主題。同樣,SinkApplication 中的 printTime Consumer 會在 hello 主題收到訊息時觸發。但是是什麼觸發 SourceApplication 呢?您可能已經猜到了,Spring Cloud Stream 會自動配置一個輪詢器 (poller),預設情況下每秒呼叫一次 currentTime Supplier。當然,這是可配置的。

Spring Cloud Stream Example

  • 函式式元件可以打包並部署到 Spring Cloud Stream 之外的廣泛用途中,尤其是在 FaaS 環境中。

  • 函式式元件在適當的地方使用 Project Reactor 構建,以實現非阻塞的響應式流。

  • stream 應用程式(或任何使用函式式元件構建的 Spring Boot 應用程式)可以利用 Spring Cloud Function 的宣告式函式組合功能。這意味著預打包的 stream 應用程式可以配置執行常見的轉換和過濾操作,無需進行任何定製。

  • 新的 stream-applications Git 倉庫是一個 monorepo。與 stream-cloud-app-starters 不同,後者每個應用程式都有自己的倉庫,新的 stream-applications 倉庫將所有內容(函式、應用程式和通用元件)包含在一個倉庫中。這簡化了依賴管理並允許原子提交。希望這一變化以及其他正在進行的努力能夠讓開發人員更容易使用,並鼓勵社群貢獻。

此版本包含什麼?

以下是此版本中提供的各種函式和應用程式的部分列表

  • 供應商和來源 (Suppliers and sources): File, FTP, SFTP, AWS S3, HTTP, Geode, TCP, TIme, Twitter, Websocket, JDBC, JMS, RabbitMQ, MQTT。

  • 消費者和接收器 (Consumers and sinks): Analytics, Cassandra, File, FTP, Geode, JDBC, Log, Mongodb, MQTT, Rabbit, Redis, AWS S3, SFTP, TCP, Twitter, Wavefront, Websocket。

  • 函式和處理器 (Functions and processors): Filter, Header Enricher, HTTP Request, Tensorflow (影像識別、物件檢測和語義分割), SpEL, Splitter, Task Launch Request, Task Launcher, Twitter。

檢視完整的列表,請參考 Stream Applications README

這對現有使用者意味著什麼?

在許多情況下,新應用程式提供的功能與先前版本相當。在某些情況下(例如 Twitter),我們顯著增強了功能。我們還合併並重命名了一些應用程式。簡而言之,存在一些破壞性更改。值得注意的是,許多配置屬性名稱已根據需要更改,以反映與函式式元件的關聯(例如,s3.supplier.remoteDir)。此外,這些應用程式可能無法與使用舊版本 Spring Cloud Stream 構建的 stream 應用程式一起使用。例如,使用舊版本 Spring Cloud Stream 構建的 source 不能保證與此版本中的 sink 一起工作。如果您正在使用先前版本中的預打包應用程式,則無需立即升級,除非您被迫利用一些新功能。Einstein 版本列車將進入維護模式,因此今後只包含錯誤修復。所有新開發都將應用於未來的版本。

如何貢獻新的函式或應用程式?

如果您在現有的函式和應用程式目錄中找不到所需的內容,請考慮 貢獻。這樣,整個開源社群都會受益。在後續文章中,我們將透過一個開發函式和 stream 應用程式的真實世界示例進行講解。

我們鼓勵社群參與此專案。我們有幾個標記為 適合貢獻 的開放議題。除了程式碼貢獻,我們也非常感謝文件改進、建立議題以及給倉庫加星標。

敬請關注…​

這篇部落格是每週系列文章的第一篇,該系列將更詳細地介紹此處引入的主題。在接下來的幾周內,請期待更多的深度探討和專題文章。我們將帶您瞭解此倉庫中包含的元件及其相關流程的整體情況。

Spring Cloud Stream 應用程式的 Java 函式介紹 - 第 1 部分

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您飛速前進。

瞭解更多

獲取支援

Tanzu Spring 透過一個簡單的訂閱提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉辦的活動

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

檢視全部