美文网首页
gRPC stub 入参出参规律的研究

gRPC stub 入参出参规律的研究

作者: Yellowtail | 来源:发表于2022-07-21 09:53 被阅读0次

背景

最近公司在做 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 分为两种,

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

相关文章

网友评论

      本文标题:gRPC stub 入参出参规律的研究

      本文链接:https://www.haomeiwen.com/subject/wckmirtx.html