motan剖析之传输协议

motan中默认使用motan2作为数据传输协议,实现位于src/github.com/weibocom/motan-go/protocol目录中

其中主要是MessageHeader结构体,Header的MsgType中使用按位保留了大量信息,包括

  • 第一位: 是否为request
  • 第二位: 是否使用代理
  • 第三位: 是否oneway(单向调用)
  • 第四位: 是否gzip压缩
  • 第五位: 是否心跳

VersionStatus中使用位保存了versionstatus信息

使用样例见src/github.com/weibocom/motan-go/protocol/motanProtocol_test.go文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//motan消息头
type Header struct {
Magic uint16
MsgType uint8
VersionStatus uint8
Serialize uint8
RequestID uint64
}
func (h *Header) GetVersion() int //版本
func (h *Header) GetVersion() int
func (h *Header) SetHeartbeat(isHeartbeat bool) //是否心跳
func (h *Header) IsHeartbeat()
func (h *Header) SetGzip(isgzip bool) //设置是否使用gzip
func (h *Header) IsGzip() bool
func (h *Header) SetOneWay(isOneWay bool) //oneway
func (h *Header) IsOneWay() bool
func (h *Header) SetProxy(isProxy bool) //代理
func (h *Header) IsProxy() bool
func (h *Header) SetRequest(isRequest bool) //设置request标识
func (h *Header) isRequest() bool
func (h *Header) SetStatus(status int) error //状态
func (h *Header) GetStatus() int
func BuildHeader(msgType int, proxy bool, serialize int, requestID uint64, msgStatus int) *Header
//motan消息结构体
type Message struct {
Header *Header //消息头
Metadata *motan.StringMap //消息的附加meta信息,motan.StringMap是一个线程安全的map数据结构
Body []byte //消息体 (存储序列化后待传输的数据)
Type int //类型 暂时没使用
}
func (msg *Message) Encode() (buf *motan.BytesBuffer)
func (msg *Message) Clone() interface{}
func Decode(buf *bufio.Reader) (msg *Message, err error)
//将motan协议消息结构转换为motan.Request/Response结构
func ConvertToRequest(request *Message, serialize motan.Serialization) (motan.Request, error)
func ConvertToResponse(response *Message, serialize motan.Serialization) (motan.Response, error)
//将motan.Request/Response结构转换为motan协议消息结构
func ConvertToReqMessage(request motan.Request, serialize motan.Serialization) (*Message, error)
func ConvertToResMessage(response motan.Response, serialize motan.Serialization) (*Message, error)