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。 它定義了一個簡單的服務來列舉和採用 Dog

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

檢視全部