Spring Cloud Function 3.2 发布啦!

工程 | Oleg Zhurakousky | 2021 年 12 月 02 日 | ...

Spring Cloud 2021.0.0 终于发布了,随之而来的是 Spring Cloud Function 3.2

虽然完整的功能、增强和错误修复列表可在此处查看,但我想在这篇文章中重点介绍其中几个并提供一些详细信息。

gRPC 支持

除了已经支持通过 AWS LambdaRSocketSpring Cloud Stream 等方式调用函数之外,Spring Cloud Function 现在还允许您通过 gRPC 调用函数。有两种方式可以从中受益。

Spring Message

鉴于 Spring Messaging 的广泛应用,受益于 gRPC 支持的一种方式是采用 Spring 的 Message。Spring Cloud Function 提供了仿照 Spring Message 建模的 GrpcSpringMessage 模式。它在内部被转换为 Spring Message,以便利用 Spring Messaging 的所有现有支持。

message GrpcSpringMessage {
    bytes payload = 1;
    map<string, string> headers = 2;
}

它还定义了一个 MessagingService,公开了您可以选择的四种交互模型

service MessagingService {
    rpc biStream(stream GrpcSpringMessage) returns (stream GrpcSpringMessage);
    
    rpc clientStream(stream GrpcSpringMessage) returns (GrpcSpringMessage);
    
    rpc serverStream(GrpcSpringMessage) returns (stream GrpcSpringMessage);
    
    rpc requestReply(GrpcSpringMessage) returns (GrpcSpringMessage);
}

这两者都允许您生成所需的存根,以便在与 Spring 应用程序上下文托管的函数交互时支持 gRPC 的真正多语言特性。

这是一个快速示例

假设您的 classpath 中有 spring-cloud-function-grpc,这里是您最简单的应用程序上下文配置

@Configuration
public static class SampleConfiguration {
    public static void main(String[] args) {
       SpringApplication.run(SampleConfiguration.class, args);
    }     
    @Bean
    public Function<String, String> uppercase() {
        return v -> v.toUpperCase();
    }
}

(注意,上面代码中的任何内容都与 gRPC 没有任何关系,它只是一个带有函数 bean 的标准 Spring-Boot 应用程序 - 这正是 Spring Cloud Function 的真正价值所在)

以及通过 gRPC 调用它的其中一种方式的示例

Message<byte[]> message = MessageBuilder.withPayload("\"hello gRPC\"".getBytes())
            .setHeader("foo", "bar")
            .build();
Message<byte[]> reply = GrpcUtils.requestReply(message);

Protobuf 扩展

虽然核心数据对象及其相应的模式是仿照 Spring Message 建模的,并且几乎可以表示任何对象,但在某些时候您可能希望插入自己的模式和 protobuf 服务。Spring Cloud Function 通过允许您开发自己的 protobuf 扩展来支持这一点。这样的扩展只是另一个依赖于 spring-cloud-function-grpc 的 spring-boot 项目,并且必须提供 protoc 生成的工件,包括 io.grpc.BindableService 的实现和您的消息模式的 MessageConverter 实现。Spring Cloud Function 将负责其余部分。事实上,我们已经为 CloudEvents 提供了一个开箱即用的此类扩展。

更多详细信息可在此处查看

增强的 CloudEvents 支持

说到 CloudEvents... 在 3.1 版本中,我们引入了对 CloudEvents 的支持,您可以阅读关于此主题的博客文章第一部分第二部分。此版本包含一些额外的增强和错误修复,以及通过与 CloudEvents Java SDK 集成支持 io.cloudevents.CloudEvent 类型。为了结合 gRPC 和 CloudEvents,我们还提供了一个专门的示例,演示了通过 gRPC 进行 CloudEvents 交互。

FunctionCatalog 的 Actuator 端点

到目前为止,您应该已经对 FunctionCatalog 作为 Spring Cloud Function 的核心组件之一非常熟悉了。但到目前为止,与其交互的唯一方式是通过直接引用。在此版本中,我们公开了一个 actuator 端点,允许您通过 http://<host>:<port>/actuator/functions URL 访问它。例如,在启用 functions 端点后,您可以

curl http://localhost:8080/actuator/functions

. . .查看显示您的 FunctionCatalog 内容的输出,它应该看起来像这样

{"charCounter":
	{"type":"FUNCTION","input-type":"string","output-type":"integer"},
 "logger":
 	{"type":"CONSUMER","input-type":"string"},
 "functionRouter":
 	{"type":"FUNCTION","input-type":"object","output-type":"object"},
 "words":
 	{"type":"SUPPLIER","output-type":"string"}. . .

AWS - API Gateway v2、改进的 Custom Runtime 和 Native images 支持

API Gateway v2

使用 Spring Cloud Function AWS 集成的一些用户已经知道,在 3.1.x 版本中,我们已经迁移到通过 org.springframework.cloud.function.adapter.aws.FunctionInvoker 实现的单个 AWS handler 模型,以支持多种 AWS 事件。这种方法的主要优点是您不再需要提供 AWS Handler 的最小实现(例如 RequestHandlerRequestStreamHandler 等)。您所需要做的就是像通常一样实现您的函数,并在将其部署到 AWS 时将 org.springframework.cloud.function.adapter.aws.FunctionInvoker 指定为 handler(更多详细信息请参阅入门指南)。但多种并不意味着所有,在此版本中,我们增加了一些额外的事件支持,特别是 APIGatewayV2HTTPEventAPIGatewayV2HTTPResponse

AWS Custom Runtime

虽然主要是内部改进,最终用户不直接可见,但值得一提的是,对现有 AWS Custom Runtime 支持进行了额外改进,该支持现在依赖于框架提供的事件循环。

Spring Native

最后但同样重要的是,为了支持 Spring Native initiative,我们进行了多项改进。为此,我们很高兴能够展示几个 AWS 示例(此处此处),您可以轻松地将它们编译为原生镜像并部署到 AWS,从而看到显著的性能提升。有关 AWS 和 Spring Native 的更多详细信息,您可以观看此 Spring One 演示

问题 - https://stackoverflow.com/questions/tagged/spring-cloud-function 问题追踪 - https://github.com/spring-cloud/spring-cloud-function/issues

订阅 Spring 新闻通讯

保持与 Spring 新闻通讯的连接

订阅

抢占先机

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部