欢迎回到构建 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
<span style="background-color:#f2f2f2"><span style="color:rgba(0, 0, 0, 0.8)"><span style="color:#292929">// 将以下依赖项添加到依赖项部分。此依赖项可帮助您使用 io.grpc 模块开箱即用地运行基本的 GRPC 服务器。
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-autoconfigure</artifactId>
<version>2.12.0.RELEASE</version>
</dependency></span><span style="color:#292929">//将以下扩展添加到构建部分。此扩展在 protobuf 编译步骤期间添加了操作系统特定的逻辑。
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os-maven-plugin.version}</version>
</extension >
</扩展></span><span style="color:#292929">// 将以下插件添加到构建部分。该插件编译 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></span><span style="color:#292929">// 将以下内容添加到属性部分
<protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
<os-maven-plugin.version>1.6.1</os-maven-plugin.版本></span></span></span>
对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 的通信如何在没有任何语言障碍的情况下跨多个服务更轻松、更高效。