新增rpc被调用时可以异步返回,详情请参照originserver示例

This commit is contained in:
boyce
2020-11-25 17:35:04 +08:00
parent f98f39d470
commit 6b11bd91ec
18 changed files with 240 additions and 1473 deletions

View File

@@ -178,7 +178,7 @@ func (client *Client) AsyncCall(rpcHandler IRpcHandler,serviceMethod string,call
request := &RpcRequest{}
call.Seq = client.generateSeq()
request.RpcRequestData = processor.MakeRpcRequest(client.startSeq,serviceMethod,false,InParam,nil)
request.RpcRequestData = processor.MakeRpcRequest(client.startSeq,serviceMethod,false,InParam)
client.AddPending(call)
bytes,err := processor.Marshal(request.RpcRequestData)
@@ -204,7 +204,7 @@ func (client *Client) AsyncCall(rpcHandler IRpcHandler,serviceMethod string,call
return err
}
func (client *Client) RawGo(processor IRpcProcessor,noReply bool,serviceMethod string,args []byte,additionParam interface{},reply interface{}) *Call {
func (client *Client) RawGo(processor IRpcProcessor,noReply bool,serviceMethod string,args []byte,reply interface{}) *Call {
call := MakeCall()
call.ServiceMethod = serviceMethod
call.Reply = reply
@@ -214,7 +214,7 @@ func (client *Client) RawGo(processor IRpcProcessor,noReply bool,serviceMethod s
if noReply == false {
client.AddPending(call)
}
request.RpcRequestData = processor.MakeRpcRequest(client.startSeq,serviceMethod,noReply,args,additionParam)
request.RpcRequestData = processor.MakeRpcRequest(client.startSeq,serviceMethod,noReply,args)
bytes,err := processor.Marshal(request.RpcRequestData)
processor.ReleaseRpcRequest(request.RpcRequestData)
if err != nil {
@@ -246,7 +246,7 @@ func (client *Client) Go(noReply bool,serviceMethod string, args interface{},rep
call.Err = err
}
return client.RawGo(processor,noReply,serviceMethod,InParam,nil,reply)
return client.RawGo(processor,noReply,serviceMethod,InParam,reply)
}
func (client *Client) Run(){

View File

@@ -17,7 +17,6 @@ type JsonRpcRequestData struct {
NoReply bool //是否需要返回
//packbody
InParam []byte
AdditionParam interface{}
}
type JsonRpcResponseData struct {
@@ -50,13 +49,12 @@ func (jsonProcessor *JsonProcessor) Unmarshal(data []byte, v interface{}) error{
return json.Unmarshal(data,v)
}
func (jsonProcessor *JsonProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,additionParam interface{}) IRpcRequestData{
func (jsonProcessor *JsonProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
jsonRpcRequestData := rpcJsonRequestDataPool.Get().(*JsonRpcRequestData)
jsonRpcRequestData.Seq = seq
jsonRpcRequestData.ServiceMethod = serviceMethod
jsonRpcRequestData.NoReply = noReply
jsonRpcRequestData.InParam = inParam
jsonRpcRequestData.AdditionParam = additionParam
return jsonRpcRequestData
}
@@ -102,14 +100,6 @@ func (jsonRpcRequestData *JsonRpcRequestData) GetInParam() []byte{
return jsonRpcRequestData.InParam
}
func (jsonRpcRequestData *JsonRpcRequestData) GetParamValue() interface{}{
return jsonRpcRequestData.AdditionParam
}
func (jsonRpcRequestData *JsonRpcRequestData) GetAdditionParams() IRawAdditionParam{
return jsonRpcRequestData
}
func (jsonRpcResponseData *JsonRpcResponseData) GetSeq() uint64 {
return jsonRpcResponseData.Seq
}

View File

@@ -1,7 +1,6 @@
package rpc
import (
"fmt"
"github.com/golang/protobuf/proto"
"sync"
)
@@ -23,68 +22,12 @@ func init(){
}
}
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{
func (slf *PBRpcRequestData) MakeRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) *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
}
@@ -105,9 +48,9 @@ func (slf *PBProcessor) Unmarshal(data []byte, msg interface{}) error{
return proto.Unmarshal(data, protoMsg)
}
func (slf *PBProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte,inAdditionParam interface{}) IRpcRequestData{
func (slf *PBProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
pPbRpcRequestData := rpcPbRequestDataPool.Get().(*PBRpcRequestData)
pPbRpcRequestData.MakeRequest(seq,serviceMethod,noReply,inParam,inAdditionParam)
pPbRpcRequestData.MakeRequest(seq,serviceMethod,noReply,inParam)
return pPbRpcRequestData
}

View File

@@ -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,additionParam interface{}) IRpcRequestData
MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData
MakeRpcResponse(seq uint64,err RpcError,reply []byte) IRpcResponseData
ReleaseRpcRequest(rpcRequestData IRpcRequestData)

View File

@@ -23,20 +23,18 @@ type RpcResponse struct {
RpcResponseData IRpcResponseData
}
type Responder = RequestHandler
//var rpcResponsePool sync.Pool
var rpcRequestPool sync.Pool
var rpcCallPool sync.Pool
type IRawAdditionParam interface {
GetParamValue() interface{}
}
type IRpcRequestData interface {
GetSeq() uint64
GetServiceMethod() string
GetInParam() []byte
IsNoReply() bool
GetAdditionParams() IRawAdditionParam
}
type IRpcResponseData interface {
@@ -47,7 +45,6 @@ type IRpcResponseData interface {
type IRawInputArgs interface {
GetRawData() []byte //获取原始数据
GetAdditionParam() interface{} //获取附加数据
DoGc() //处理完成,回收内存
}
@@ -56,8 +53,6 @@ type RpcHandleFinder interface {
}
type RequestHandler func(Returns interface{},Err RpcError)
type RawAdditionParamNull struct {
}
type Call struct {
Seq uint64
@@ -135,6 +130,3 @@ func ReleaseCall(call *Call){
rpcCallPool.Put(call)
}
func (slf *RawAdditionParamNull) GetParamValue() interface{}{
return nil
}

View File

@@ -1,371 +1,253 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.23.0
// protoc (unknown)
// source: rpc.proto
package rpc
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// 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
}
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4
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"`
AddtionParam *AdditionParam `protobuf:"bytes,5,opt,name=addtionParam" json:"addtionParam,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
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"`
}
func (m *PBRpcRequestData) Reset() { *m = PBRpcRequestData{} }
func (m *PBRpcRequestData) String() string { return proto.CompactTextString(m) }
func (*PBRpcRequestData) ProtoMessage() {}
func (x *PBRpcRequestData) Reset() {
*x = PBRpcRequestData{}
if protoimpl.UnsafeEnabled {
mi := &file_rpc_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *PBRpcRequestData) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PBRpcRequestData) ProtoMessage() {}
func (x *PBRpcRequestData) ProtoReflect() protoreflect.Message {
mi := &file_rpc_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PBRpcRequestData.ProtoReflect.Descriptor instead.
func (*PBRpcRequestData) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{1}
return file_rpc_proto_rawDescGZIP(), []int{0}
}
func (m *PBRpcRequestData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PBRpcRequestData.Unmarshal(m, b)
}
func (m *PBRpcRequestData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PBRpcRequestData.Marshal(b, m, deterministic)
}
func (m *PBRpcRequestData) XXX_Merge(src proto.Message) {
xxx_messageInfo_PBRpcRequestData.Merge(m, src)
}
func (m *PBRpcRequestData) XXX_Size() int {
return xxx_messageInfo_PBRpcRequestData.Size(m)
}
func (m *PBRpcRequestData) XXX_DiscardUnknown() {
xxx_messageInfo_PBRpcRequestData.DiscardUnknown(m)
}
var xxx_messageInfo_PBRpcRequestData proto.InternalMessageInfo
func (m *PBRpcRequestData) GetSeq() uint64 {
if m != nil && m.Seq != nil {
return *m.Seq
func (x *PBRpcRequestData) GetSeq() uint64 {
if x != nil && x.Seq != nil {
return *x.Seq
}
return 0
}
func (m *PBRpcRequestData) GetServiceMethod() string {
if m != nil && m.ServiceMethod != nil {
return *m.ServiceMethod
func (x *PBRpcRequestData) GetServiceMethod() string {
if x != nil && x.ServiceMethod != nil {
return *x.ServiceMethod
}
return ""
}
func (m *PBRpcRequestData) GetNoReply() bool {
if m != nil && m.NoReply != nil {
return *m.NoReply
func (x *PBRpcRequestData) GetNoReply() bool {
if x != nil && x.NoReply != nil {
return *x.NoReply
}
return false
}
func (m *PBRpcRequestData) GetInParam() []byte {
if m != nil {
return m.InParam
}
return nil
}
func (m *PBRpcRequestData) GetAddtionParam() *AdditionParam {
if m != nil {
return m.AddtionParam
func (x *PBRpcRequestData) GetInParam() []byte {
if x != nil {
return x.InParam
}
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"`
Reply []byte `protobuf:"bytes,3,opt,name=Reply" json:"Reply,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Seq *uint64 `protobuf:"varint,1,opt,name=Seq" json:"Seq,omitempty"`
Error *string `protobuf:"bytes,2,opt,name=Error" json:"Error,omitempty"`
Reply []byte `protobuf:"bytes,3,opt,name=Reply" json:"Reply,omitempty"`
}
func (m *PBRpcResponseData) Reset() { *m = PBRpcResponseData{} }
func (m *PBRpcResponseData) String() string { return proto.CompactTextString(m) }
func (*PBRpcResponseData) ProtoMessage() {}
func (x *PBRpcResponseData) Reset() {
*x = PBRpcResponseData{}
if protoimpl.UnsafeEnabled {
mi := &file_rpc_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *PBRpcResponseData) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PBRpcResponseData) ProtoMessage() {}
func (x *PBRpcResponseData) ProtoReflect() protoreflect.Message {
mi := &file_rpc_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PBRpcResponseData.ProtoReflect.Descriptor instead.
func (*PBRpcResponseData) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{2}
return file_rpc_proto_rawDescGZIP(), []int{1}
}
func (m *PBRpcResponseData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PBRpcResponseData.Unmarshal(m, b)
}
func (m *PBRpcResponseData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PBRpcResponseData.Marshal(b, m, deterministic)
}
func (m *PBRpcResponseData) XXX_Merge(src proto.Message) {
xxx_messageInfo_PBRpcResponseData.Merge(m, src)
}
func (m *PBRpcResponseData) XXX_Size() int {
return xxx_messageInfo_PBRpcResponseData.Size(m)
}
func (m *PBRpcResponseData) XXX_DiscardUnknown() {
xxx_messageInfo_PBRpcResponseData.DiscardUnknown(m)
}
var xxx_messageInfo_PBRpcResponseData proto.InternalMessageInfo
func (m *PBRpcResponseData) GetSeq() uint64 {
if m != nil && m.Seq != nil {
return *m.Seq
func (x *PBRpcResponseData) GetSeq() uint64 {
if x != nil && x.Seq != nil {
return *x.Seq
}
return 0
}
func (m *PBRpcResponseData) GetError() string {
if m != nil && m.Error != nil {
return *m.Error
func (x *PBRpcResponseData) GetError() string {
if x != nil && x.Error != nil {
return *x.Error
}
return ""
}
func (m *PBRpcResponseData) GetReply() []byte {
if m != nil {
return m.Reply
func (x *PBRpcResponseData) GetReply() []byte {
if x != nil {
return x.Reply
}
return nil
}
func init() {
proto.RegisterType((*AdditionParam)(nil), "rpc.AdditionParam")
proto.RegisterType((*PBRpcRequestData)(nil), "rpc.PBRpcRequestData")
proto.RegisterType((*PBRpcResponseData)(nil), "rpc.PBRpcResponseData")
var File_rpc_proto protoreflect.FileDescriptor
var file_rpc_proto_rawDesc = []byte{
0x0a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x72, 0x70, 0x63,
0x22, 0x58, 0x0a, 0x10, 0x50, 0x42, 0x52, 0x70, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x44, 0x61, 0x74, 0x61, 0x12, 0x0b, 0x0a, 0x03, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28,
0x04, 0x12, 0x15, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x68,
0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0f, 0x0a, 0x07, 0x4e, 0x6f, 0x52, 0x65,
0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x12, 0x0f, 0x0a, 0x07, 0x49, 0x6e, 0x50,
0x61, 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x22, 0x3e, 0x0a, 0x11, 0x50, 0x42,
0x52, 0x70, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12,
0x0b, 0x0a, 0x03, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x12, 0x0d, 0x0a, 0x05,
0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0d, 0x0a, 0x05, 0x52,
0x65, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x3b,
0x72, 0x70, 0x63,
}
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var (
file_rpc_proto_rawDescOnce sync.Once
file_rpc_proto_rawDescData = file_rpc_proto_rawDesc
)
var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 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,
func file_rpc_proto_rawDescGZIP() []byte {
file_rpc_proto_rawDescOnce.Do(func() {
file_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_rpc_proto_rawDescData)
})
return file_rpc_proto_rawDescData
}
var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_rpc_proto_goTypes = []interface{}{
(*PBRpcRequestData)(nil), // 0: rpc.PBRpcRequestData
(*PBRpcResponseData)(nil), // 1: rpc.PBRpcResponseData
}
var file_rpc_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_rpc_proto_init() }
func file_rpc_proto_init() {
if File_rpc_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_rpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PBRpcRequestData); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_rpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PBRpcResponseData); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_rpc_proto_rawDesc,
NumEnums: 0,
NumMessages: 2,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_rpc_proto_goTypes,
DependencyIndexes: file_rpc_proto_depIdxs,
MessageInfos: file_rpc_proto_msgTypes,
}.Build()
File_rpc_proto = out.File
file_rpc_proto_rawDesc = nil
file_rpc_proto_goTypes = nil
file_rpc_proto_depIdxs = nil
}

View File

@@ -1,24 +1,11 @@
syntax = "proto2";
package rpc;
message AdditionParam {
oneof addition_oneof {
int64 SParam = 10;
uint64 UParam = 11;
string StrParam = 12;
bytes BParam = 13;
}
}
option go_package =".;rpc";
message PBRpcRequestData{
optional uint64 Seq = 1;
optional string ServiceMethod = 2;
optional bool NoReply = 3;
optional bytes InParam = 4;
optional AdditionParam addtionParam = 5;
}
message PBRpcResponseData{

View File

@@ -13,17 +13,17 @@ import (
const maxClusterNode int = 128
type FuncRpcClient func(nodeId int,serviceMethod string,client []*Client) (error,int)
type FuncRpcServer func() (*Server)
var NilError = reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
var nilError = reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
type RpcError string
var noError RpcError
var NilError RpcError
func (e RpcError) Error() string {
return string(e)
}
func ConvertError(e error) RpcError{
if e == nil {
return noError
return NilError
}
rpcErr := RpcError(e.Error())
@@ -41,8 +41,7 @@ type RpcMethodInfo struct {
inParamValue reflect.Value
inParam interface{}
outParamValue reflect.Value
additionParam reflect.Value
hasAdditionParam bool
hasResponder bool
rpcProcessorType RpcProcessorType
}
@@ -78,10 +77,14 @@ type IRpcHandler interface {
IsSingleCoroutine() bool
}
var rawAdditionParamValueNull reflect.Value
func init(){
rawAdditionParamValueNull = reflect.ValueOf(&RawAdditionParamNull{})
func reqHandlerNull(Returns interface{},Err RpcError) {
}
var requestHandlerNull reflect.Value
func init(){
requestHandlerNull = reflect.ValueOf(reqHandlerNull)
}
func (handler *RpcHandler) GetRpcHandler() IRpcHandler{
return handler.rpcHandler
}
@@ -137,9 +140,9 @@ func (handler *RpcHandler) suitableMethods(method reflect.Method) error {
//1.判断第一个参数
var parIdx int = 1
if typ.In(parIdx).String() == "rpc.IRawAdditionParam" {
if typ.In(parIdx).String() == "rpc.RequestHandler" {
parIdx += 1
rpcMethodInfo.hasAdditionParam = true
rpcMethodInfo.hasResponder = true
}
for i:= parIdx ;i<typ.NumIn();i++{
@@ -208,7 +211,7 @@ func (handler *RpcHandler) HandlerRpcResponseCB(call *Call){
}()
if call.Err == nil {
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),NilError})
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),nilError})
}else{
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),reflect.ValueOf(call.Err)})
}
@@ -287,13 +290,12 @@ func (handler *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
}
paramList = append(paramList,reflect.ValueOf(handler.GetRpcHandler())) //接受者
additionParams := request.RpcRequestData.GetAdditionParams()
if v.hasAdditionParam == true{
if additionParams!=nil && additionParams.GetParamValue()!=nil{
additionVal := reflect.ValueOf(additionParams)
paramList = append(paramList,additionVal)
if v.hasResponder == true {
if request.requestHandle!=nil {
responder := reflect.ValueOf(request.requestHandle)
paramList = append(paramList,responder)
}else{
paramList = append(paramList,rawAdditionParamValueNull)
paramList = append(paramList,requestHandlerNull)
}
}
@@ -308,8 +310,8 @@ func (handler *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
oParam = reflect.New(v.outParamValue.Type().Elem())
}
paramList = append(paramList,oParam) //输出参数
}else if request.requestHandle != nil { //调用方有返回值,但被调用函数没有返回参数
rErr := "Call Rpc "+request.RpcRequestData.GetServiceMethod()+"without return parameter!"
}else if request.requestHandle != nil && v.hasResponder==false{ //调用方有返回值,但被调用函数没有返回参数
rErr := "Call Rpc "+request.RpcRequestData.GetServiceMethod()+" without return parameter!"
log.Error(rErr)
request.requestHandle(nil, RpcError(rErr))
return
@@ -320,7 +322,7 @@ func (handler *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
err = errInter.(error)
}
if request.requestHandle!=nil {
if request.requestHandle!=nil && v.hasResponder==false {
request.requestHandle(oParam.Interface(), ConvertError(err))
}
}
@@ -503,7 +505,7 @@ func (handler *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args int
if serviceName == handler.rpcHandler.GetName() { //自己服务调用
err := pLocalRpcServer.myselfRpcHandlerGo(serviceName,serviceMethod,args,reply)
if err == nil {
fVal.Call([]reflect.Value{reflect.ValueOf(reply),NilError})
fVal.Call([]reflect.Value{reflect.ValueOf(reply),nilError})
}else{
fVal.Call([]reflect.Value{reflect.ValueOf(reply),reflect.ValueOf(err)})
}
@@ -618,7 +620,7 @@ func (handler *RpcHandler) RawGoNode(rpcProcessorType RpcProcessorType,nodeId in
}
//跨node调用
pCall := pClientList[i].RawGo(processor,true,serviceMethod,args.GetRawData(),args.GetAdditionParam(),nil)
pCall := pClientList[i].RawGo(processor,true,serviceMethod,args.GetRawData(),nil)
args.DoGc()
if pCall.Err!=nil {
err = pCall.Err

View File

@@ -129,7 +129,7 @@ func (agent *RpcAgent) Run() {
//解析head
req := MakeRpcRequest()
req.rpcProcessor = processor
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil,nil)
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil)
err = processor.Unmarshal(data[1:],req.RpcRequestData)
agent.conn.ReleaseReadMsg(data)
if err != nil {
@@ -252,12 +252,8 @@ func (server *Server) selfNodeRpcHandlerGo(processor IRpcProcessor,client *Clien
if processor == nil {
_,processor = GetProcessorType(args)
}
var additionParam interface{}
if inputArgs!=nil {
additionParam = inputArgs.GetAdditionParam()
}
req.RpcRequestData = processor.MakeRpcRequest(0, serviceMethod,noReply,nil,additionParam)
req.RpcRequestData = processor.MakeRpcRequest(0, serviceMethod,noReply,nil)
req.rpcProcessor = processor
if noReply == false {
client.AddPending(pCall)
@@ -308,7 +304,7 @@ func (server *Server) selfNodeRpcHandlerAsyncGo(client *Client,callerRpcHandler
req.bLocalRequest = true
_,processor := GetProcessorType(args)
req.rpcProcessor =processor
req.RpcRequestData = processor.MakeRpcRequest(0,serviceMethod,noReply,nil,nil)
req.RpcRequestData = processor.MakeRpcRequest(0,serviceMethod,noReply,nil)
if noReply == false {
client.AddPending(pCall)
req.requestHandle = func(Returns interface{},Err RpcError){