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

banq發表於2019-10-26

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統一性,在複雜事件處理中,對事件融合的評估和計算通常需要檢視事件流,而不是單個事件。

有關最新資訊,請閱讀使用者指南中的“ 具有多個輸入和輸出引數的函式”部分

相關文章