GRPC是一个现代的开源高性能RPC框架,能够实现基于RPC协议的远程调用,使用的数据协议是Protocol Buffers。下面开始准备手写入门级别的服务器端和客户端程序。需要准备Windows版本的protoc命令行工具,可以去网上自行找一下,本人使用protoc-3.17.3-win64,包含protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe,这两个命令行工具用来基于proto文件生成调用代码,下面准备一个简单的proto文件。
syntax = "proto3"; packagetest.hello; serviceHelloGrpcService { rpcquery(HelloGrpcRequest) returns (HelloGrpcResponse){}; } messageHelloGrpcRequest { stringname = 1; } messageHelloGrpcResponse { stringresult = 1; }
Protocol Buffers规范可以去官网学习,里面都是一些约定俗成的定义,主要规范参数类型,响应类型和调用方法,支持基本数据类型,类和集合等所有常用的数据类型。下面将上述proto文件,命名为HelloGrpc.proto,放在跟protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe一样的目录下,protoc.exe和protoc-gen-grpc-java-1.31.1-windows-x86_64.exe也要放在同一个目录下,方便操作。然后在该目录下执行以下命令
protoc.exe --plugin=protoc-gen-grpc-java=protoc-gen-grpc-java-1.31.1-windows-x86_64.exe HelloGrpc.proto --java_out=./ --grpc-java_out=./
这样就会在当前目录下创建test/hello,并且再hello目录下会生成HelloGrpc.java和HelloGrpcServiceGrpc.java两个类,都是与GRPC框架和Proto协议相关的模板代码,里面包含了我们在proto文件里定义的方法和参数之类的。下面将HelloGrpc.java和HelloGrpcServiceGrpc.java拷贝到我们的项目目录中,开始编写服务器端和客户端代码,服务器端代码如下:
packagecom.proto.server; importio.grpc.stub.StreamObserver; importtest.hello.HelloGrpc; importtest.hello.HelloGrpcServiceGrpc; publicclassHelloGrpcServiceImplextendsHelloGrpcServiceGrpc.HelloGrpcServiceImplBase { publicvoidquery(HelloGrpc.HelloGrpcRequestrequest, StreamObserver<HelloGrpc.HelloGrpcResponse>responseObserver) { Stringname=request.getName(); HelloGrpc.HelloGrpcResponse.Builderbuilder=HelloGrpc.HelloGrpcResponse.newBuilder(); builder.setResult("Welcome "+name); HelloGrpc.HelloGrpcResponseresponse=builder.build(); responseObserver.onNext(response); responseObserver.onCompleted(); } }
packagecom.proto.server; importio.grpc.Server; importio.grpc.ServerBuilder; importjava.io.IOException; publicclassHelloGrpcServer { publicstaticvoidmain(String[] args) throwsIOException, InterruptedException { Serverserver=ServerBuilder.forPort(50056).addService(newHelloGrpcServiceImpl()).build().start(); System.out.println("server started.........."); if(server!=null){ server.awaitTermination(); } } }
然后就是客户端调用代码:
packagecom.proto.client; importio.grpc.ManagedChannel; importio.grpc.ManagedChannelBuilder; importtest.hello.HelloGrpc; importtest.hello.HelloGrpcServiceGrpc; importjava.io.IOException; publicclassHelloGrpcClient { publicstaticvoidmain(String[] args) throwsIOException { // 设置 RPC 引擎为 ProtobufRpcEngineStringhostname="localhost"; intport=50056; HelloGrpc.HelloGrpcRequest.Builderbuilder=HelloGrpc.HelloGrpcRequest.newBuilder(); builder.setName("anisbob"); ManagedChannelchannel=ManagedChannelBuilder.forAddress(hostname,port) .usePlaintext() .build(); HelloGrpcServiceGrpc.HelloGrpcServiceBlockingStubblockingStub=HelloGrpcServiceGrpc.newBlockingStub(channel); HelloGrpc.HelloGrpcResponseresponse=blockingStub.query(builder.build()); System.out.println(response.getResult()); } }
首先启动HelloGrpcServer,然后再启动HelloGrpcClient就可以看到client控制台输出Welcome anisbob。到此一个入门级别的五脏俱全的grpc的服务器端和客户端实现就完成了。