歡迎回到構建 Web 服務器系列。到目前為止,我們主要專注於在 GoLang 中編寫 Web 服務器。但是,我收到了寫一篇文章的請求,即如何使用 Java 完成 gRPC 實現以及實現相同目標的可用庫和選項有哪些。
先決條件:基本了解Spring、Spring Boot、Dependency Injection、RPC 和 ProtoBuf。
我們將使用 spring boot 來初始化一個基本服務,然后在它上面添加一個 RPC 服務器和客戶端。
編寫 Java gRPC 服務器的步驟
假設我們已經從 spring initlizr網站生成了一個代碼,項目名稱為grpc-server
- 我們定義服務 protobuf 文件並添加所需的依賴項
pom.xml
以編譯 proto 文件並生成 RPC Java 接口作為構建過程的一部分。 - 接下來我們繼續編寫一個基本的
HelloWorld
服務器。 - 編譯代碼並調用 RPC 服務器進行測試。
1. 編寫原型定義
Protobuf 定義與語言無關,因此不會在我們可用的所有選項中發生變化。對於這個服務器示例,我們將編寫一個非常基本的 HelloWorld 服務,如下所示:
語法 = "proto3";
選項 java_multiple_files = true;
包 com.test.grpc;
message HelloRequest {
string firstName = 1;
字符串姓氏 = 2;
}
message HelloResponse {
字符串問候 = 1;
}
service HelloService {
rpc hello(HelloRequest) 返回(HelloResponse);
}
制作小號你下創建這個文件茜main
目錄,否則原文件將不包含在構建過程中。File Path: <project-root>/src/main/proto/HelloService.proto
接下來,將以下依賴項、擴展和插件添加到 pom.xml
// 將以下依賴項添加到依賴項部分。此依賴項可幫助您使用 io.grpc 模塊開箱即用地運行基本的 GRPC 服務器。
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-autoconfigure</artifactId>
<version>2.12.0.RELEASE</version>
</dependency>//將以下擴展添加到構建部分。此擴展在 protobuf 編譯步驟期間添加了操作系統特定的邏輯。
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os-maven-plugin.version}</version>
</extension >
</擴展>// 將以下插件添加到構建部分。該插件編譯 protobuf 文件並將其添加到目標文件夾中。
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf-maven-plugin.version}</version>
<configuration>
< protocArtifact>
com.google.protobuf: protoc :3.3.0:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc -java:1.4.0:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>// 將以下內容添加到屬性部分
<protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
<os-maven-plugin.version>1.6.1</os-maven-plugin.版本>
對pom.xml
文件進行更改后,運行mvn clean install
以編譯代碼並從 protobuf 定義生成所需的樣板 Java 代碼。
2.你好世界服務器
一旦我們弄清楚了 protobuf 的構建和編譯步驟,設置服務器就相對容易了。
讓我們通過實現 ` com.test.grpc.HelloServiceGrpc.HelloServiceImplBase`的基類來創建一個基本的 java gRPC 服務器,它是作為我們的 proto 編譯步驟的一部分生成的。
@GrpcService
public class HelloServiceImpl extends HelloServiceImplBase {
@Override
public void hello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
System. out .println("收到:" + request);
String greeting = new StringBuilder().append("Hello, ")
.append(request.getFirstName())
.append(" ")
.append(request.getLastName())
.toString();
HelloResponse 響應 = HelloResponse。newBuilder ()
.setGreeting(greeting ) .build
();
responseObserver.onNext(響應);
responseObserver.onCompleted();
}
}
接下來,我們需要初始化服務器並注冊我們的 gRPC 服務實現。將您的GrpcServerApplication.java
文件修改為如下所示:
@SpringBootApplication
public class GrpcServerApplication {
public static void main(String[] args) throws IOException, InterruptedException {
Server server = ServerBuilder. forPort(8080)
.addService(新HelloServiceImpl())構建()。
系統。out .println("正在啟動服務器...");
server.start();
系統。out .println("服務器啟動了!");
server.awaitTermination();
}
}
在上面的文件中,我們在端口上創建了一個新的 gRPC 服務器8080
並注冊我們HelloServiceImpl
的。
3. 編譯和測試
到目前為止,我們使用 proto 定義在 Java 中創建了一個基本的 RPC 服務器實現,並將其注冊到我們的服務器中。RPC 服務器創建的神奇之處在於net.devh
我們在第一步中添加的依賴項。
現在,繼續運行服務器並測試它是否為請求提供服務。
編譯並運行: mvn spring-boot:run
上面的命令啟動一個 gRPC 服務器,可以使用多種工具(如yab和grpcurl )對其進行測試。
在 Spring Boot 中使用 Java 完成服務器設置。在接下來的文章中,我們將通過消耗紡完客戶端通過此服務器提供的數據。我們還將為此添加一個 GoLang 客戶端,以了解基於 RPC 的通信如何在沒有任何語言障礙的情況下跨多個服務更輕松、更高效。