什么是Spring Cloud Stream
Spring Cloud Stream 是一個用來為微服務應用構建消息驅動能力的框架懦冰。它可以基于Spring Boot 來創(chuàng)建獨立的,可用于生產的Spring 應用程序。他通過使用Spring Integration來連接消息代理中間件以實現(xiàn)消息事件驅動妥畏。Spring Cloud Stream 為一些供應商的消息中間件產品提供了個性化的自動化配置實現(xiàn)寡键,引用了發(fā)布-訂閱、消費組懒熙、分區(qū)的三個核心概念昼弟。目前僅支持RabbitMQ啤它、Kafka。
企業(yè)應用集成(EAI)
企業(yè)應用集成(EAI)是集成應用之間數(shù)據和服務的一種應用技術。四種集成風格:
- 文件傳輸:兩個系統(tǒng)生成文件变骡,文件的有效負載就是由另一個系統(tǒng)處理的消息救欧。該類風格的例子之一是針對文件輪詢目錄或FTP目錄,并處理該文件锣光。
- 共享數(shù)據庫:兩個系統(tǒng)查詢同一個數(shù)據庫以獲取要傳遞的數(shù)據。一個例子是你部署了兩個EAR應用铝耻,它們的實體類(JPA誊爹、Hibernate等)共用同一個表。
- 遠程過程調用:兩個系統(tǒng)都暴露另一個能調用的服務瓢捉。該類例子有EJB服務频丘,或SOAP和REST服務。
- 消息:兩個系統(tǒng)連接到一個公用的消息系統(tǒng)泡态,互相交換數(shù)據搂漠,并利用消息調用行為。該風格的例子就是眾所周知的中心輻射式的(hub-and-spoke)JMS架構某弦。
Spring Integration作為一種企業(yè)級集成框架桐汤,遵從現(xiàn)代經典書籍《企業(yè)集成模式》,為開發(fā)者提供了一種便捷的實現(xiàn)模式靶壮。Spring Integration構建在Spring控制反轉設計模式之上怔毛,抽象了消息源和目標,利用消息傳送和消息操作來集成應用環(huán)境下的各種組件腾降。消息和集成關注點都被框架處理拣度,所以業(yè)務組件能更好地與基礎設施隔離,從而降低開發(fā)者所要面對的復雜的集成職責螃壤。
核心概念
應用模型
Spring Cloud Stream由一個中間件中立的核組成抗果。應用通過Spring Cloud Stream插入的input和output通道與外界交流。通道通過指定中間件的Binder實現(xiàn)與外部代理連接奸晴。
業(yè)務開發(fā)者不再關注具體消息中間件冤馏,只需關注Binder對應用程序提供的抽象概念來使用消息中間件實現(xiàn)業(yè)務即可。
綁定器(Binder)
通過定義綁定器作為中間層寄啼,實現(xiàn)了應用程序與消息中間件細節(jié)之間的隔離宿接。通過向應用程序暴露統(tǒng)一的Channel,使得應用程序不需要再考慮各種不同的消息中間件的實現(xiàn)辕录。當需要升級消息中間件睦霎,或者是更換其他消息中間件產品時,我們需要做的就是更換對應的Binder綁定器而不需要修改任何應用邏輯 走诞。
目前只提供了RabbitMQ和Kafka的Binder實現(xiàn)
發(fā)布-訂閱(Publish-Subscribe)
應用間通信遵照發(fā)布-訂閱模型副女,消息通過共享主題進行廣播。下圖所示蚣旱,顯示了交互的Spring Cloud Stream 應用的典型布局碑幅。
未處理的傳感數(shù)據發(fā)布到raw-sensor-data的Topic進行廣播戴陡,Averages 和IngestHDFS同時訂閱了此消息,收到消息后觸發(fā)自身的處理邏輯沟涨。
Topic可能對應不同的概念恤批,在RabbitMQ表示的是Exchange,Kafka中對應Topic
消費組(Consumer Groups)
由于發(fā)布-訂閱模型使得共享主題的應用之間連接更簡便裹赴,創(chuàng)建給定應用的不同實例來進行彈性擴張的能力也同樣重要喜庞。如果存在多個應用實例,那么同一應用的額不同實例便會成為相互競爭的消費者棋返,其中應該只有一個實例處理給定消息延都。
Spring Cloud Stream通過消費者組的概念給這種情況進行建模。每一個單獨的消費者可以使用spring.cloud.stream.bindings.input.group屬性來指定一個組名字睛竣。下圖中展示的消費者們晰房,這一屬性被設置為spring.cloud.stream.bindings.input.group=hdfsWrite或者spring.cloud.stream.bindings.input.group=average。
所有訂閱給定目標的組都會收到發(fā)布消息的一個拷貝射沟,但是每一個組內只有一個成員會收到該消息殊者。默認情況下,如果沒有指定組验夯,Spring Cloud Stream 會將該應用指定給一個匿名的獨立的單成員消費者組幽污,后者與所有其他組都處于一個發(fā)布-訂閱關系中。
目前只提供了RabbitMQ和Kafka的Binder實現(xiàn)
消息分區(qū)
Spring Cloud Stream對給定應用的多個實例之間分隔數(shù)據予以支持簿姨。在分隔方案中距误,物理交流媒介(如:代理主題)被視為分隔成了多個片(partitions)。一個或者多個生產者應用實例給多個消費者應用實例發(fā)送消息并確保相同特征的數(shù)據被同一消費者實例處理扁位。
Spring Cloud Stream對分割的進程實例實現(xiàn)進行了抽象准潭。使得Spring Cloud Stream 為不具備分區(qū)功能的消息中間件(RabbitMQ)也增加了分區(qū)功能擴展。
Durability
消息事件的持久化是必不可少的域仇。Spring Cloud Stream 可以動態(tài)的選擇一個消息隊列是持久化刑然,還是 present。