gRPC stub 入参出参规律的研究

背景

最近公司在做 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 {    

    /**
     * 
     * 简单模式(请求-响应 模式),查询
     * 
*/ public StudentResponse request1Response(QueryStudentRequest request) { return xxx; } /** *
     * 服务端流模式
     * 
*/ public Iterator requestStreamResponse( QueryAllStudentRequest request) { return xxx; } } public static final class SimpleFutureStub extends AbstractFutureStub { /** *
     * 简单模式(请求-响应 模式),查询
     * 
*/ public ListenableFuture request1Response( QueryStudentRequest request) { return xxx; } } public static final class SimpleStub extends AbstractAsyncStub { /** *
     * 简单模式(请求-响应 模式),查询
     * 
*/ public void request1Response(QueryStudentRequest request, StreamObserver responseObserver) { xxx; } /** *
     * 服务端流模式
     * 
*/ public void requestStreamResponse(QueryAllStudentRequest request, StreamObserver responseObserver) { xxx; } /** *
     * 客户端流模式
     * 
*/ public StreamObserver streamRequest1Response( StreamObserver responseObserver) { return xxx; } /** *
     * 双向流模式
     * 
*/ public StreamObserver streamRequestStreamResponse( StreamObserver 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 分为两种,

  • 客户端是的时候,有返回值
  • 客户端没有流的时候,没有返回值,结果在入参里

你可能感兴趣的:(gRPC stub 入参出参规律的研究)