1. 概述
1.1 服务定义
向其它的RPC服务一样,GPRC的基础是服务的定义。服务定义远程调用方法的名称、传入参数和返回参数。GRPC默认使用 Protobuf描述服务,protobuf的信息见这篇博客Protobuf3 的第一个Java demo
GRPC一共定义4种服务方法:
- 一元RPC(Unary RPCs ):这是最简单的定义,客户端发送一个请求,服务端返回一个结果
- 服务器流RPC(Server streaming RPCs):客户端发送一个请求,服务端返回一个流给客户端,客户从流中读取一系列消息,直到读取所有小心
- 客户端流RPC(Client streaming RPCs ):客户端通过流向服务端发送一系列消息,然后等待服务端读取完数据并返回处理结果
双向流RPC(Bidirectional streaming RPCs):客户端和服务端都可以独立向对方发送或接受一系列的消息。客户端和服务端读写的顺序是任意。
以上的服务方法定义在proto文件,如下:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.hry.spring.grpc.mystream";
option java_outer_classname = "HelloStreamEntity";
service HelloStream {
// A Unary RPC.
rpc simpleRpc(Simple) returns (SimpleFeature) {}
// A server-to-client streaming RPC.
rpc server2ClientRpc(SimpleList) returns (stream SimpleFeature) {}
// A client-to-server streaming RPC.
rpc client2ServerRpc(stream Simple) returns (SimpleSummary) {}
// A Bidirectional streaming RPC.
rpc bindirectionalStreamRpc(stream Simple) returns (stream Simple) {}
}
message Simple {
int32 num = 1;
string name = 2;
}
message SimpleList {
repeated Simple simpleList = 1;
}
message SimpleFeature {
string name = 1;
Simple location = 2;
}
message SimpleSummary {
int32 feature_count = 2;
}
// 测试类
message SimpleFeatureDatabase {
repeated SimpleFeature feature = 1;
}
1.2 同步RPC和异步RPC
GRPC 同时支持同步RPC和异步RPC。
同步RPC调用服务方法只支持流RPC(Server streaming RPCs)和一元RPC(Unary RPCs )。异步RPC调用服务方法支持4种方法。
1.3 生成基础代码 ###
参考的Grpc系列一 第一个hello world 例子生成protobuf基础类和HelloStreamGrpc,详细见这里代码
2. 测试代码
这里实现服务端和客户端代码
2.1 服务端
服务端类的实现,通过继承HelloStreamGrpc.HelloStreamImplBase实现,具体服务接口实现见下面:
/**
* 服务端类的实现
*
*/
private static class HelloStreamService extends HelloStreamGrpc.HelloStreamImplBase {
private final List<SimpleFeature> features;
public HelloStreamService(List<SimpleFeature> features) {
this.features = features;
}
...
- 一元RPC(Unary RPCs )服务端实现:
@Override
public void simpleRpc(Simple request, StreamObserver<SimpleFeature> responseObserver) {
SimpleFeature rtn = SimpleFeature.newBuilder().setName(request.getName() + "simpleRpc").setLocation(request)
.build();
logger.info("recevier simpleRpc : {}", request);
responseObserver.onNext(rtn);
responseObserver.onCompleted();
}
- 服务器流RPC(Server streaming RPCs)服务端实现:
@Override
public void server2ClientRpc(SimpleList request, StreamObserver<SimpleFeature> responseObserver) {
logge