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
- 一個請求對象,服務端可以傳回多個結果對象
與Unary是一樣的public void serverStreamingExample( RequestType request, StreamObserver<ResponseType> responseObserver)
Client-streaming
- 用戶端傳入多個請求對象,服務端傳回一個響應結果
public StreamObserver<RequestType> clientStreamingExample( StreamObserver<ResponseType> responseObserver)
Bidirectional-streaming
- 結合用戶端流式rpc和服務端流式rpc,可以傳入多個對象,傳回多個響應對象
與Client-streaming是一樣的public StreamObserver<RequestType> bidirectionalStreamingExample( StreamObserver<ResponseType> responseObserver)
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