golang rpc框架,支持数据加密传输
MIT License
golang rpc框架,支持以下功能:
在crpc框架使用以下的多层设计,每一个层次有其相应的数据结构
+------------+-------------------+--------------------+-------+
| data frame | encrypt(optional) | compress(optional) | codec |
+------------+-------------------+--------------------+-------+
data frame
: 数据帧,最底层数据结构,直接面向于tcp协议encrypt
: 数据加密层,目前已支持aes和des加密算法compress
: 数据压缩层,目前已支持gzip和zstd压缩算法codec
: 数据序列化层,目前支持[]byte
、http.Request
、http.Response
三种数据结构的序列化数据帧为最基础数据结构,直接作用于tcp链路,其封装格式如下
+-------------+---------+----------+---------+---------+
| Sequence(4) | Size(2) | Crc32(4) | Flag(4) | Payload |
+-------------+---------+----------+---------+---------+
以上内容括号中的数字表示字节数,其中Flag
字段为枚举类型,枚举值如下
+---------+------------+----------+---------+---------+---------+-----------+---------------+
| Open(1) | OpenAck(1) | Close(1) | Data(1) | Ping(1) | Pong(1) | Unused(2) | Stream ID(24) |
+---------+------------+----------+---------+---------+---------+-----------+---------------+
以上内容括号中的数字表示比特位,其中每一个比特位代表一个标志位,互相之间是互斥关系,目前仅使用了Flag
字段第一字节的高6位,由于Stream ID字段仅有3字节,因此crpc中仅支持16777215个stream同时
传输数据
数据加密层用于将原始数据进行加密,在数据加密前会将原始数据的crc32校验码添加到数据尾部作为解密后的校验依据,其封装格式如下:
+----------+----------+
+ Src Data | Crc32(4) |
+----------+----------+
aes
加密算法: aes加密算法使用32字节长度密钥以及16字节的iv进行CBC算法加密des
加密算法: des加密算法使用24字节长度密钥以及8字节的iv进行TripleDES算法加密当给定密钥长度不足时,底层会重复多次密钥内容以保证加密运算的进行
数据压缩层用于将原始数据进行压缩,在数据压缩前会将原始数据的crc32校验码添加到数据尾部作为解压后的校验依据,其封装格式如下:
+----------+----------+
+ Src Data | Crc32(4) |
+----------+----------+
数据编码层用于描述原始数据类型,主要作用于数据的序列化和反序列化过程,数据结构如下:
+---------+---------+
+ Type(1) | Payload |
+---------+---------+
其中Type字段为1字节,表示当前数据类型,定义如下:
0
: 未知数据类型1
: raw data,可反序列化到[]byte2
: http request,可反序列化到http.Request3
: http response,可反序列化到http.Response4
: protobuf,可反序列化到proto.Messagegrpc框架底层使用X-Crpc-Request-Id
字段进行request与response的关联,因此在使用过程中请勿使用该字段。
TODO