Spring gRPC 0.4.0 帶來巨大便利!

工程 | Josh Long | 2025年3月4日 | ...

注意:您可以在這裡找到本部落格的工作程式碼

備受矚目(儘管仍處於實驗階段)的 Spring gRPC 專案釋出了新版本:0.4.0。我不會深入探討所有新功能,但我只想強調我使用它時是多麼興奮,並將引導您一步步走向 gRPC 的樂趣。無數細微之處都恰到好處,使其成為我使用 gRPC 以來最流暢的體驗!

我訪問了Spring Initializr,並選擇了 GRPCGraalVMWeb。我喜歡 Maven,但您可以隨心所欲。我當然選擇了 Java 23,因為 Java 24 即將在一兩週內釋出。我認為這篇部落格在至少幾周內仍會很有趣。具體來說,我正在使用 GraalVM,它是一個 OpenJDK 發行版,支援一些額外的“花招”,包括將 JVM 程式碼編譯成作業系統和架構特定的原生代碼。

如果您使用的是與 UNIX 相容的作業系統(Windows 上的 Cygwin 和適用於 Linux 的 Windows 子系統也算),那麼您可以嘗試使用 SDKMAN 來安裝和管理您的 JDK 版本。我是這樣做的:

sdk install java 23.0.2-graalce  

現在,再次提醒:這是 Java 23。Java 24 定於 2025 年 3 月中旬釋出!不要掉隊。你肯定不想在聚會上被人嘲笑和指指點點吧?升級!

Spring 已經為我們考慮周全了!Spring Initializr 洞察到我正在使用 Servlet 引擎,於是添加了 Spring gRPC、Spring Boot 的 web 支援,以及允許您在 Servlet 容器中託管 gRPC 的橋接器。(預設情況下,Spring gRPC 透過 Netty 執行 gRPC,沒有 HTTP 基礎。)哦,而且它還為我們選擇了 HTTP/2!

Spring Initializr 非常貼心地配置了必要的外掛,用於進行程式碼生成,將 gRPC 協議緩衝區定義轉換為我們可以實現的 Java 程式碼。看到我說方便是什麼意思了嗎?我們甚至還沒有開始編寫程式碼,但我們可以了!

編寫任何 gRPC 服務的首要步驟是使用 Google Protocol Buffers 格式定義 schema。然後我們將 schema 轉換為 Java 程式碼,我們可以在自己的服務中實現它。確保您已安裝 protoc 編譯器。您最好也安裝 grpcurl,這是一個方便的工具,用於向 gRPC 端點發出請求。

這是我的 schema。它定義了一個簡單的服務,用於列舉和領養 Dogs。

syntax = "proto3";  
option java_multiple_files = true;  
option java_package = "com.example.demo.grpc.impl";  
option java_outer_classname = "AdoptionsProto";  

import "google/protobuf/empty.proto";  

service Adoptions {  

  rpc All(google.protobuf.Empty) returns (DogsResponse){}  

  rpc Adopt(DogAdoptionRequest) returns (google.protobuf.Empty){}  
}  

message Dog {  
  int32 id = 1;  
  string name = 2;  
  string description = 3;  
  string owner = 4;  
}  

message DogAdoptionRequest {  
  int32 dogId = 1;  
  string name = 2;  
}  

message DogsResponse {  
  repeated Dog dogs = 1;  
}  

要生成 Java 程式碼,執行

./mvnw -DskipTests package  

現在,您已經萬事俱備,可以實現您的第一個 gRPC 服務了!

package com.example.demo;  

import com.example.demo.grpc.impl.AdoptionsGrpc;  
import com.example.demo.grpc.impl.Dog;  
import com.example.demo.grpc.impl.DogAdoptionRequest;  
import com.example.demo.grpc.impl.DogsResponse;  
import com.google.protobuf.Empty;  
import io.grpc.stub.StreamObserver;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.stereotype.Service;  

import java.util.List;  

@SpringBootApplication  
public class DemoApplication {  

    public static void main(String[] args) {  
        SpringApplication.run(DemoApplication.class, args);  
    }  
}  

@Service  
class AdoptionsGrpcService extends AdoptionsGrpc.AdoptionsImplBase {  

    @Override  
    public void all(Empty request, StreamObserver<DogsResponse> responseObserver) {  
        responseObserver.onNext(DogsResponse.newBuilder()  
                .addAllDogs(List.of(  
                        Dog.newBuilder().setName("dog1").setDescription("the goodest boy").setOwner("jlong").build(),  
                        Dog.newBuilder().setName("dog2").setDescription("the goodest girl").setOwner("jlong").build()))  
                .build());  
        responseObserver.onCompleted();  
    }  

    @Override  
    public void adopt(DogAdoptionRequest request, StreamObserver<Empty> responseObserver) {  
        System.out.println("Adopting " + request.getName() + " " + request.getDogId());  
        responseObserver.onNext(Empty.getDefaultInstance());  
        responseObserver.onCompleted();  
    }  
}  

要啟用虛擬執行緒,請將以下內容新增到 src/main/resources/application.properties

spring.threads.virtual.enabled=true  

現在,讓我們編譯一個 GraalVM 本機映象!

要編譯一個執行在您的主機作業系統上的本機映象,執行

./mvnw -DskipTests -Pnative native:compile  

要建立一個 Docker 映象(需要 Docker 正在執行),執行

./mvnw -DskipTests -Pnative spring-boot:build-image  

現在,讓我們測試一下

grpcurl -plaintext localhost:8080 Adoptions.All  

如果一切順利,恭喜您構建了您的第一個以 Spring gRPC 為中心的應用!祝您的生產之旅愉快!🚀

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有