領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多注意:您可以在這裡找到本部落格的工作程式碼
備受矚目(儘管仍處於實驗階段)的 Spring gRPC 專案釋出了新版本:0.4.0。我不會深入探討所有新功能,但我只想強調我使用它時是多麼興奮,並將引導您一步步走向 gRPC 的樂趣。無數細微之處都恰到好處,使其成為我使用 gRPC 以來最流暢的體驗!
我訪問了Spring Initializr,並選擇了 GRPC、GraalVM 和 Web。我喜歡 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 為中心的應用!祝您的生產之旅愉快!🚀