127. 功能目录和灵活的功能签名

Spring Cloud Function 的主要功能之一是为用户定义的函数适应和支持各种类型签名,同时提供一致的执行模型。这就是为什么使用Project Reactor定义的 Primitives(即Flux<T>Mono<T>)将所有用户定义的函数通过FunctionCatalog转换为规范表示的原因。例如,用户可以提供类型为Function<String,String>的 bean,而FunctionCatalog会将其包装为Function<Flux<String>,Flux<String>>

使用基于 Reactor 的 Primitives 不仅有助于用户定义函数的规范表示,而且还有助于构建更健壮和灵活的(Reactive)执行模型。

尽管用户通常根本不需要关心FunctionCatalog,但了解用户代码支持哪些功能很有用。

127.1 Java 8 功能支持

一般而言,用户可以期望,如果他们为普通的旧 Java 类型(或原始包装器)编写函数,则函数目录会将其包装为相同类型的Flux。如果用户使用Message(通过 spring-messaging)编写函数,则它将从支持键值元数据的任何适配器接收和传输 Headers(例如 HTTPHeaders)。这是详细信息。

User FunctionCatalog Registration
Function<S,T>Function<Flux<S>, Flux<T>>
Function<Message<S>,Message<T>>Function<Flux<Message<S>>, Flux<Message<T>>>
Function<Flux<S>, Flux<T>>Function<Flux<S>, Flux<T>>(通过)
Supplier<T>Supplier<Flux<T>>
Supplier<Flux<T>>Supplier<Flux<T>>
Consumer<T>Function<Flux<T>, Mono<Void>>
Consumer<Message<T>>Function<Flux<Message<T>>, Mono<Void>>
Consumer<Flux<T>>Consumer<Flux<T>>

Consumer 有点特殊,因为它具有void返回类型,这意味着至少有可能阻塞。最有可能您不需要写Consumer<Flux<?>>,但是如果确实需要这样做,请记住订阅 Importing 流量。如果声明非发布者类型的Consumer(这是正常的),它将被转换为返回发布者的函数,以便可以通过受控方式进行订阅。

127.2 Kotlin Lambda 支持

我们还为 Kotlin lambdas(自 v2.0 起)提供支持。考虑以下:

@Bean
open fun kotlinSupplier(): () -> String {
    return  { "Hello from Kotlin" }
}

@Bean
open fun kotlinFunction(): (String) -> String {
    return  { it.toUpperCase() }
}

@Bean
open fun kotlinConsumer(): (String) -> Unit {
    return  { println(it) }
}

上面代表配置为 Spring bean 的 Kotlin lambda。每个签名都 Map 到 Java 等效的SupplierFunctionConsumer,因此框架支持/识别了签名。尽管 Kotlin 到 Java 的 Map 机制不在本文档的讨论范围之内,但重要的是要了解,此处也适用“ Java 8 函数支持”部分中概述的相同的签名转换规则。

要启用 Kotlin 支持,您所需要做的就是将spring-cloud-function-kotlin模块添加到您的 Classpath 中,其中包含适当的自动配置和支持类。