gRPC的采用**protobuf作为IDL来描述服务接口
和消息结构
,如果需要,也可以使用其他替代方案。以下示例引用在gRPC concept**
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
string reply = 1;
}
gRPC定义了4中可用的服务方法:
Unary RPC 客户端发送一个单一Request并获得一个单一的Response
rpc SayHello(HelloRequest) returns (HelloResponse){}
Server streaming RPC Client发送一个Request到Server,然后通过获取的流来读取消息和数据,直到流中没有更多消息为止
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){}
Client streaming RPC Client端通过流写一个消息的序列到Server端,Client写完消息后会等待Server读取并返回Response
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
Bidirectional streaming RPC 也就是基于双向流的RPC
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){}
gRPC 提供protocol buffer compiler 插件产生Server端和Client端的代码:
.proto
文件会自动生产代码,参考**gRPC Java Code Generate**描述了如何配置maven和gradle的pluginprotoc -I . .\\grpc.proto --go_out=plugins=grpc:.
在Golang中直接通过protoc
生产对应的golang代码,执行以上命令会产生grpc.pb.go
文件,文件中包含了Server端和Client端需要的Go代码gRPC采用Protobuf作为序列化协议,client和server端进行数据交互的时候都回将数据序列化成protobuf格式进行传输,具体参考**protobuf**
基于HTTP2的二进制传输
(通过HTTP2 frame传输protobuf序列化后的二进制数据)