天天看點

grpc整理grpc整理

grpc整理

文章目錄

  • grpc整理
    • proto檔案(java)
    • 生成代碼核心内容
      • grpc服務Stub方法簽名類型
        • Unary
        • Server-streaming
        • Client-streaming
        • Bidirectional-streaming
      • grpc用戶端Stub
        • Asynchronous Stub
        • Blocking Stub
        • Future Stub
        • Asynchronous 與Future 的差別
    • gradle
    • demo
    • 參考

proto檔案(java)

syntax = "proto3";

option java_multiple_files = false; //是否多個檔案
option java_package = "com.example.grpcs"; //包名
option java_outer_classname = "HelloWorldProto"; //生成的bean類
//option objc_class_prefix = "HLW";

package helloworld; //如果沒有java_package 指定,則會根據這個生成包名,但這個包名一般不推薦使用反域名的格式,是以建議使用java_package

//這樣聲明後将會生成一個叫GreeterGrpc的類(Grpc表示字尾)
//這個生成類中包含一個有ImplBase字尾的抽象類,在這裡就是GreeterImplBase,服務端需要繼承這個類并實作接口
service Greeter {
}
           

生成代碼核心内容

grpc服務Stub方法簽名類型

  • 生成代碼中有一個帶有字尾ImplBase字尾的抽象類,類中方法的簽名取決于它處理的RPC類型,總共有4種類型

Unary

  • 一個請求對象對應一個傳回對象
    public void unaryExample(
        	RequestType request,
        	StreamObserver<ResponseType> responseObserver)
               

Server-streaming

  • 一個請求對象,服務端可以傳回多個結果對象
    public void serverStreamingExample(
    	  	RequestType request,
    	  	StreamObserver<ResponseType> responseObserver)
               
    與Unary是一樣的

Client-streaming

  • 用戶端傳入多個請求對象,服務端傳回一個響應結果
    public StreamObserver<RequestType> clientStreamingExample(
    StreamObserver<ResponseType> responseObserver)
               

Bidirectional-streaming

  • 結合用戶端流式rpc和服務端流式rpc,可以傳入多個對象,傳回多個響應對象
    public StreamObserver<RequestType> bidirectionalStreamingExample(
    StreamObserver<ResponseType> responseObserver)
               
    與Client-streaming是一樣的

grpc用戶端Stub

  • 生成的代碼中包含被用戶端調用的由服務定義的方法,每一個stub都綁定一個Channel,通過Channel發送服務端
  • 生成代碼中包含三種類型的stub,分别是 asynchronous(異步)、 blocking(阻塞)、 future,每一種類型都有對應的生成代碼,比如ServiceNameStub,ServiceNameBlockingStub,ServiceNameFutureStub,其中ServiceName為proto檔案中定義的服務名

Asynchronous Stub

  • 通過ServiceNameGrpc.newStub(Channel channel)可以執行個體化一個異步stub
  • Asynchronous Stub支援Unary,Server-streaming,Client-streaming,Bidirectional-streaming4種

Blocking Stub

  • 通過ServiceNameGrpc.newBlockingStub(Channel channel)可以執行個體化一個同步stub
  • Asynchronous Stub支援Unary和Server-streaming兩種:
    • Unary:public ResponseType unaryExample(RequestType request)
    • Server-streaming:public Iterator serverStreamingExample(RequestType request)

Future Stub

  • 通過ServiceNameGrpc.newFutureStub(Channel channel)可以執行個體化一個future stub
  • Future Stub隻支援Unary一種
    • Unary:public ListenableFuture unaryExample(RequestType request)

其中關于ListenableFuture的使用請見文末的參考

Asynchronous 與Future 的差別

  • Future最适合的場景就是一個大任務需要多個小任務,隻有小任務都完成了大任務才能執行。以泡茶為例,要泡茶需要燒水和洗茶杯等小任務,燒水和洗茶杯都可以同時執行,但最後要泡茶必須等燒水和洗茶杯都執行完了才能進行。
  • 而Asynchronous 适合的場景就是多個任務之間并沒有順序關系,都是獨立的任務。

gradle

  • 以下是一個典型的gradle配置
apply plugin: 'java'
apply plugin: 'com.google.protobuf'

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    // ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
    // gradle versions
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
  }
}

protobuf {
  protoc {
    artifact = "com.google.protobuf:protoc:3.2.0"
  }
  plugins {
    grpc {
      artifact = 'io.grpc:protoc-gen-grpc-java:1.4.0'
    }
  }
  generateProtoTasks {
    all()*.plugins {
      grpc {}
    }
  }
}
           

demo

https://github.com/huweijian5/grpc-demo

參考

grpc /

https://grpc.io/docs/tutorials/basic/java.html

grpc / Java Generated Code Reference

https://grpc.io/docs/reference/java/generated-code.html

grpc的四種服務類型 - resentment - 部落格園

http://www.cnblogs.com/resentment/p/6792029.html

多線程學習-ListenableFuture使用介紹以及示例 - qq_40074764的部落格 - CSDN部落格

https://blog.csdn.net/qq_40074764/article/details/79655306

同步調用,異步回調和 Future 模式 - 流的部落格 - CSDN部落格

https://blog.csdn.net/qq_35688140/article/details/83115723

繼續閱讀