grpc java详细教程
时间: 2023-10-04 07:07:48 浏览: 254
GRPC(Google Remote Procedure Call)是一种高性能、通用的开源 RPC 框架,可以在任何地方运行。它使得客户端和服务器应用程序可以透明地相互通信,而无需知道对方的语言和平台。在本教程中,我们将介绍如何使用Java实现简单的gRPC应用程序。
1. 安装gRPC
首先,您需要安装gRPC。请按照官方文档的说明进行安装:https://grpc.io/docs/languages/java/quickstart/
2. 创建proto文件
接下来,您需要创建一个.proto文件,定义您的服务和消息格式。例如,以下是一个简单的例子:
```
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";
service HelloWorld {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
```
这个.proto文件定义了一个名为HelloWorld的服务,该服务有一个名为SayHello的方法,该方法接受一个HelloRequest消息并返回一个HelloResponse消息。
3. 生成Java代码
使用gRPC的protobuf编译器,您可以生成Java代码以实现您的服务。在命令行中,运行以下命令:
```
protoc --java_out=<output_directory> <proto_file>.proto
```
例如,如果您的.proto文件名为helloworld.proto,输出目录为src/main/java,那么您可以运行以下命令:
```
protoc --java_out=src/main/java helloworld.proto
```
这将生成一个Java类,该类实现了您的服务和消息格式。
4. 实现服务
现在,您可以编写Java代码来实现您的服务。以下是一个简单的实现示例:
```
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import com.example.grpc.*;
import java.io.IOException;
public class HelloWorldServer {
private int port = 50051;
private Server server;
private void start() throws IOException {
server = ServerBuilder.forPort(port)
.addService(new HelloWorldImpl())
.build()
.start();
System.out.println("Server started, listening on " + port);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
HelloWorldServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
/**
* Await termination on the main thread since the grpc library uses daemon threads.
*/
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
final HelloWorldServer server = new HelloWorldServer();
server.start();
server.blockUntilShutdown();
}
static class HelloWorldImpl extends HelloWorldGrpc.HelloWorldImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
String message = "Hello " + request.getName() + "!";
HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
}
```
这个示例代码创建了一个名为HelloWorldServer的类,该类实现了您的服务。它使用ServerBuilder来创建服务器,并将服务添加到服务器中。当服务器启动时,它将打印一条消息,并将关闭挂钩添加到运行时中。当服务器关闭时,它将打印另一条消息。
服务的实现在HelloWorldImpl类中。它实现了您的服务定义中的SayHello方法,并使用请求中的名称构造响应消息。
5. 实现客户端
最后,您可以编写Java代码来实现客户端,以便使用您的服务。以下是一个简单的实现示例:
```
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import com.example.grpc.*;
public class HelloWorldClient {
private final ManagedChannel channel;
private final HelloWorldGrpc.HelloWorldBlockingStub blockingStub;
public HelloWorldClient(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
blockingStub = HelloWorldGrpc.newBlockingStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void greet(String name) {
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
System.out.println(response.getMessage());
}
public static void main(String[] args) throws Exception {
HelloWorldClient client = new HelloWorldClient("localhost", 50051);
try {
String user = "world";
if (args.length > 0) {
user = args[0]; /* Use the arg as the name to greet if provided */
}
client.greet(user);
} finally {
client.shutdown();
}
}
}
```
这个示例代码创建了一个名为HelloWorldClient的类,该类连接到服务器并调用您的服务。它使用ManagedChannelBuilder来创建一个通道,并将其用于创建一个HelloWorldGrpc.HelloWorldBlockingStub,该stub可以用于调用您的服务。它还定义了一个greet方法,该方法接受一个名称并调用您的服务,然后打印响应消息。
6. 运行您的应用程序
现在,您可以运行您的应用程序。首先启动服务器:
```
$ java HelloWorldServer
```
然后启动客户端:
```
$ java HelloWorldClient
```
您应该能够看到客户端打印出“Hello world!”(如果您没有提供名称参数)或“Hello <name>!”(如果您提供了名称参数)。
这就是如何在Java中使用gRPC创建简单的客户端-服务器应用程序的介绍。希望这个教程能够帮助您入门gRPC。
阅读全文