protocol

package
v0.3.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 14, 2022 License: MIT Imports: 5 Imported by: 0

Documentation

Index

Constants

View Source
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"
)
View Source
const (
	// MuxBlockBaseLen 基本长度, 不包含载荷数据, 因为载荷数据的长度可变
	// - (3 + 6) 是因为考虑到了Struct的对齐
	MuxBlockBaseLen = 1 + 4 + 8 + 2
	// MuxMessageBlockSize Mux模式下Server一次接收多少长度的消息
	MuxMessageBlockSize = 1400
	// MaxPayloadSizeOnMux 在Mux模式上发送的消息一次最多携带多少属于Message的数据
	MaxPayloadSizeOnMux = MuxMessageBlockSize - MuxBlockBaseLen
)
View Source
const (
	// MuxEnabled 指示在Stream中开启Mux的功能
	MuxEnabled uint8 = 0b01
)

Variables

View Source
var (
	FourBytesPadding  = []byte{0, 0, 0, 0}
	EightBytesPadding = []byte{0, 0, 0, 0, 0, 0, 0, 0}
)
View Source
var (
	ErrBadMessage = errors.New("bad message")
)

Functions

func MarshaMessageOnMux added in v0.3.6

func MarshaMessageOnMux(msg *Message, payloads *container.Slice[byte]) error

MarshaMessageOnMux 此API只会序列化Mux功能需要的数据

func MarshalMessage added in v0.3.6

func MarshalMessage(msg *Message, p *container.Slice[byte])

MarshalMessage 根据Msg Header编码出对应的字节Slice *[]byte是为了提供更好的内存复用语义

func MarshalMuxBlock added in v0.3.6

func MarshalMuxBlock(msg *MuxBlock, payloads *container.Slice[byte]) error

func RangePayloads added in v0.3.6

func RangePayloads(msg *Message, p container.Slice[byte], fn func(p []byte, endBefore bool) bool)

RangePayloads 根据头提供的信息逐个遍历所有载荷数据 endAf指示是否是payloads中最后一个参数

func ResetMsg added in v0.3.6

func ResetMsg(msg *Message, resetOther, freeMetaData, usePayload bool, useSize int)

ResetMsg 指定策略的复用,对内存重用更加友好 resetOther指示是否释放|Scope|NameLayout|InstanceName|MethodName|MsgId|Timestamp freeMetaData指示是否要释放存放元数据对应的map[string]sting usePayload指示是否要复用载荷数据 useSize指示复用的slice类型长度的上限,即使指定了usePayload payload数据超过这个长度还是会被释放

func UnmarshalMessage added in v0.3.6

func UnmarshalMessage(p container.Slice[byte], msg *Message) error

UnmarshalMessage 从字节Slice中解码出Message,并返回载荷数据的起始地址

func UnmarshalMessageOnMux added in v0.3.6

func UnmarshalMessageOnMux(data container.Slice[byte], msg *Message) error

UnmarshalMessageOnMux 此API之后反序列化Mux功能所需要的数据

func UnmarshalMuxBlock added in v0.3.6

func UnmarshalMuxBlock(data container.Slice[byte], msg *MuxBlock) error

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 (m *Message) AppendPayloads(p []byte)

func (*Message) BaseLength added in v0.3.6

func (m *Message) BaseLength() int

BaseLength 获取基本数据的长度防止输入过短的数据导致panic

func (*Message) GetCodecType added in v0.3.2

func (m *Message) GetCodecType() uint8

func (*Message) GetEncoderType added in v0.3.2

func (m *Message) GetEncoderType() uint8

func (*Message) GetInstanceName added in v0.3.2

func (m *Message) GetInstanceName() string

func (*Message) GetLength added in v0.3.6

func (m *Message) GetLength() int

GetLength 根据结构计算序列化之后的数据长度

func (*Message) GetMetaData added in v0.3.6

func (m *Message) GetMetaData(key string) string

func (*Message) GetMethodName added in v0.3.2

func (m *Message) GetMethodName() string

func (*Message) GetMsgType added in v0.3.2

func (m *Message) GetMsgType() uint8

func (*Message) MinMux added in v0.3.6

func (m *Message) MinMux() int

func (*Message) PayloadsIterator added in v0.3.6

func (m *Message) PayloadsIterator() *container2.Iterator[[]byte]

func (*Message) RangeMetaData added in v0.3.6

func (m *Message) RangeMetaData(fn func(key, value string) bool)

func (*Message) Reset added in v0.3.2

func (m *Message) Reset()

Reset 给内存复用的操作提供一致性的语义

func (*Message) SetCodecType added in v0.3.2

func (m *Message) SetCodecType(codecType uint8)

func (*Message) SetEncoderType added in v0.3.2

func (m *Message) SetEncoderType(encoderTyp uint8)

func (*Message) SetInstanceName added in v0.3.2

func (m *Message) SetInstanceName(instanceName string)

func (*Message) SetMetaData added in v0.3.6

func (m *Message) SetMetaData(key, value string)

func (*Message) SetMethodName added in v0.3.2

func (m *Message) SetMethodName(methodName string)

func (*Message) SetMsgId added in v0.3.2

func (m *Message) SetMsgId(id uint64)

func (*Message) SetMsgType added in v0.3.2

func (m *Message) SetMsgType(msgTyp uint8)

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) GetFlags added in v0.3.6

func (m *MuxBlock) GetFlags() uint8

func (*MuxBlock) GetMsgId added in v0.3.6

func (m *MuxBlock) GetMsgId() uint64

func (*MuxBlock) GetPayloadLength added in v0.3.6

func (m *MuxBlock) GetPayloadLength() uint16

func (*MuxBlock) GetPayloads added in v0.3.6

func (m *MuxBlock) GetPayloads() []byte

func (*MuxBlock) GetStreamId added in v0.3.6

func (m *MuxBlock) GetStreamId() uint32

func (*MuxBlock) Reset added in v0.3.6

func (m *MuxBlock) Reset()

Reset implement Reset interface

func (*MuxBlock) SetFlags added in v0.3.6

func (m *MuxBlock) SetFlags(flags uint8)

func (*MuxBlock) SetMsgId added in v0.3.6

func (m *MuxBlock) SetMsgId(msgId uint64)

func (*MuxBlock) SetPayloads added in v0.3.6

func (m *MuxBlock) SetPayloads(payloads []byte)

func (*MuxBlock) SetStreamId added in v0.3.6

func (m *MuxBlock) SetStreamId(streamId uint32)

type Reset added in v0.3.2

type Reset interface {
	Reset()
}

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             // 表示此槽位的数据为空
)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL