Spring Cloud Stream-功能和反应
在上一篇文章中 ,我试图为我们转向Spring Cloud Stream (SCSt)中的功能编程模型提供理由。更少的代码 , 更少的配置 。不过,最重要的是,您的代码是完全分离的,并且与SCSt的内部结构无关。
在本文中,我将进行更深入的探讨并总结功能支持的核心功能,尤其是围绕其响应功能。
重要提示: 您可以做的任何事情
@StreamListener/@EnableBinding
您也可以不用它。换句话说,功能支持现在与基于注释的支持在功能上兼容。
尽管下面描述的所有功能都是SCSt的依赖项Spring Cloud Function (SCF)的功能 ,但是在理解SCSt上下文中功能的附加含义时,您必须意识到某些细微差别。
供应商,职能和消费者
任何类型的 bean Supplier
, Function
, 要么Consumer
或任何可以映射到的bean Supplier
, Function
, 要么Consumer
(例如POJO函数,Kotlin lambdas等)被SCSt视为消息处理程序 ( Function
要么Consumer
)或消息来源 ( Supplier
)。根据使用的功能策略的类型,使用以下命名约定自动生成输入和输出绑定
。
考虑以下示例:
@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
。
单击此处了解更多详细信息和配置选项。
命令式或反应式
功能可以是命令 性的也可以是反应性的 。命令式函数在每个单独的事件上触发,而反应式函数仅触发一次,将引用传递给整个事件流抽象(例如Flux
和Mono
)由Project Reactor提供。
请考虑以下示例:
当务之急:
@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库。元组通过向我们传达基数和类型信息而给我们带来了独特的优势。两者对于SCSt而言都是极其重要的。基数让我们知道需要创建多少个输入和输出绑定并将其绑定到一个函数的相应输入和输出。知道类型信息可确保正确的类型转换。
同样,这是绑定名称命名约定的“索引”部分起作用的地方,因为在此函数中,两个输出绑定名称是organise-out-0
和organise-out-1
。
重要提示:目前,仅对反应式功能(
Function
)以复杂事件处理为中心,其中对事件融合的评估和计算通常需要查看事件流,而不是单个事件。...>, TupleN ...>>
有关最新信息,请阅读用户指南中的“ 具有多个输入和输出参数的函数”部分。