#rpc # Transport ```go type TTransport interface { io.ReadWriteCloser // 只有一个方法:Flush(ctx) ContextFlusher // 返回 RemainingBytes ReadSizeProvider // Opens the transport for communication Open() error // Returns true if the transport is open IsOpen() bool } ``` ## TFramedTransport - 结构体成员: - **transport**: `TTransport` // 底层 transptransport - **writeBuf**: `*bytes.Buffer` - **reader**:`bufio.Reader` // 读取底层 transport - **readBuf**: `bytes.Buffer` - **Buffer**:`[4]byte` // - **Read** 方法 - 签名:`Read(buf []byte) (read int, err error)` - 从 readBuf 中读取,buffer 内有就返回,如果为空就表示当前 frame 读完了,需要从底层读取下一个 frame,再重试 Read。 - **readFrame** 方法 - 先使用 ReadFull读取 4 字节的 frame 长度 N,再读取 N 个字节放到 readBuf 中。 - **Write**方法 - 签名:`Write(buf []byte) (int, error)` - 写入到 writeBuf 中 - **Flush** 方法 - 先写 4 字节的长度(大端),再写 writeBuf 中的内容。 > [!summary] > 只是在数据前面加上了四字节的长度。 ## TBufferedTransport - 结构体成员: - `bufio.ReadWriter` - **tp**:`Transport` > [!summary] > 在底层 Transport 上加了一个 `bufio.ReadWriter`,读写直接操作 `bufio.ReadWriter` ```go func NewTBufferedTransport(trans TTransport, bufferSize int) *TBufferedTransport { return &TBufferedTransport{ ReadWriter: bufio.ReadWriter{ Reader: bufio.NewReaderSize(trans, bufferSize), Writer: bufio.NewWriterSize(trans, bufferSize), }, tp: trans, } } ``` ## THeaderTransport - 结构体成员: - **protocolID**: `THeaderProtocolID`, 其包装的 - **ReadFrame** 方法 - 先判断协议,目的是为了兼容老版本的协议,尝试匹配 BinaryProtocol 和 CompactProtocol 的开头部分 - Binnary Protocol:开头的2字节为 0x8001 - Compact Protocol:开头的第一个字节为 0x82,第二个字节的后 5 bit 为 b00001 - 判断协议时先判断 length (4字节)是否匹配老版协议,如果匹配则识别为 UnFramed Binary / Compact - 再判断 length 后面的 magic(2字节)是否匹配老版协议,如果匹配则识别为 Framed Binary / Compact - magic + flag 为 0x0fff0000 则识别为 THeader 协议,然后开始解析 headers -----------