常用 #### Protocol Buffers 的主要特性有下面这几个:: 1. 更快的数据传输速度 protobuf 在传输时,会将数据序列化为二进制数据 和 XML、JSON 的文本传输格式相比,这可以节省大量的 IO 操作,从而提高数据传输速度 2. 跨平台多语言 protobuf 自带的编译工具 protoc 可以基于 protobuf 定义文件 编译出不同语言的客户端或者服务端,供程序直接调用,因此可以满足多语言需求的场景 3. 具有非常好的扩展性和兼容性,可以更新已有的数据结构,而不破坏和影响原有的程序 4. 基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端和客户端接口 Protocol Buffers 主要有三个作用:: 1. 可以用来定义数据结构 message SecretInfo { string name = 1; string secret_id = 2; int64 expires = 3; } 2. 可以用来定义服务接口 service Cache{ rpc ListSecrets(ListSecretsRequest) returns (ListSecretsResponse) {} rpc ListPolicies(ListPoliciesRequest) returns (ListPoliciesResponse) {} } 3. 可以通过 protobuf 序列化和反序列化,提升传输效率 gRPC 支持定义 4 种类型的服务方法:: 1. 简单模式(Simple RPC) 是最简单的 gRPC 模式 客户端发起一次请求,服务端响应一个数据 定义格式为: rpc SayHello (HelloRequest) returns (HelloReply) {} 2. 服务端数据流模式(Server-side streaming RPC) 客户端发送一个请求,服务器返回数据流响应,客户端从流中读取数据直到为空 定义格式为: rpc SayHello (HelloRequest) returns (stream HelloReply) {} 3. 客户端数据流模式(Client-side streaming RPC) 客户端将消息以流的方式发送给服务器,服务器全部处理完成之后返回一次响应 定义格式为: rpc SayHello (stream HelloRequest) returns (HelloReply) {} 4. 双向数据流模式(Bidirectional streaming RPC) 客户端和服务端都可以向对方发送数据流,双方的数据可以同时互相发送,也就是可以实现实时交互 RPC 框架原理 定义格式为: rpc SayHello (stream HelloRequest) returns (stream HelloReply) {} RPC 调用具有下面两个特点:: 1. 调用方便 RPC 屏蔽了底层的网络通信细节,使得调用 RPC 就像调用本地方法一样方便, 调用方式跟大家所熟知的调用类的方法一致:ClassName.ClassFuc(params)。 2. 不需要打包和解包 RPC 调用的入参和返回的结果都是 Go 的结构体, 不需要对传入参数进行打包操作,也不需要对返回参数进行解包操作,简化了调用步骤 * 官网: https://grpc.io/ * golang 版快速使用: https://grpc.io/docs/languages/go/quickstart/