抢占先机
VMware 提供培训和认证,助您加速进步。
了解更多Spring Cloud 2021.0.0 终于发布了,随之而来的是 Spring Cloud Function 3.2
虽然完整的功能、增强和错误修复列表可在此处查看,但我想在这篇文章中重点介绍其中几个并提供一些详细信息。
除了已经支持通过 AWS Lambda、RSocket、Spring Cloud Stream 等方式调用函数之外,Spring Cloud Function 现在还允许您通过 gRPC 调用函数。有两种方式可以从中受益。
鉴于 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);
虽然核心数据对象及其相应的模式是仿照 Spring Message
建模的,并且几乎可以表示任何对象,但在某些时候您可能希望插入自己的模式和 protobuf 服务。Spring Cloud Function 通过允许您开发自己的 protobuf 扩展来支持这一点。这样的扩展只是另一个依赖于 spring-cloud-function-grpc
的 spring-boot 项目,并且必须提供 protoc
生成的工件,包括 io.grpc.BindableService
的实现和您的消息模式的 MessageConverter
实现。Spring Cloud Function 将负责其余部分。事实上,我们已经为 CloudEvents 提供了一个开箱即用的此类扩展。
更多详细信息可在此处查看
说到 CloudEvents... 在 3.1 版本中,我们引入了对 CloudEvents 的支持,您可以阅读关于此主题的博客文章第一部分和第二部分。此版本包含一些额外的增强和错误修复,以及通过与 CloudEvents Java SDK 集成支持 io.cloudevents.CloudEvent
类型。为了结合 gRPC 和 CloudEvents,我们还提供了一个专门的示例,演示了通过 gRPC 进行 CloudEvents 交互。
到目前为止,您应该已经对 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"}. . .
使用 Spring Cloud Function AWS 集成的一些用户已经知道,在 3.1.x 版本中,我们已经迁移到通过 org.springframework.cloud.function.adapter.aws.FunctionInvoker
实现的单个 AWS handler 模型,以支持多种 AWS 事件。这种方法的主要优点是您不再需要提供 AWS Handler 的最小实现(例如 RequestHandler
或 RequestStreamHandler
等)。您所需要做的就是像通常一样实现您的函数,并在将其部署到 AWS 时将 org.springframework.cloud.function.adapter.aws.FunctionInvoker
指定为 handler(更多详细信息请参阅入门指南)。但多种并不意味着所有,在此版本中,我们增加了一些额外的事件支持,特别是 APIGatewayV2HTTPEvent
和 APIGatewayV2HTTPResponse
。
虽然主要是内部改进,最终用户不直接可见,但值得一提的是,对现有 AWS Custom Runtime 支持进行了额外改进,该支持现在依赖于框架提供的事件循环。
最后但同样重要的是,为了支持 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