gRPC
google开源分布式远程服务调用
server提供api grpcClient主流编程语言进行调用,类似web api
基于http2 通信二进制流
server - proto - client
Protocol buffers
客户端与服务端见通信协议
缺点:
- 其消息一次性加载到内存
- 完全解析二进制数据才能知道数据是否相等
- 消息未压缩
- 大型多维浮点数组等科学和工程用途的运算,效率不是最佳
- 科学计算非面向对象 缓冲期对其支持不太好
定义server四种形式
// 一元rpc
rpc SayHello(HelloRequest) returns (HelloResponse);
// 服务器流式响应
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
// 客户端流式请求
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
// 双向流式沟通
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
syntax = "proto3";
// 指定proto版本
pcakage a.b
// 类似命名空间
import "myproject/other_protos.proto";
import public "a.proto";
// 导入其他prot文件中定义的proto
// 该功能java没有;
// 移动文件后编译器可通过 -I 设定proto文件所在目录即 proto_path
// 2版本proto不能在3版本proto中直接使用,反之亦然
message Foo{
reserved 2,15,2 to 100, 1000 to max;
reserved "foo", "bar";
}
// reserved 该属性设定保留字段;字段名称和字段编号不能混用
message SearchResponse {
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
repeated Result results = 1;
}
// 嵌套定义
message SomeOtherMessage {
SearchResponse.Result result = 1;
}
// 重用上方定义消息
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse);
}
字段
message
message Person {
string NAME = 0;
string AGE = 1;
}
字段编号,每一个字段都有一个唯一编号
该编号范围,1 - 2^29^-1 ;即 1 - 536,870,911
19000 - 19999 为保留字段
enum
enum EnumAlias {
EA_UNSPECIFIED = 0; // 该值必须为0
EA_NAME = 1;
}
- enum 第一个定义必须为0;用于与proto2语义兼容
- 定义范围为
32整数
范围 - 负值使用varint编码,效率不高,不推荐使用
oneof
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
- oneof 表示该字段只会在内存中存在一个
- 其内字段共享该内存
- 不可使用map 和repeated字段
map
map<key_type, value_type> map_field = N;
map<string, Project> projects = 3;
// key_type 可设类型为 stirng 或任意整数
// map 不可 repeated
message MapFieldEntry {
key_type key = 1;
value_type value = 2;
}
repeated MapFieldEntry map_field = N;