Spring Cloud Stream的函數式和響應式Reactive編程特點 - spring.io

19-10-26 banq
                   

Spring Cloud Stream(SCSt)的函數式和反應式Reactive編程帶來更少的代碼、更少的配置。不過,最重要的是,您的代碼是完全分離的,并且與SCSt的內部結構無關。

雖然下面描述的所有功能都是SCSt的依賴項Spring Cloud Function(SCF)的functional,但是在理解SCSt上下文中功能的附加含義時,您必須意識到某些細微差別。

供應商,函數和消費者

類型Supplier,?Function, or?Consumer的任何bean或可以映射到它們的任何Bean都可以被SCST視為一個消息處理程序(Function或 Consumer),或者被視為一個消息源(Supplier),根據使用的函數策略類型,使用<function-name>-<in/out>-<index>命名約定自動生成輸入和輸出綁定。

看下面案例:

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

這里的函數被視為一個消息處理程序,該消息處理程序消費來自綁定的uppercase-in-0,結果發送到綁定的uppercase-out-0。其余部分可以像以前一樣使用。例如

--spring.cloud.stream.bindings.uppercase-in-0.content-type=text/plain。

單擊此處了解更多詳細信息和配置選項。

命令式或反應式

函數可以是命令式或反應性。命令式函數在每個單獨的事件上觸發,而反應式函數僅觸發一次,將引用傳遞給Project Reactor提供的整個事件流抽象(例如Flux和Mono)。

命令式:

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

反應性:

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

除了為您提供不同的(單例)編程樣式來處理事件之外,反應式編程還為某些用例增加了附加值,否則實現起來將非常復雜。盡管本文討論這些用例或響應模式超出了討論范圍,但仍然值得一提的是狀態管理用例(例如窗口,聚合和分組)以及拆分流或用例的情況。合并多個流,這將在下一節中討論。

關于反應式功能的綁定和命名規則,它們與上一節中說明的相同。

注意:雖然前面的示例僅Function作為示例,但相同的規則適用于Supplier和Consumer。用戶指南的Spring Cloud Function支持部分以及Reactor文檔提供了更多詳細信息。

函數性

有時需要對數據流進行分類和組織。例如,考慮一個經典的大數據用例,即處理包含“訂單”和“發票”的無組織數據,并且您希望每個都進入一個單獨的數據存儲中。在這里發揮功能支持(具有多個輸入和輸出的功能)的支持。

讓我們看一個這樣的函數的示例(此處提供完整的實現細節):

@Bean
public Function<Flux<Integer>, Tuple2<Flux<String>, Flux<String>>> organise() {
?? ?return flux -> ...;
}

鑒于Project Reactor是SCF的核心依賴項,我們將使用其Tuple庫。Tuple向我們傳達基數cardinality和類型信息而給我們帶來了獨特的優勢。兩者對于SCSt而言都是極其重要的。基數讓我們知道需要創建多少個輸入和輸出綁定并將其綁定到函數的相應輸入和輸出。知道類型信息可確保正確的類型轉換。

同樣,這是綁定名稱命名約定的“索引”部分起作用的地方,因為在此函數中,兩個輸出綁定名稱為organise-out-0和organise-out-1。

重要提示:目前,僅針對Function<TupleN<Flux<?>...>, TupleN<Flux<?>...>>以復雜事件處理為中心的反應性函數()支持functional統一性,在復雜事件處理中,對事件融合的評估和計算通常需要查看事件流,而不是單個事件。

有關最新信息,請閱讀用戶指南中的“?具有多個輸入和輸出參數的函數”部分

                   

美女漫画大全