#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
-----------