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 https://: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 社群所有即將舉行的活動。

檢視全部