1. 概述
在本教程中,我們將探索如何利用 Spring gRPC 項目構建一個包含 gRPC 服務器的 Spring 應用程序。 使用該項目可以讓我們充分利用 Spring 的各項優勢,例如快速開發和依賴注入,以及構建 gRPC 服務器、消息和客户端的簡單方法。
2. 項目設置
首先,我們將使用 Spring Initializr 獲取一個示例項目。 我們只需要從依賴項列表中選擇 Spring gRPC。 在我們開發環境中的下載文件夾打開後,我們應該找到一個 pom.xml 文件,其中包含我們需要的依賴項。 此外,還有一個 Application.java 文件,其中包含我們應用程序的主方法。 幸運的是,還有一個名為 proto 的文件夾,我們將在下一部分中使用它。
如果我們想將 gRPC 服務器添加到現有應用程序中,則需要添加以下依賴項:
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-services</artifactId>
<version>1.72.0</version>
</dependency>
<dependency>
<groupId>org.springframework.grpc</groupId>
<artifactId>spring-grpc-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>我們還應注意,Spring gRPC 目前支持 Spring Boot 3.4.x 和 3.5.x 版本。
除了依賴項之外,我們需要一個構建插件來從我們的 Proto 文件生成類和接口。 Spring Initializr 提供的工具是 protobuf-maven-plugin,但其他工具也可用,並且可以正常工作。
讓我們將插件添加到我們的 pom 中:
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:4.30.2:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.72.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
<configuration>
<pluginParameter>jakarta_omit,@generated=omit</pluginParameter>
</configuration>
</execution>
</executions>
</plugin>3. 定義 Proto 文件
現在我們已經有了基本應用程序結構,現在讓我們開始創建我們的 gRPC 服務器和消息。 我們將創建一個基本的計算器,它只執行一個操作:將兩個數字相乘。
為了開始,在步驟 2 中生成的 proto 文件夾中,讓我們創建一個名為 calculator.proto 的新文件。 在頂部,我們需要設置語法和一些選項:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "org.springframework.grpc.calculator.proto";
option java_outer_classname = "CalculatorProto";
語法行指定我們希望使用 Protocol Buffers 語言的 proto3 版本。
選項都是關於我們希望如何命名和組織生成的 Java 代碼的指示。 java_multiple_files 行告訴編譯器為我們描述的每個服務和消息創建一個單獨的 Java 文件。 java_package 選項指定生成文件的存放位置。 此外,java_outer_classname 選項確定 Wrapper 類的名稱,這將是我們的 Proto 文件(Java)表示形式。
接下來,我們可以定義一個 Request 消息,其中包含我們將要相乘的兩個數字:
message Request {
int32 firstValue = 1;
int32 secondValue = 2;
}我們還需要一個 Response 消息用於在計算完成後返回。該消息應僅包含一個字段,即 result。
message Response {
int32 result = 1;
}最後,現在我們已經有了輸入和輸出,我們可以定義我們的服務:
service Calculator {
rpc Multiply(Request) returns (Response) {}
}此服務名為 Calculator;它有一個名為 Multiply 的方法,該方法接受一個 Request 並返回一個 Result。
4. 使用 Proto 文件生成服務和消息接口
我們已經定義了 gRPC 功能的基本框架。現在,我們可以通過運行以下命令,從我們的 Proto 文件生成所需的源文件:
./mvnw clean package在目標文件夾中,將生成我們消息的實際實現,這些實現位於名為 Request 和 Response 的類中。 此外,還將創建一個抽象類,我們可以將其擴展用於我們的服務,該類名為 CalculatorGrpc.CalculatorImplBase。 在此抽象類中,我們有一個被 stub 版本的 Multiply 方法,我們需要覆蓋並完全實現它。
5. 實現具體服務
接下來,需要擴展生成的基類並正確實現我們的 <em>Multiply</em> 方法。 讓我們創建一個名為 <em>GrpcCalculatorService</em> 的 <em>Service</em> 類,該類繼承自 <em>CalculatorGrpc.CalculatorImplBase</em>。
@Service
public class GrpcCalculatorService extends CalculatorGrpc.CalculatorImplBase {}我們現在可以覆蓋 Multiply 方法並添加執行乘法的代碼:
@Override
public void multiply(Request req, StreamObserver<Response> responseObserver) {
Response reply = Response.newBuilder().setResult(req.getFirstValue() * req.getSecondValue()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}方法簽名為我們提供了Request對象,Request是我們Request在Proto 文件中定義的Request。Request它還為我們提供了StreamObserver,StreamObserver用於將Response傳遞進去。
第一步是構建一個Response對象,Response包含計算結果。我們使用自動提供的構建方法來創建對象並將正確的數字放入result字段中。接下來,我們使用onNext()方法將Response發送出去。最後,我們可以告訴StreamObserver,onCompleted()方法已完成。
6. 運行和測試服務
我們有常規選項可以運行我們的服務。 我們可以通過我們的 IDE 使用 Application.java 中的主方法運行它。 另一種方法是從命令行運行它:
./mvnw spring-boot:run一旦應用程序成功啓動運行,我們就可以調用我們的服務並檢查其是否正常工作。最簡單的方法是通過命令行再次執行。我們需要一個 gRPC 工具來實現。這裏我們將使用 gRPCurl,但也有其他選項可用。對我們的 Calculator 服務的一次調用如下所示:
grpcurl -d '{"firstValue":7, "secondValue":6}' -plaintext localhost:9090 Calculator.Multiply在這裏,我們使用–d 標誌將<em>Request</em>消息傳遞進來,其中包含我們想要相乘的兩個值。我們還傳遞了URL,在本例中是localhost的9090端口,但如果需要,可以在應用程序的<strong>application.properties</strong>文件中進行更改。最後,我們指定了用於處理請求的服務和方法。該服務應響應:
{
"result": 42
}
5. 結論
在本教程中,我們探討了 Spring gRPC 項目的基本用法。我們首先使用 Spring Initializr 設置了一個小型項目,並使用 Proto 文件定義了服務的結構和消息結構。然後,我們使用 Maven 構建插件自動生成了大部分所需代碼和接口。
隨後,我們實現了生成的接口,創建了一個完整的 Calculator 服務的實例。最後,我們從命令行測試了 gRPC 服務器,併成功地將兩個數字相乘。
這是一種快速簡便的方法,可以輕鬆地啓動一個 gRPC 服務器,並與 Spring 生態系統無縫集成,同時使用最少的代碼。