Documentation ¶
Index ¶
- Constants
- Variables
- func MarshaMessageOnMux(msg *Message, payloads *container.Slice[byte]) error
- func MarshalMessage(msg *Message, p *container.Slice[byte])
- func MarshalMuxBlock(msg *MuxBlock, payloads *container.Slice[byte]) error
- func RangePayloads(msg *Message, p container.Slice[byte], fn func(p []byte, endBefore bool) bool)
- func ResetMsg(msg *Message, resetOther, freeMetaData, usePayload bool, useSize int)
- func UnmarshalMessage(p container.Slice[byte], msg *Message) error
- func UnmarshalMessageOnMux(data container.Slice[byte], msg *Message) error
- func UnmarshalMuxBlock(data container.Slice[byte], msg *MuxBlock) error
- type Message
- func (m *Message) AppendPayloads(p []byte)
- func (m *Message) BaseLength() int
- func (m *Message) GetCodecType() uint8
- func (m *Message) GetEncoderType() uint8
- func (m *Message) GetInstanceName() string
- func (m *Message) GetLength() int
- func (m *Message) GetMetaData(key string) string
- func (m *Message) GetMethodName() string
- func (m *Message) GetMsgType() uint8
- func (m *Message) MinMux() int
- func (m *Message) PayloadsIterator() *container2.Iterator[[]byte]
- func (m *Message) RangeMetaData(fn func(key, value string) bool)
- func (m *Message) Reset()
- func (m *Message) SetCodecType(codecType uint8)
- func (m *Message) SetEncoderType(encoderTyp uint8)
- func (m *Message) SetInstanceName(instanceName string)
- func (m *Message) SetMetaData(key, value string)
- func (m *Message) SetMethodName(methodName string)
- func (m *Message) SetMsgId(id uint64)
- func (m *Message) SetMsgType(msgTyp uint8)
- type MuxBlock
- func (m *MuxBlock) GetFlags() uint8
- func (m *MuxBlock) GetMsgId() uint64
- func (m *MuxBlock) GetPayloadLength() uint16
- func (m *MuxBlock) GetPayloads() []byte
- func (m *MuxBlock) GetStreamId() uint32
- func (m *MuxBlock) Reset()
- func (m *MuxBlock) SetFlags(flags uint8)
- func (m *MuxBlock) SetMsgId(msgId uint64)
- func (m *MuxBlock) SetPayloads(payloads []byte)
- func (m *MuxBlock) SetStreamId(streamId uint32)
- type Reset
- type Type
Constants ¶
const ( MagicNumber uint8 = 0x45 // MessageCall 表示这是一条调用的消息 MessageCall uint8 = 0x10 // MessageReturn 表示这是一条调用返回消息 MessageReturn uint8 = 0x18 // MessageContextCancel 用户服务端接收的context.Context的取消API MessageContextCancel uint8 = 0x24 // MessagePing Ping消息 MessagePing uint8 = 0x33 // MessagePong Pong消息 MessagePong uint8 = 0x35 // MessageBaseLen Message的基本长度 MessageBaseLen = 4 + 4 + 8 DefaultEncodingType uint8 = 0 // text == json DefaultCodecType uint8 = 0 // encoding == text ErrorCode string = "code" ErrorMessage string = "message" ErrorMore string = "bin" )
const ( // MuxBlockBaseLen 基本长度, 不包含载荷数据, 因为载荷数据的长度可变 // - (3 + 6) 是因为考虑到了Struct的对齐 MuxBlockBaseLen = 1 + 4 + 8 + 2 // MuxMessageBlockSize Mux模式下Server一次接收多少长度的消息 MuxMessageBlockSize = 1400 // MaxPayloadSizeOnMux 在Mux模式上发送的消息一次最多携带多少属于Message的数据 MaxPayloadSizeOnMux = MuxMessageBlockSize - MuxBlockBaseLen )
const ( // MuxEnabled 指示在Stream中开启Mux的功能 MuxEnabled uint8 = 0b01 )
Variables ¶
var ( FourBytesPadding = []byte{0, 0, 0, 0} EightBytesPadding = []byte{0, 0, 0, 0, 0, 0, 0, 0} )
var (
ErrBadMessage = errors.New("bad message")
)
Functions ¶
func MarshaMessageOnMux ¶ added in v0.3.6
MarshaMessageOnMux 此API只会序列化Mux功能需要的数据
func MarshalMessage ¶ added in v0.3.6
MarshalMessage 根据Msg Header编码出对应的字节Slice *[]byte是为了提供更好的内存复用语义
func MarshalMuxBlock ¶ added in v0.3.6
func RangePayloads ¶ added in v0.3.6
RangePayloads 根据头提供的信息逐个遍历所有载荷数据 endAf指示是否是payloads中最后一个参数
func ResetMsg ¶ added in v0.3.6
ResetMsg 指定策略的复用,对内存重用更加友好 resetOther指示是否释放|Scope|NameLayout|InstanceName|MethodName|MsgId|Timestamp freeMetaData指示是否要释放存放元数据对应的map[string]sting usePayload指示是否要复用载荷数据 useSize指示复用的slice类型长度的上限,即使指定了usePayload payload数据超过这个长度还是会被释放
func UnmarshalMessage ¶ added in v0.3.6
UnmarshalMessage 从字节Slice中解码出Message,并返回载荷数据的起始地址
func UnmarshalMessageOnMux ¶ added in v0.3.6
UnmarshalMessageOnMux 此API之后反序列化Mux功能所需要的数据
Types ¶
type Message ¶
type Message struct { // int/uint数值统一使用大端序 // [0] == Magic (魔数,表示这是由littlerpc客户端发起或者服务端回复) // [1] == MsgType (call/return & ping/pong) // [2] == Encoding (default text/gzip) // [3] == CodecType (default json) Scope [4]uint8 // 消息ID,用于表示一次完整的call/return的回复 MsgId uint64 // 载荷数据的总长度 PayloadLength uint32 // 实例名和调用方法名的布局 // InstanceName-Size|MethodName-Size // TODO 去除不必要的表示, 在Serialization/UnSerialization时存在即可 NameLayout [2]uint32 // 实例名 InstanceName string // 要调用的方法名 MethodName string // NOTE: // 有效载荷和元数据的范围 // 在Mux模式中MetaData及其Desc必须能在一个MuxBlock下被装下,否则将会丢失数据 // 元数据的布局 // NMetaData(4 Byte)|Key-Size(4 Byte)|Value-Size(4 Byte)|Key|Size // Example : // "hello":"world","world:hello" // OutPut: // 0x00000002|0x00000005|0x00000005|hello|world|0x00000005|0x00000005|world|hello MetaData *container2.SliceMap[string, string] // 有效载荷数据的布局描述 // Format : // NArgs(4 Byte)|Arg1-Size(4 Byte)|Arg2-Size(4 Byte)|Arg3-Size(4 Byte) // Example : // {"mypyload1":"haha"},{"mypyload2":"hehe"} // OutPut: // 0x00000002|0x00000014|0x00000014 PayloadLayout container2.Slice[uint32] // 调用参数序列化后的载荷数据 // 如果被压缩了那么在反序列化时,最后剩下的数据均为参数载荷 Payloads container2.Slice[byte] }
Message 是对一次RPC调用传递的数据的描述 封装的方法均不是线程安全的 DecodeHeader会修改一些内部值,调用时需要注意顺序 为了使用一致性的API,在访问内部一些简单的属性时,请使用Getxx方法 在设置一些值的过程中可能需要调整其它值,所以请使用Setxx方法
func NewMessage ¶ added in v0.3.2
func NewMessage() *Message
func (*Message) AppendPayloads ¶ added in v0.3.2
func (*Message) BaseLength ¶ added in v0.3.6
BaseLength 获取基本数据的长度防止输入过短的数据导致panic
func (*Message) GetCodecType ¶ added in v0.3.2
func (*Message) GetEncoderType ¶ added in v0.3.2
func (*Message) GetInstanceName ¶ added in v0.3.2
func (*Message) GetMetaData ¶ added in v0.3.6
func (*Message) GetMethodName ¶ added in v0.3.2
func (*Message) GetMsgType ¶ added in v0.3.2
func (*Message) PayloadsIterator ¶ added in v0.3.6
func (m *Message) PayloadsIterator() *container2.Iterator[[]byte]
func (*Message) RangeMetaData ¶ added in v0.3.6
func (*Message) SetCodecType ¶ added in v0.3.2
func (*Message) SetEncoderType ¶ added in v0.3.2
func (*Message) SetInstanceName ¶ added in v0.3.2
func (*Message) SetMetaData ¶ added in v0.3.6
func (*Message) SetMethodName ¶ added in v0.3.2
func (*Message) SetMsgType ¶ added in v0.3.2
type MuxBlock ¶ added in v0.3.6
type MuxBlock struct { // Flags可以标记是否开启了Mux Flags uint8 // 通过连接的流的Id // 在开启Mux的时候一个连接中可能会有多个流的数据 StreamId uint32 // 通过此流传输的消息的Id MsgId uint64 // 消息的载荷数据长度 PayloadLength uint16 // 消息的载荷数据 Payloads container.Slice[byte] }
MuxBlock 对一次Mux中的消息帧描述 StreamId必须确保Server和多个Client之间唯一
func (*MuxBlock) GetPayloadLength ¶ added in v0.3.6
func (*MuxBlock) GetPayloads ¶ added in v0.3.6
func (*MuxBlock) GetStreamId ¶ added in v0.3.6
func (*MuxBlock) SetPayloads ¶ added in v0.3.6
func (*MuxBlock) SetStreamId ¶ added in v0.3.6
type Type ¶
type Type uint8
const ( String Type = (iota + 1) << 1 Boolean // 1B Byte // 1B Long // 4B Integer // 8B ULong // 4B UInteger // 8B Float // 4B Double // 8B Array // 在go里表示数组和切片 Struct // 用于表示class/struct Map // 通用的Map类型 Pointer // 表示一个指针或者暗含一个指针,这个值不允许传输时使用,只能用于类型验证 Interface // 通用的接口类型 ServerError // 用于附加类型,用于区别是正常返回的错误还是Server遇到比如解析Json失败传回的错误 Null // 表示此槽位的数据为空 )