mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
新增RawGoNode与RawCastGo接口,支持RPC附带原始数据
This commit is contained in:
@@ -173,7 +173,7 @@ func (slf *Client) AsycCall(rpcHandler IRpcHandler,serviceMethod string,callback
|
||||
request := &RpcRequest{}
|
||||
call.Arg = args
|
||||
call.Seq = slf.generateSeq()
|
||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,false,InParam)
|
||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,false,InParam,nil)
|
||||
slf.AddPending(call)
|
||||
|
||||
bytes,err := processor.Marshal(request.RpcRequestData)
|
||||
@@ -199,16 +199,10 @@ func (slf *Client) AsycCall(rpcHandler IRpcHandler,serviceMethod string,callback
|
||||
return err
|
||||
}
|
||||
|
||||
func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply interface{}) *Call {
|
||||
func (slf *Client) RawGo(noReply bool,serviceMethod string,args []byte,additionParam interface{},reply interface{}) *Call {
|
||||
call := MakeCall()
|
||||
call.Reply = reply
|
||||
call.ServiceMethod = serviceMethod
|
||||
|
||||
InParam,err := processor.Marshal(args)
|
||||
if err != nil {
|
||||
call.Err = err
|
||||
return call
|
||||
}
|
||||
call.Reply = reply
|
||||
|
||||
request := &RpcRequest{}
|
||||
call.Arg = args
|
||||
@@ -216,7 +210,7 @@ func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply
|
||||
if noReply == false {
|
||||
slf.AddPending(call)
|
||||
}
|
||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,noReply,InParam)
|
||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,noReply,args,additionParam)
|
||||
bytes,err := processor.Marshal(request.RpcRequestData)
|
||||
processor.ReleaseRpcRequest(request.RpcRequestData)
|
||||
if err != nil {
|
||||
@@ -240,6 +234,16 @@ func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply
|
||||
return call
|
||||
}
|
||||
|
||||
func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply interface{}) *Call {
|
||||
InParam,err := processor.Marshal(args)
|
||||
if err != nil {
|
||||
call := MakeCall()
|
||||
call.Err = err
|
||||
}
|
||||
|
||||
return slf.RawGo(noReply,serviceMethod,InParam,nil,reply)
|
||||
}
|
||||
|
||||
func (slf *Client) Run(){
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
|
||||
@@ -17,6 +17,7 @@ type JsonRpcRequestData struct {
|
||||
NoReply bool //是否需要返回
|
||||
//packbody
|
||||
InParam []byte
|
||||
AdditionParam interface{}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,13 +55,13 @@ func (slf *JsonProcessor) Unmarshal(data []byte, v interface{}) error{
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (slf *JsonProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
|
||||
func (slf *JsonProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,additionParam interface{}) IRpcRequestData{
|
||||
jsonRpcRequestData := rpcJsonRequestDataPool.Get().(*JsonRpcRequestData)
|
||||
jsonRpcRequestData.Seq = seq
|
||||
jsonRpcRequestData.ServiceMethod = serviceMethod
|
||||
jsonRpcRequestData.NoReply = noReply
|
||||
jsonRpcRequestData.InParam = inParam
|
||||
jsonRpcRequestData.AdditionParam = additionParam
|
||||
return jsonRpcRequestData
|
||||
}
|
||||
|
||||
@@ -96,6 +97,15 @@ func (slf *JsonRpcRequestData) GetInParam() []byte{
|
||||
return slf.InParam
|
||||
}
|
||||
|
||||
func (slf *JsonRpcRequestData) GetParamValue() interface{}{
|
||||
return slf.AdditionParam
|
||||
}
|
||||
|
||||
func (slf *JsonRpcRequestData) GetAdditionParams() IRawAdditionParam{
|
||||
return slf
|
||||
}
|
||||
|
||||
|
||||
func (slf *JsonRpcResponseData) GetSeq() uint64 {
|
||||
return slf.Seq
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package rpc
|
||||
|
||||
import (
|
||||
"github.com/golang/protobuf/proto"
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@@ -22,11 +23,68 @@ func init(){
|
||||
}
|
||||
}
|
||||
|
||||
func (slf *PBRpcRequestData) MakeRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) *PBRpcRequestData{
|
||||
func (m *PBRpcRequestData) GetParamValue() interface{}{
|
||||
if m.GetAddtionParam() == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
switch x := m.AddtionParam.AdditionOneof.(type) {
|
||||
case *AdditionParam_SParam:
|
||||
return x.SParam
|
||||
case *AdditionParam_UParam:
|
||||
return x.UParam
|
||||
case *AdditionParam_StrParam:
|
||||
return x.StrParam
|
||||
case *AdditionParam_BParam:
|
||||
return x.BParam
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PBRpcRequestData) GetAdditionParams() IRawAdditionParam{
|
||||
if m.GetAddtionParam() == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (slf *PBRpcRequestData) MakeRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,inAdditionParam interface{}) *PBRpcRequestData{
|
||||
slf.Seq = proto.Uint64(seq)
|
||||
slf.ServiceMethod = proto.String(serviceMethod)
|
||||
slf.NoReply = proto.Bool(noReply)
|
||||
slf.InParam = inParam
|
||||
|
||||
if inAdditionParam == nil {
|
||||
return slf
|
||||
}
|
||||
|
||||
switch inAdditionParam.(type) {
|
||||
case *int:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_SParam{int64(*inAdditionParam.(*int))}}
|
||||
case *int32:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_SParam{int64(*inAdditionParam.(*int32))}}
|
||||
case *int16:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_SParam{int64(*inAdditionParam.(*int16))}}
|
||||
case *int64:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_SParam{*inAdditionParam.(*int64)}}
|
||||
case *uint:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_UParam{uint64(*inAdditionParam.(*uint))}}
|
||||
case *uint32:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_UParam{uint64(*inAdditionParam.(*uint32))}}
|
||||
case *uint16:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_UParam{uint64(*inAdditionParam.(*uint16))}}
|
||||
case *uint64:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_UParam{*inAdditionParam.(*uint64)}}
|
||||
case *string:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof:&AdditionParam_StrParam{*inAdditionParam.(*string)}}
|
||||
case *[]byte:
|
||||
slf.AddtionParam = &AdditionParam{AdditionOneof: &AdditionParam_BParam{*inAdditionParam.(*[]byte)}}
|
||||
default:
|
||||
panic(fmt.Sprintf("not support type %+v",inAdditionParam))
|
||||
}
|
||||
|
||||
return slf
|
||||
}
|
||||
|
||||
@@ -50,9 +108,9 @@ func (slf *PBProcessor) Unmarshal(data []byte, msg interface{}) error{
|
||||
}
|
||||
|
||||
|
||||
func (slf *PBProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
|
||||
func (slf *PBProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,inAdditionParam interface{}) IRpcRequestData{
|
||||
pPbRpcRequestData := rpcPbRequestDataPool.Get().(*PBRpcRequestData)
|
||||
pPbRpcRequestData.MakeRequest(seq,serviceMethod,noReply,inParam)
|
||||
pPbRpcRequestData.MakeRequest(seq,serviceMethod,noReply,inParam,inAdditionParam)
|
||||
return pPbRpcRequestData
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package rpc
|
||||
type IRpcProcessor interface {
|
||||
Marshal(v interface{}) ([]byte, error) //b表示自定义缓冲区,可以填nil,由系统自动分配
|
||||
Unmarshal(data []byte, v interface{}) error
|
||||
MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData
|
||||
MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,additionParam interface{}) IRpcRequestData
|
||||
MakeRpcResponse(seq uint64,err *RpcError,reply []byte) IRpcResponseData
|
||||
|
||||
ReleaseRpcRequest(rpcRequestData IRpcRequestData)
|
||||
|
||||
14
rpc/rpc.go
14
rpc/rpc.go
@@ -9,8 +9,10 @@ import (
|
||||
type RpcRequest struct {
|
||||
RpcRequestData IRpcRequestData
|
||||
|
||||
bLocalRequest bool
|
||||
localReply interface{}
|
||||
localParam interface{} //本地调用的参数列表
|
||||
localRawParam []byte
|
||||
requestHandle RequestHandler
|
||||
callback *reflect.Value
|
||||
}
|
||||
@@ -33,11 +35,16 @@ func (slf *RpcResponse) Clear() *RpcResponse{
|
||||
return slf
|
||||
}
|
||||
|
||||
type IRawAdditionParam interface {
|
||||
GetParamValue() interface{}
|
||||
}
|
||||
|
||||
type IRpcRequestData interface {
|
||||
GetSeq() uint64
|
||||
GetServiceMethod() string
|
||||
GetInParam() []byte
|
||||
IsNoReply() bool
|
||||
GetAdditionParams() IRawAdditionParam
|
||||
}
|
||||
|
||||
type IRpcResponseData interface {
|
||||
@@ -48,6 +55,13 @@ type IRpcResponseData interface {
|
||||
|
||||
type RequestHandler func(Returns interface{},Err *RpcError)
|
||||
|
||||
type RawAdditionParamNull struct {
|
||||
}
|
||||
|
||||
func (slf *RawAdditionParamNull) GetParamValue() interface{}{
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
type Call struct {
|
||||
Seq uint64
|
||||
|
||||
252
rpc/rpc.pb.go
252
rpc/rpc.pb.go
@@ -20,21 +20,216 @@ var _ = math.Inf
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||
|
||||
type AdditionParam struct {
|
||||
// Types that are valid to be assigned to AdditionOneof:
|
||||
// *AdditionParam_SParam
|
||||
// *AdditionParam_UParam
|
||||
// *AdditionParam_StrParam
|
||||
// *AdditionParam_BParam
|
||||
AdditionOneof isAdditionParam_AdditionOneof `protobuf_oneof:"addition_oneof"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *AdditionParam) Reset() { *m = AdditionParam{} }
|
||||
func (m *AdditionParam) String() string { return proto.CompactTextString(m) }
|
||||
func (*AdditionParam) ProtoMessage() {}
|
||||
func (*AdditionParam) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{0}
|
||||
}
|
||||
|
||||
func (m *AdditionParam) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_AdditionParam.Unmarshal(m, b)
|
||||
}
|
||||
func (m *AdditionParam) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_AdditionParam.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *AdditionParam) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_AdditionParam.Merge(m, src)
|
||||
}
|
||||
func (m *AdditionParam) XXX_Size() int {
|
||||
return xxx_messageInfo_AdditionParam.Size(m)
|
||||
}
|
||||
func (m *AdditionParam) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_AdditionParam.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_AdditionParam proto.InternalMessageInfo
|
||||
|
||||
type isAdditionParam_AdditionOneof interface {
|
||||
isAdditionParam_AdditionOneof()
|
||||
}
|
||||
|
||||
type AdditionParam_SParam struct {
|
||||
SParam int64 `protobuf:"varint,10,opt,name=SParam,oneof"`
|
||||
}
|
||||
|
||||
type AdditionParam_UParam struct {
|
||||
UParam uint64 `protobuf:"varint,11,opt,name=UParam,oneof"`
|
||||
}
|
||||
|
||||
type AdditionParam_StrParam struct {
|
||||
StrParam string `protobuf:"bytes,12,opt,name=StrParam,oneof"`
|
||||
}
|
||||
|
||||
type AdditionParam_BParam struct {
|
||||
BParam []byte `protobuf:"bytes,13,opt,name=BParam,oneof"`
|
||||
}
|
||||
|
||||
func (*AdditionParam_SParam) isAdditionParam_AdditionOneof() {}
|
||||
|
||||
func (*AdditionParam_UParam) isAdditionParam_AdditionOneof() {}
|
||||
|
||||
func (*AdditionParam_StrParam) isAdditionParam_AdditionOneof() {}
|
||||
|
||||
func (*AdditionParam_BParam) isAdditionParam_AdditionOneof() {}
|
||||
|
||||
func (m *AdditionParam) GetAdditionOneof() isAdditionParam_AdditionOneof {
|
||||
if m != nil {
|
||||
return m.AdditionOneof
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *AdditionParam) GetSParam() int64 {
|
||||
if x, ok := m.GetAdditionOneof().(*AdditionParam_SParam); ok {
|
||||
return x.SParam
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *AdditionParam) GetUParam() uint64 {
|
||||
if x, ok := m.GetAdditionOneof().(*AdditionParam_UParam); ok {
|
||||
return x.UParam
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *AdditionParam) GetStrParam() string {
|
||||
if x, ok := m.GetAdditionOneof().(*AdditionParam_StrParam); ok {
|
||||
return x.StrParam
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *AdditionParam) GetBParam() []byte {
|
||||
if x, ok := m.GetAdditionOneof().(*AdditionParam_BParam); ok {
|
||||
return x.BParam
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// XXX_OneofFuncs is for the internal use of the proto package.
|
||||
func (*AdditionParam) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
|
||||
return _AdditionParam_OneofMarshaler, _AdditionParam_OneofUnmarshaler, _AdditionParam_OneofSizer, []interface{}{
|
||||
(*AdditionParam_SParam)(nil),
|
||||
(*AdditionParam_UParam)(nil),
|
||||
(*AdditionParam_StrParam)(nil),
|
||||
(*AdditionParam_BParam)(nil),
|
||||
}
|
||||
}
|
||||
|
||||
func _AdditionParam_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
|
||||
m := msg.(*AdditionParam)
|
||||
// addition_oneof
|
||||
switch x := m.AdditionOneof.(type) {
|
||||
case *AdditionParam_SParam:
|
||||
b.EncodeVarint(10<<3 | proto.WireVarint)
|
||||
b.EncodeVarint(uint64(x.SParam))
|
||||
case *AdditionParam_UParam:
|
||||
b.EncodeVarint(11<<3 | proto.WireVarint)
|
||||
b.EncodeVarint(uint64(x.UParam))
|
||||
case *AdditionParam_StrParam:
|
||||
b.EncodeVarint(12<<3 | proto.WireBytes)
|
||||
b.EncodeStringBytes(x.StrParam)
|
||||
case *AdditionParam_BParam:
|
||||
b.EncodeVarint(13<<3 | proto.WireBytes)
|
||||
b.EncodeRawBytes(x.BParam)
|
||||
case nil:
|
||||
default:
|
||||
return fmt.Errorf("AdditionParam.AdditionOneof has unexpected type %T", x)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func _AdditionParam_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
|
||||
m := msg.(*AdditionParam)
|
||||
switch tag {
|
||||
case 10: // addition_oneof.SParam
|
||||
if wire != proto.WireVarint {
|
||||
return true, proto.ErrInternalBadWireType
|
||||
}
|
||||
x, err := b.DecodeVarint()
|
||||
m.AdditionOneof = &AdditionParam_SParam{int64(x)}
|
||||
return true, err
|
||||
case 11: // addition_oneof.UParam
|
||||
if wire != proto.WireVarint {
|
||||
return true, proto.ErrInternalBadWireType
|
||||
}
|
||||
x, err := b.DecodeVarint()
|
||||
m.AdditionOneof = &AdditionParam_UParam{x}
|
||||
return true, err
|
||||
case 12: // addition_oneof.StrParam
|
||||
if wire != proto.WireBytes {
|
||||
return true, proto.ErrInternalBadWireType
|
||||
}
|
||||
x, err := b.DecodeStringBytes()
|
||||
m.AdditionOneof = &AdditionParam_StrParam{x}
|
||||
return true, err
|
||||
case 13: // addition_oneof.BParam
|
||||
if wire != proto.WireBytes {
|
||||
return true, proto.ErrInternalBadWireType
|
||||
}
|
||||
x, err := b.DecodeRawBytes(true)
|
||||
m.AdditionOneof = &AdditionParam_BParam{x}
|
||||
return true, err
|
||||
default:
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
func _AdditionParam_OneofSizer(msg proto.Message) (n int) {
|
||||
m := msg.(*AdditionParam)
|
||||
// addition_oneof
|
||||
switch x := m.AdditionOneof.(type) {
|
||||
case *AdditionParam_SParam:
|
||||
n += 1 // tag and wire
|
||||
n += proto.SizeVarint(uint64(x.SParam))
|
||||
case *AdditionParam_UParam:
|
||||
n += 1 // tag and wire
|
||||
n += proto.SizeVarint(uint64(x.UParam))
|
||||
case *AdditionParam_StrParam:
|
||||
n += 1 // tag and wire
|
||||
n += proto.SizeVarint(uint64(len(x.StrParam)))
|
||||
n += len(x.StrParam)
|
||||
case *AdditionParam_BParam:
|
||||
n += 1 // tag and wire
|
||||
n += proto.SizeVarint(uint64(len(x.BParam)))
|
||||
n += len(x.BParam)
|
||||
case nil:
|
||||
default:
|
||||
panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
type PBRpcRequestData struct {
|
||||
Seq *uint64 `protobuf:"varint,1,opt,name=Seq" json:"Seq,omitempty"`
|
||||
ServiceMethod *string `protobuf:"bytes,2,opt,name=ServiceMethod" json:"ServiceMethod,omitempty"`
|
||||
NoReply *bool `protobuf:"varint,3,opt,name=NoReply" json:"NoReply,omitempty"`
|
||||
InParam []byte `protobuf:"bytes,4,opt,name=InParam" json:"InParam,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
Seq *uint64 `protobuf:"varint,1,opt,name=Seq" json:"Seq,omitempty"`
|
||||
ServiceMethod *string `protobuf:"bytes,2,opt,name=ServiceMethod" json:"ServiceMethod,omitempty"`
|
||||
NoReply *bool `protobuf:"varint,3,opt,name=NoReply" json:"NoReply,omitempty"`
|
||||
InParam []byte `protobuf:"bytes,4,opt,name=InParam" json:"InParam,omitempty"`
|
||||
AddtionParam *AdditionParam `protobuf:"bytes,5,opt,name=addtionParam" json:"addtionParam,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PBRpcRequestData) Reset() { *m = PBRpcRequestData{} }
|
||||
func (m *PBRpcRequestData) String() string { return proto.CompactTextString(m) }
|
||||
func (*PBRpcRequestData) ProtoMessage() {}
|
||||
func (*PBRpcRequestData) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{0}
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{1}
|
||||
}
|
||||
|
||||
func (m *PBRpcRequestData) XXX_Unmarshal(b []byte) error {
|
||||
@@ -83,6 +278,13 @@ func (m *PBRpcRequestData) GetInParam() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PBRpcRequestData) GetAddtionParam() *AdditionParam {
|
||||
if m != nil {
|
||||
return m.AddtionParam
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PBRpcResponseData struct {
|
||||
Seq *uint64 `protobuf:"varint,1,opt,name=Seq" json:"Seq,omitempty"`
|
||||
Error *string `protobuf:"bytes,2,opt,name=Error" json:"Error,omitempty"`
|
||||
@@ -96,7 +298,7 @@ func (m *PBRpcResponseData) Reset() { *m = PBRpcResponseData{} }
|
||||
func (m *PBRpcResponseData) String() string { return proto.CompactTextString(m) }
|
||||
func (*PBRpcResponseData) ProtoMessage() {}
|
||||
func (*PBRpcResponseData) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{1}
|
||||
return fileDescriptor_77a6da22d6a3feb1, []int{2}
|
||||
}
|
||||
|
||||
func (m *PBRpcResponseData) XXX_Unmarshal(b []byte) error {
|
||||
@@ -139,6 +341,7 @@ func (m *PBRpcResponseData) GetReply() []byte {
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*AdditionParam)(nil), "rpc.AdditionParam")
|
||||
proto.RegisterType((*PBRpcRequestData)(nil), "rpc.PBRpcRequestData")
|
||||
proto.RegisterType((*PBRpcResponseData)(nil), "rpc.PBRpcResponseData")
|
||||
}
|
||||
@@ -146,16 +349,23 @@ func init() {
|
||||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
||||
|
||||
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
||||
// 173 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2c, 0x2a, 0x48, 0xd6,
|
||||
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2e, 0x2a, 0x48, 0x56, 0xaa, 0xe3, 0x12, 0x08, 0x70,
|
||||
0x0a, 0x2a, 0x48, 0x0e, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x71, 0x49, 0x2c, 0x49, 0x14, 0x12,
|
||||
0xe0, 0x62, 0x0e, 0x4e, 0x2d, 0x94, 0x60, 0x54, 0x60, 0xd4, 0x60, 0x09, 0x02, 0x31, 0x85, 0x54,
|
||||
0xb8, 0x78, 0x83, 0x53, 0x8b, 0xca, 0x32, 0x93, 0x53, 0x7d, 0x53, 0x4b, 0x32, 0xf2, 0x53, 0x24,
|
||||
0x98, 0x14, 0x18, 0x35, 0x38, 0x83, 0x50, 0x05, 0x85, 0x24, 0xb8, 0xd8, 0xfd, 0xf2, 0x83, 0x52,
|
||||
0x0b, 0x72, 0x2a, 0x25, 0x98, 0x15, 0x18, 0x35, 0x38, 0x82, 0x60, 0x5c, 0x90, 0x8c, 0x67, 0x5e,
|
||||
0x40, 0x62, 0x51, 0x62, 0xae, 0x04, 0x8b, 0x02, 0xa3, 0x06, 0x4f, 0x10, 0x8c, 0xab, 0x14, 0xc8,
|
||||
0x25, 0x08, 0xb5, 0xbf, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x15, 0x87, 0x03, 0x44, 0xb8, 0x58, 0x5d,
|
||||
0x8b, 0x8a, 0xf2, 0x8b, 0xa0, 0x16, 0x43, 0x38, 0x20, 0x51, 0x84, 0x75, 0x3c, 0x41, 0x10, 0x0e,
|
||||
0x20, 0x00, 0x00, 0xff, 0xff, 0x84, 0xbc, 0x24, 0x3a, 0xe3, 0x00, 0x00, 0x00,
|
||||
// 274 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x90, 0xb1, 0x4e, 0xc3, 0x30,
|
||||
0x10, 0x86, 0x6b, 0xd2, 0x42, 0x7b, 0x4d, 0x50, 0xb0, 0x18, 0x3c, 0x30, 0x58, 0x11, 0x83, 0xa7,
|
||||
0x0e, 0x0c, 0xec, 0x44, 0x20, 0x95, 0x01, 0x54, 0x2e, 0x62, 0x46, 0x56, 0x62, 0x44, 0x24, 0x88,
|
||||
0x5d, 0xc7, 0x20, 0xf1, 0x10, 0xbc, 0x0e, 0xcf, 0x87, 0x0e, 0xa7, 0x45, 0x19, 0xd8, 0xee, 0xbb,
|
||||
0xcf, 0xa7, 0xfb, 0x7d, 0xb0, 0xf0, 0xae, 0x5e, 0x39, 0x6f, 0x83, 0xe5, 0x89, 0x77, 0x75, 0xf1,
|
||||
0xc5, 0x20, 0xbb, 0x6a, 0x9a, 0x36, 0xb4, 0xb6, 0xdb, 0x68, 0xaf, 0xdf, 0xb8, 0x80, 0xc3, 0xea,
|
||||
0xb7, 0x12, 0x20, 0x99, 0x4a, 0xd6, 0x13, 0x1c, 0x98, 0xcc, 0x63, 0x34, 0x4b, 0xc9, 0xd4, 0x94,
|
||||
0x4c, 0x64, 0x7e, 0x06, 0xf3, 0x2a, 0xf8, 0xe8, 0x52, 0xc9, 0xd4, 0x62, 0x3d, 0xc1, 0x7d, 0x87,
|
||||
0xe6, 0xca, 0xe8, 0x32, 0xc9, 0x54, 0x4a, 0x73, 0x91, 0xcb, 0x1c, 0x8e, 0xf5, 0xb0, 0xfc, 0xc9,
|
||||
0x76, 0xc6, 0x3e, 0x17, 0xdf, 0x0c, 0xf2, 0x4d, 0x89, 0xae, 0x46, 0xb3, 0x7d, 0x37, 0x7d, 0xb8,
|
||||
0xd6, 0x41, 0xf3, 0x1c, 0x92, 0xca, 0x6c, 0x05, 0xa3, 0xad, 0x48, 0x25, 0x3f, 0x87, 0xac, 0x32,
|
||||
0xfe, 0xa3, 0xad, 0xcd, 0x9d, 0x09, 0x2f, 0xb6, 0x11, 0x07, 0xb4, 0x15, 0xc7, 0x4d, 0x2e, 0xe0,
|
||||
0xe8, 0xde, 0xa2, 0x71, 0xaf, 0x9f, 0x22, 0x91, 0x4c, 0xcd, 0x71, 0x87, 0x64, 0x6e, 0xe3, 0x7f,
|
||||
0xc5, 0x94, 0x32, 0xe1, 0x0e, 0xf9, 0x25, 0xa4, 0xba, 0x69, 0xf6, 0xe7, 0x10, 0x33, 0xc9, 0xd4,
|
||||
0xf2, 0x82, 0xaf, 0xe8, 0x6e, 0xa3, 0x43, 0xe1, 0xe8, 0x5d, 0xf1, 0x00, 0x27, 0x43, 0xee, 0xde,
|
||||
0xd9, 0xae, 0x37, 0xff, 0x04, 0x3f, 0x85, 0xd9, 0x8d, 0xf7, 0xd6, 0x0f, 0x81, 0x23, 0x50, 0xf7,
|
||||
0x2f, 0x66, 0x8a, 0x11, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x25, 0x65, 0x17, 0xac, 0x01,
|
||||
0x00, 0x00,
|
||||
}
|
||||
|
||||
@@ -3,12 +3,22 @@ syntax = "proto2";
|
||||
|
||||
package rpc;
|
||||
|
||||
message AdditionParam {
|
||||
oneof addition_oneof {
|
||||
int64 SParam = 10;
|
||||
uint64 UParam = 11;
|
||||
string StrParam = 12;
|
||||
bytes BParam = 13;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
message PBRpcRequestData{
|
||||
optional uint64 Seq = 1;
|
||||
optional string ServiceMethod = 2;
|
||||
optional bool NoReply = 3;
|
||||
optional bytes InParam = 4;
|
||||
optional AdditionParam addtionParam = 5;
|
||||
}
|
||||
|
||||
message PBRpcResponseData{
|
||||
|
||||
@@ -43,6 +43,9 @@ type RpcMethodInfo struct {
|
||||
method reflect.Method
|
||||
iparam reflect.Value
|
||||
oParam reflect.Value
|
||||
additionParam reflect.Value
|
||||
//addition *IRawAdditionParam
|
||||
hashAdditionParam bool
|
||||
}
|
||||
|
||||
type RpcHandler struct {
|
||||
@@ -75,6 +78,10 @@ type IRpcHandler interface {
|
||||
GoNode(nodeId int,serviceMethod string,args interface{}) error
|
||||
}
|
||||
|
||||
var rawAdditionParamValueNull reflect.Value
|
||||
func init(){
|
||||
rawAdditionParamValueNull = reflect.ValueOf(&RawAdditionParamNull{})
|
||||
}
|
||||
func (slf *RpcHandler) GetRpcHandler() IRpcHandler{
|
||||
return slf.rpcHandler
|
||||
}
|
||||
@@ -125,16 +132,25 @@ func (slf *RpcHandler) suitableMethods(method reflect.Method) error {
|
||||
return fmt.Errorf("%s The return parameter must be of type error!",method.Name)
|
||||
}
|
||||
|
||||
if typ.NumIn() != 3 {
|
||||
if typ.NumIn() > 4 {
|
||||
return fmt.Errorf("%s The number of input arguments must be 1!",method.Name)
|
||||
}
|
||||
|
||||
if slf.isExportedOrBuiltinType(typ.In(1)) == false || slf.isExportedOrBuiltinType(typ.In(2)) == false {
|
||||
if slf.isExportedOrBuiltinType(typ.In(1)) == false || slf.isExportedOrBuiltinType(typ.In(2)) == false{
|
||||
return fmt.Errorf("%s Unsupported parameter types!",method.Name)
|
||||
}
|
||||
|
||||
rpcMethodInfo.iparam = reflect.New(typ.In(1).Elem()) //append(rpcMethodInfo.iparam,)
|
||||
rpcMethodInfo.oParam = reflect.New(typ.In(2).Elem())
|
||||
parIdx := 1
|
||||
if typ.NumIn() == 4 {
|
||||
if slf.isExportedOrBuiltinType(typ.In(3)) == false {
|
||||
return fmt.Errorf("%s Unsupported parameter types!",method.Name)
|
||||
}
|
||||
rpcMethodInfo.hashAdditionParam = true
|
||||
parIdx++
|
||||
}
|
||||
rpcMethodInfo.iparam = reflect.New(typ.In(parIdx).Elem()) //append(rpcMethodInfo.iparam,)
|
||||
parIdx++
|
||||
rpcMethodInfo.oParam = reflect.New(typ.In(parIdx).Elem())
|
||||
|
||||
rpcMethodInfo.method = method
|
||||
slf.mapfunctons[slf.rpcHandler.GetName()+"."+method.Name] = rpcMethodInfo
|
||||
@@ -213,16 +229,13 @@ func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
|
||||
if request.requestHandle!=nil {
|
||||
request.requestHandle(nil,err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
var paramList []reflect.Value
|
||||
var err error
|
||||
iparam := reflect.New(v.iparam.Type().Elem()).Interface()
|
||||
|
||||
if request.localParam==nil{
|
||||
if request.bLocalRequest == false {
|
||||
err = processor.Unmarshal(request.RpcRequestData.GetInParam(),iparam)
|
||||
if err!=nil {
|
||||
rerr := Errorf("Call Rpc %s Param error %+v",request.RpcRequestData.GetServiceMethod(),err)
|
||||
@@ -232,11 +245,32 @@ func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
|
||||
}
|
||||
}
|
||||
}else {
|
||||
iparam = request.localParam
|
||||
if request.localRawParam!=nil {
|
||||
err = processor.Unmarshal(request.localRawParam,iparam)
|
||||
if err!=nil {
|
||||
rerr := Errorf("Call Rpc %s Param error %+v",request.RpcRequestData.GetServiceMethod(),err)
|
||||
log.Error("%s",rerr.Error())
|
||||
if request.requestHandle!=nil {
|
||||
request.requestHandle(nil, rerr)
|
||||
}
|
||||
}
|
||||
}else {
|
||||
iparam = request.localParam
|
||||
}
|
||||
}
|
||||
|
||||
var oParam reflect.Value
|
||||
paramList = append(paramList,reflect.ValueOf(slf.GetRpcHandler())) //接受者
|
||||
additionParams := request.RpcRequestData.GetAdditionParams()
|
||||
if v.hashAdditionParam == true{
|
||||
if additionParams!=nil && additionParams.GetParamValue()!=nil{
|
||||
additionVal := reflect.ValueOf(additionParams)
|
||||
paramList = append(paramList,additionVal)
|
||||
}else{
|
||||
paramList = append(paramList,rawAdditionParamValueNull)
|
||||
}
|
||||
}
|
||||
|
||||
paramList = append(paramList,reflect.ValueOf(iparam))
|
||||
if request.localReply!=nil {
|
||||
oParam = reflect.ValueOf(request.localReply) //输出参数
|
||||
@@ -312,7 +346,7 @@ func (slf *RpcHandler) goRpc(bCast bool,nodeId int,serviceMethod string,args int
|
||||
return pLocalRpcServer.myselfRpcHandlerGo(sMethod[0],sMethod[1],args,nil)
|
||||
}
|
||||
//其他的rpcHandler的处理器
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,true,sMethod[0],sMethod[1],args,nil)
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,true,sMethod[0],sMethod[1],args,nil,nil,nil)
|
||||
if pCall.Err!=nil {
|
||||
err = pCall.Err
|
||||
}
|
||||
@@ -331,6 +365,61 @@ func (slf *RpcHandler) goRpc(bCast bool,nodeId int,serviceMethod string,args int
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (slf *RpcHandler) rawGoRpc(bCast bool,nodeId int,serviceMethod string,args []byte,additionParam interface{}) error {
|
||||
var pClientList []*Client
|
||||
err := slf.funcRpcClient(nodeId,serviceMethod,&pClientList)
|
||||
if err != nil {
|
||||
log.Error("Call serviceMethod is error:%+v!",err)
|
||||
return err
|
||||
}
|
||||
if len(pClientList) > 1 && bCast == false {
|
||||
log.Error("Cannot call more then 1 node!")
|
||||
return fmt.Errorf("Cannot call more then 1 node!")
|
||||
}
|
||||
|
||||
//2.rpcclient调用
|
||||
//如果调用本结点服务
|
||||
for _,pClient := range pClientList {
|
||||
if pClient.bSelfNode == true {
|
||||
pLocalRpcServer:=slf.funcRpcServer()
|
||||
//判断是否是同一服务
|
||||
sMethod := strings.Split(serviceMethod,".")
|
||||
if len(sMethod)!=2 {
|
||||
serr := fmt.Errorf("Call serviceMethod %s is error!",serviceMethod)
|
||||
log.Error("%+v",serr)
|
||||
if serr!= nil {
|
||||
err = serr
|
||||
}
|
||||
continue
|
||||
}
|
||||
//调用自己rpcHandler处理器
|
||||
if sMethod[0] == slf.rpcHandler.GetName() { //自己服务调用
|
||||
//
|
||||
return pLocalRpcServer.myselfRpcHandlerGo(sMethod[0],sMethod[1],args,nil)
|
||||
}
|
||||
//其他的rpcHandler的处理器
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,true,sMethod[0],sMethod[1],nil,args,nil,additionParam)
|
||||
if pCall.Err!=nil {
|
||||
err = pCall.Err
|
||||
}
|
||||
ReleaseCall(pCall)
|
||||
continue
|
||||
}
|
||||
|
||||
//跨node调用
|
||||
pCall := pClient.RawGo(true,serviceMethod,args,additionParam,nil)
|
||||
if pCall.Err!=nil {
|
||||
err = pCall.Err
|
||||
}
|
||||
ReleaseCall(pCall)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
func (slf *RpcHandler) callRpc(nodeId int,serviceMethod string,args interface{},reply interface{}) error {
|
||||
var pClientList []*Client
|
||||
err := slf.funcRpcClient(nodeId,serviceMethod,&pClientList)
|
||||
@@ -361,7 +450,7 @@ func (slf *RpcHandler) callRpc(nodeId int,serviceMethod string,args interface{},
|
||||
return pLocalRpcServer.myselfRpcHandlerGo(sMethod[0],sMethod[1],args,reply)
|
||||
}
|
||||
//其他的rpcHandler的处理器
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,false,sMethod[0],sMethod[1],args,reply)
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,false,sMethod[0],sMethod[1],args,nil,reply,nil)
|
||||
err = pCall.Done().Err
|
||||
pClient.RemovePending(pCall.Seq)
|
||||
ReleaseCall(pCall)
|
||||
@@ -436,7 +525,6 @@ func (slf *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args interfa
|
||||
}else{
|
||||
fVal.Call([]reflect.Value{reflect.ValueOf(reply),reflect.ValueOf(err)})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//其他的rpcHandler的处理器
|
||||
@@ -447,7 +535,7 @@ func (slf *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args interfa
|
||||
}
|
||||
return nil
|
||||
}
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,false,sMethod[0],sMethod[1],args,reply)
|
||||
pCall := pLocalRpcServer.selfNodeRpcHandlerGo(pClient,false,sMethod[0],sMethod[1],args,nil,reply,nil)
|
||||
err = pCall.Done().Err
|
||||
pClient.RemovePending(pCall.Seq)
|
||||
ReleaseCall(pCall)
|
||||
@@ -500,3 +588,12 @@ func (slf *RpcHandler) GoNode(nodeId int,serviceMethod string,args interface{})
|
||||
func (slf *RpcHandler) CastGo(serviceMethod string,args interface{}) {
|
||||
slf.goRpc(true,0,serviceMethod,args)
|
||||
}
|
||||
|
||||
func (slf *RpcHandler) RawGoNode(nodeId int,serviceMethod string,args []byte,additionParam interface{}) error {
|
||||
return slf.rawGoRpc(false,nodeId,serviceMethod,args,additionParam)
|
||||
}
|
||||
|
||||
func (slf *RpcHandler) RawCastGo(serviceMethod string,args []byte,additionParam interface{}) {
|
||||
slf.goRpc(true,0,serviceMethod,args)
|
||||
}
|
||||
|
||||
|
||||
@@ -98,10 +98,9 @@ func (agent *RpcAgent) Run() {
|
||||
//will close tcpconn
|
||||
break
|
||||
}
|
||||
|
||||
//解析head
|
||||
req := MakeRpcRequest()
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil)
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil,nil)
|
||||
err = processor.Unmarshal(data,req.RpcRequestData)
|
||||
if err != nil {
|
||||
log.Error("rpc Unmarshal request is error: %v", err)
|
||||
@@ -201,7 +200,7 @@ func (slf *Server) myselfRpcHandlerGo(handlerName string,methodName string, args
|
||||
}
|
||||
|
||||
|
||||
func (slf *Server) selfNodeRpcHandlerGo(client *Client,noReply bool,handlerName string,methodName string, args interface{},reply interface{}) *Call {
|
||||
func (slf *Server) selfNodeRpcHandlerGo(client *Client,noReply bool,handlerName string,methodName string, args interface{},rawArgs []byte,reply interface{},additionParam interface{}) *Call {
|
||||
pCall := MakeCall()
|
||||
pCall.Seq = client.generateSeq()
|
||||
|
||||
@@ -214,9 +213,11 @@ func (slf *Server) selfNodeRpcHandlerGo(client *Client,noReply bool,handlerName
|
||||
}
|
||||
req := MakeRpcRequest()
|
||||
|
||||
req.bLocalRequest = true
|
||||
req.localParam = args
|
||||
req.localReply = reply
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
||||
req.localRawParam = rawArgs
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil,additionParam)
|
||||
if noReply == false {
|
||||
client.AddPending(pCall)
|
||||
req.requestHandle = func(Returns interface{},Err *RpcError){
|
||||
@@ -265,7 +266,8 @@ func (slf *Server) selfNodeRpcHandlerAsyncGo(client *Client,callerRpcHandler IRp
|
||||
req := MakeRpcRequest()
|
||||
req.localParam = args
|
||||
req.localReply = reply
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
||||
req.bLocalRequest = true
|
||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil,nil)
|
||||
if noReply == false {
|
||||
client.AddPending(pCall)
|
||||
req.requestHandle = func(Returns interface{},Err *RpcError){
|
||||
|
||||
Reference in New Issue
Block a user