背景
最近公司在做 Restful 和 gRPC统一封装的事情,之前没有接触过 gRPC,在设计的时候有点懵,所以特地了解了一下 gRPC 在调用方的一些特征
模式
因为 gRPC 底层网络协议是 HTTP2,所以支持4种模式
- 一个请求,一个响应
- 一个请求,流式响应
- 流式请求,一个响应
- 流式请求,流式响应
Proto 写法
以上4种,在proto里写法如下
service Simple {
// 简单模式(请求-响应 模式),查询
rpc request1Response(QueryStudentRequest) returns (StudentResponse);
// 服务端流模式
rpc requestStreamResponse(QueryAllStudentRequest) returns (stream StudentResponse);
// 客户端流模式
rpc streamRequest1Response(stream UploadImgRequest) returns (CommonResponse);
// 双向流模式
rpc streamRequestStreamResponse(stream AddStudentRequest) returns (stream StudentResponse);
}
Stub
:rooster: Stub 有点类似 http 的client, grpc 默认提供了几种 stub 实现
gRPC 默认提供了三种 stub
-
xxxBlockingStub
阻塞式 -
xxxFutureStub
批量式 -
xxxStub
异步
看一下生成出来的代码(删除了无关的代码)
@javax.annotation.Generated(
value = "by gRPC proto compiler (version 1.29.0)",
comments = "Source: s.proto")
public final class SimpleGrpc {
public static final class SimpleBlockingStub extends AbstractBlockingStub<SimpleBlockingStub> {
/**
* <pre>
* 简单模式(请求-响应 模式),查询
* </pre>
*/
public StudentResponse request1Response(QueryStudentRequest request) {
return xxx;
}
/**
* <pre>
* 服务端流模式
* </pre>
*/
public Iterator<StudentResponse> requestStreamResponse(
QueryAllStudentRequest request) {
return xxx;
}
}
public static final class SimpleFutureStub extends AbstractFutureStub<SimpleFutureStub> {
/**
* <pre>
* 简单模式(请求-响应 模式),查询
* </pre>
*/
public ListenableFuture<StudentResponse> request1Response(
QueryStudentRequest request) {
return xxx;
}
}
public static final class SimpleStub extends AbstractAsyncStub<SimpleStub> {
/**
* <pre>
* 简单模式(请求-响应 模式),查询
* </pre>
*/
public void request1Response(QueryStudentRequest request,
StreamObserver<StudentResponse> responseObserver) {
xxx;
}
/**
* <pre>
* 服务端流模式
* </pre>
*/
public void requestStreamResponse(QueryAllStudentRequest request,
StreamObserver<StudentResponse> responseObserver) {
xxx;
}
/**
* <pre>
* 客户端流模式
* </pre>
*/
public StreamObserver<UploadImgRequest> streamRequest1Response(
StreamObserver<CommonResponse> responseObserver) {
return xxx;
}
/**
* <pre>
* 双向流模式
* </pre>
*/
public StreamObserver<AddStudentRequest> streamRequestStreamResponse(
StreamObserver<StudentResponse> responseObserver) {
return xxx;
}
}
}
不同 stub 支持的模式
观察以上 stub 的方法个数,可以得出不同stub支持的模式数量的结论
:heavy_check_mark:
name | 描述 | 1v1 | 1vN | Nv1 | NvN |
---|---|---|---|---|---|
xxxBlockingStub | 同步/阻塞 | ✔ | ✔ | ❌ | ❌ |
xxxFutureStub | 批量 | ✔ | ❌ | ❌ | ❌ |
xxxStub | 异步 | ✔ | ✔ | ✔ | ✔ |
不同stub 在不同模式下的入参、出参差异
观察以上 stub 的方法签名,可以得知
xxxBlockingStub
xxxFutureStub
方法都有返回值,具体如下
result method(request )
而 xxxStub
分为两种,
- 客户端是
流
的时候,有返回值
; - 客户端
没有流
的时候,没有返回值
,结果在入参里
网友评论