GRPC
一次RPC的完整过程
IDL文件
IIDL通过一种中立的方式来描述接口,使得在不同的平台上运行的对象和用不同的语言编写的程序可以互相通信
生成代码
通过编译器工具把IDL文件转换成语言对应的静态库
编解码
从内存中表示到字节序列的转换称为编码,反之为解码。(序列化和反序列化)
通信协议
规范数据在网络中的传输内容和格式
网络传输
通常基于成熟的TCP/UDP传输
编解码层-数据格式
语言特定的格式
文本格式
二进制格式
编解码层-选型
兼容性
通用性
性能
协议层-概念
特殊结束符
一个特殊字符作为每个协议单元结束的标示
变长协议
以定长加不定长的部分组成﹐其中定长的部分需要描述不定长的内容长度
协议层-协议构造
LENGTH:数据包大小﹒不包含自身
HEADER MAGIC:标识版本信息·协议解析时候快速校验
SEQUENCE NUMBER:表示数据包的seqlD ·可用于多路复用·单连接内递增
HEADER SIZE:头部长度·从第14个字节开始计算一直到PAYLOAD前
PROTOCOL ID:编解码方式·有Binary和Compact两种
TRANSFORM ID:压缩方式·如zlib和snappy
INFO ID:传递一些定制的meta信息
PAYLOAD:消息体
网络库
提供易用API
封装底层Socker API
连接管理和事件分发
功能
协议支持
优雅推出、异常处理
性能
应用层buffer减少copy
高性能定时对象池等
稳定性-保障策略
熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
限流:保护被调用方,防止大流量把服务压垮
超时控制:避免浪费资源在不可用节点上
GRPC:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
protobuff语法
方法用 Service 定义,参数用 Message 定义
一个 Message 中主要包含:字段编号和字段类型
字段编号
消息定义中的每个字段都有一个唯一的编号。这些字段编号用来在消息二进制格式中标识字段,在消息类型使用后就不能再更改。
注意,范围1到15中的字段编号需要一个字节进行编码,包括字段编号和字段类型。范围16到2047的字段编号采用两个字节。因此,应该为经常使用的消息元素保留数字1到15的编号。切记为将来可能添加的经常使用的元素留出一些编号。
字段类型
字段类型包含标量类型、组合类型、枚举类型、数组类型、map 类型和嵌套消息;
在 gRPC 中,可以定义四种类型的服务方法:
简单RPC (simple RPC):客户端向服务器发送一个请求,然后得到一个响应,就像普通的函数调用一样:
rpc SimpleRPC(HelloRequest) returns (HelloResponse);
服务端流式RPC (server-side streaming RPC):客户端向服务端发送一个请求,服务端返回客户端一个流。客户端可以从这个流中读取,直到服务端关闭这个流:
rpc ServerSideStreamingRPC(HelloRequest) returns (stream HelloResponse);
客户端流式RPC (client-side streaming RPC):客户端向服务端发起一个流式请求。客户端可以向流中多次写入数据,服务端从流中多次取出数据,直到客户端关闭流。服务端接收完所有数据后,向客户端返回一个普通响应:
rpc ClientSideStreamingRPC(stream HelloRequest) returns (HelloResponse);
双向流式RPC (bidirectional streaming RPC):客户端向服务端发起一个流式请求,服务端向客户端返回一个流式响应。两个流之间相互独立,互不影响:
rpc BidrectionalStreamingRPC(stream HelloRequest) returns (stream HelloResponse);