使用java从零开始手写gprc服务器端和客户端程序

简介: proto grpc

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 {
@Overridepublicvoidquery(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的服务器端和客户端实现就完成了。

目录
相关文章
|
22天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
58 9
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
41 4
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
85 2
|
2月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
132 1
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
54 1
|
2月前
|
安全 区块链 数据库
|
2月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
35 0
|
存储 自然语言处理 Java
Elasticsearch: java客户端之AdminClient
Elasticsearch: java客户端之AdminClient
164 0
|
存储 自然语言处理 Java
Elasticsearch: java客户端之AdminClient
Elasticsearch: java客户端之AdminClient
259 0
Elasticsearch: java客户端之AdminClient