序
本文只有钻研一下dubbo-go的DubboPackage
DubboPackage
dubbo-go-v1.4.2/protocol/dubbo/codec.go
//CallType call typetype CallType int32const ( // CT_UNKNOWN unknown call type CT_UNKNOWN CallType = 0 // CT_OneWay call one way CT_OneWay CallType = 1 // CT_TwoWay call in request/response CT_TwoWay CallType = 2)// SequenceType ...type SequenceType int64// DubboPackage ...type DubboPackage struct { Header hessian.DubboHeader Service hessian.Service Body interface{} Err error}
- DubboPackage定义了Header、Service、Body、Err属性
Marshal
dubbo-go-v1.4.2/protocol/dubbo/codec.go
// Marshal ...func (p *DubboPackage) Marshal() (*bytes.Buffer, error) { codec := hessian.NewHessianCodec(nil) pkg, err := codec.Write(p.Service, p.Header, p.Body) if err != nil { return nil, perrors.WithStack(err) } return bytes.NewBuffer(pkg), nil}
- Marshal办法通过hessian.NewHessianCodec(nil)创立codec,之后执行bytes.NewBuffer(pkg)
Unmarshal
dubbo-go-v1.4.2/protocol/dubbo/codec.go
// Unmarshal ...func (p *DubboPackage) Unmarshal(buf *bytes.Buffer, opts ...interface{}) error { // fix issue https://github.com/apache/dubbo-go/issues/380 bufLen := buf.Len() if bufLen < hessian.HEADER_LENGTH { return perrors.WithStack(hessian.ErrHeaderNotEnough) } codec := hessian.NewHessianCodec(bufio.NewReaderSize(buf, bufLen)) // read header err := codec.ReadHeader(&p.Header) if err != nil { return perrors.WithStack(err) } if len(opts) != 0 { // for client client, ok := opts[0].(*Client) if !ok { return perrors.Errorf("opts[0] is not of type *Client") } if p.Header.Type&hessian.PackageRequest != 0x00 { // size of this array must be '7' // https://github.com/apache/dubbo-go-hessian2/blob/master/request.go#L272 p.Body = make([]interface{}, 7) } else { pendingRsp, ok := client.pendingResponses.Load(SequenceType(p.Header.ID)) if !ok { return perrors.Errorf("client.GetPendingResponse(%v) = nil", p.Header.ID) } p.Body = &hessian.Response{RspObj: pendingRsp.(*PendingResponse).response.reply} } } // read body err = codec.ReadBody(p.Body) return perrors.WithStack(err)}
- Unmarshal办法先通过hessian.NewHessianCodec(bufio.NewReaderSize(buf, bufLen))创立codec,而后执行codec.ReadHeader(&p.Header)读取header,最初通过codec.ReadBody(p.Body)读取body
PendingResponse
dubbo-go-v1.4.2/protocol/dubbo/codec.go
// PendingResponse ...type PendingResponse struct { seq uint64 err error start time.Time readStart time.Time callback common.AsyncCallback response *Response done chan struct{}}// NewPendingResponse ...func NewPendingResponse() *PendingResponse { return &PendingResponse{ start: time.Now(), response: &Response{}, done: make(chan struct{}), }}
- NewPendingResponse实例化了PendingResponse
GetCallResponse
dubbo-go-v1.4.2/protocol/dubbo/codec.go
// GetCallResponse ...func (r PendingResponse) GetCallResponse() common.CallbackResponse { return AsyncCallbackResponse{ Cause: r.err, Start: r.start, ReadStart: r.readStart, Reply: r.response, }}
- GetCallResponse办法实例化AsyncCallbackResponse
小结
DubboPackage定义了Header、Service、Body、Err属性;codec.go提供了Marshal、Unmarshal办法用于读写DubboPackage
doc
- codec