前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊dubbo-go的RPCInvocation

聊聊dubbo-go的RPCInvocation

原创
作者头像
code4it
修改2020-07-27 10:09:29
3060
修改2020-07-27 10:09:29
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下dubbo-go的RPCInvocation

Invocation

dubbo-go-v1.4.2/protocol/invocation.go

代码语言:javascript
复制
// Invocation ...
type Invocation interface {
    MethodName() string
    ParameterTypes() []reflect.Type
    ParameterValues() []reflect.Value
    Arguments() []interface{}
    Reply() interface{}
    Attachments() map[string]string
    AttachmentsByKey(string, string) string
    Invoker() Invoker
}
  • Invocation定义了MethodName、ParameterTypes、ParameterValues、Arguments、Reply、Attachments、AttachmentsByKey、Invoker方法

RPCInvocation

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
type RPCInvocation struct {
    methodName      string
    parameterTypes  []reflect.Type
    parameterValues []reflect.Value
    arguments       []interface{}
    reply           interface{}
    callBack        interface{}
    attachments     map[string]string
    invoker         protocol.Invoker
    lock            sync.RWMutex
}
  • RPCInvocation定义了methodName、parameterTypes、parameterValues、arguments、reply、callBack、attachments、invoker、lock属性

NewRPCInvocation

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
// NewRPCInvocation ...
func NewRPCInvocation(methodName string, arguments []interface{}, attachments map[string]string) *RPCInvocation {
    return &RPCInvocation{
        methodName:  methodName,
        arguments:   arguments,
        attachments: attachments,
    }
}
  • NewRPCInvocation方法实例化RPCInvocation

NewRPCInvocationWithOptions

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
// NewRPCInvocationWithOptions ...
func NewRPCInvocationWithOptions(opts ...option) *RPCInvocation {
    invo := &RPCInvocation{}
    for _, opt := range opts {
        opt(invo)
    }
    return invo
}
  • NewRPCInvocationWithOptions方法通过option实例化RPCInvocation

option

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
type option func(invo *RPCInvocation)
​
// WithMethodName ...
func WithMethodName(methodName string) option {
    return func(invo *RPCInvocation) {
        invo.methodName = methodName
    }
}
​
// WithParameterTypes ...
func WithParameterTypes(parameterTypes []reflect.Type) option {
    return func(invo *RPCInvocation) {
        invo.parameterTypes = parameterTypes
    }
}
​
// WithParameterValues ...
func WithParameterValues(parameterValues []reflect.Value) option {
    return func(invo *RPCInvocation) {
        invo.parameterValues = parameterValues
    }
}
​
// WithArguments ...
func WithArguments(arguments []interface{}) option {
    return func(invo *RPCInvocation) {
        invo.arguments = arguments
    }
}
​
// WithReply ...
func WithReply(reply interface{}) option {
    return func(invo *RPCInvocation) {
        invo.reply = reply
    }
}
​
// WithCallBack ...
func WithCallBack(callBack interface{}) option {
    return func(invo *RPCInvocation) {
        invo.callBack = callBack
    }
}
​
// WithAttachments ...
func WithAttachments(attachments map[string]string) option {
    return func(invo *RPCInvocation) {
        invo.attachments = attachments
    }
}
​
// WithInvoker ...
func WithInvoker(invoker protocol.Invoker) option {
    return func(invo *RPCInvocation) {
        invo.invoker = invoker
    }
}
  • option提供了WithMethodName、WithParameterTypes、WithParameterValues、WithReply、WithCallBack、WithAttachments、WithInvoker方法

AttachmentsByKey

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
// AttachmentsByKey ...
func (r *RPCInvocation) AttachmentsByKey(key string, defaultValue string) string {
    r.lock.RLock()
    defer r.lock.RUnlock()
    if r.attachments == nil {
        return defaultValue
    }
    value, ok := r.attachments[key]
    if ok {
        return value
    }
    return defaultValue
}
  • AttachmentsByKey方法通过r.attachments[key]获取对应key的值

SetAttachments

dubbo-go-v1.4.2/protocol/invocation/rpcinvocation.go

代码语言:javascript
复制
// SetAttachments ...
func (r *RPCInvocation) SetAttachments(key string, value string) {
    r.lock.Lock()
    defer r.lock.Unlock()
    if r.attachments == nil {
        r.attachments = make(map[string]string)
    }
    r.attachments[key] = value
}
  • SetAttachments方法通过r.attachments[key]给指定key赋值,如果r.attachments为nil则通过make创建

小结

RPCInvocation定义了methodName、parameterTypes、parameterValues、arguments、reply、callBack、attachments、invoker、lock属性;NewRPCInvocation方法实例化RPCInvocation;NewRPCInvocationWithOptions方法通过option实例化RPCInvocation

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Invocation
  • RPCInvocation
  • NewRPCInvocation
  • NewRPCInvocationWithOptions
  • option
  • AttachmentsByKey
  • SetAttachments
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档