美文网首页
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