mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
rpc临时内存池优化
This commit is contained in:
@@ -56,7 +56,7 @@ func (slf *Client) Connect(addr string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (slf *Client) AsycGo(rpcHandler IRpcHandler,serviceMethod string,callback reflect.Value, args interface{},replyParam interface{}) error {
|
func (slf *Client) AsycGo(rpcHandler IRpcHandler,serviceMethod string,callback reflect.Value, args interface{},replyParam interface{}) error {
|
||||||
call := new(Call)
|
call := MakeCall()
|
||||||
call.Reply = replyParam
|
call.Reply = replyParam
|
||||||
call.callback = &callback
|
call.callback = &callback
|
||||||
call.rpcHandler = rpcHandler
|
call.rpcHandler = rpcHandler
|
||||||
@@ -72,16 +72,13 @@ func (slf *Client) AsycGo(rpcHandler IRpcHandler,serviceMethod string,callback r
|
|||||||
slf.pendingLock.Lock()
|
slf.pendingLock.Lock()
|
||||||
slf.startSeq += 1
|
slf.startSeq += 1
|
||||||
call.Seq = slf.startSeq
|
call.Seq = slf.startSeq
|
||||||
//request.Seq = slf.startSeq
|
|
||||||
//request.NoReply = false
|
|
||||||
//request.ServiceMethod = serviceMethod
|
|
||||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,false,InParam)
|
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,false,InParam)
|
||||||
slf.pending[call.Seq] = call
|
slf.pending[call.Seq] = call//如果下面发送失败,将会一一直存在这里
|
||||||
slf.pendingLock.Unlock()
|
slf.pendingLock.Unlock()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bytes,err := processor.Marshal(request.RpcRequestData)
|
bytes,err := processor.Marshal(request.RpcRequestData)
|
||||||
|
processor.ReleaseRpcRequest(request.RpcRequestData)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -97,8 +94,7 @@ func (slf *Client) AsycGo(rpcHandler IRpcHandler,serviceMethod string,callback r
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply interface{}) *Call {
|
func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply interface{}) *Call {
|
||||||
call := new(Call)
|
call := MakeCall()
|
||||||
call.done = make(chan *Call,1)
|
|
||||||
call.Reply = reply
|
call.Reply = reply
|
||||||
call.ServiceMethod = serviceMethod
|
call.ServiceMethod = serviceMethod
|
||||||
|
|
||||||
@@ -109,19 +105,15 @@ func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply
|
|||||||
}
|
}
|
||||||
|
|
||||||
request := &RpcRequest{}
|
request := &RpcRequest{}
|
||||||
//request.NoReply = noReply
|
|
||||||
call.Arg = args
|
call.Arg = args
|
||||||
slf.pendingLock.Lock()
|
slf.pendingLock.Lock()
|
||||||
slf.startSeq += 1
|
slf.startSeq += 1
|
||||||
call.Seq = slf.startSeq
|
call.Seq = slf.startSeq
|
||||||
//request.Seq = slf.startSeq
|
|
||||||
// request.ServiceMethod = serviceMethod
|
|
||||||
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,noReply,InParam)
|
request.RpcRequestData = processor.MakeRpcRequest(slf.startSeq,serviceMethod,noReply,InParam)
|
||||||
slf.pending[call.Seq] = call
|
//slf.pending[call.Seq] = call
|
||||||
slf.pendingLock.Unlock()
|
slf.pendingLock.Unlock()
|
||||||
|
|
||||||
|
|
||||||
bytes,err := processor.Marshal(request.RpcRequestData)
|
bytes,err := processor.Marshal(request.RpcRequestData)
|
||||||
|
processor.ReleaseRpcRequest(request.RpcRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
call.Err = err
|
call.Err = err
|
||||||
return call
|
return call
|
||||||
@@ -140,37 +132,6 @@ func (slf *Client) Go(noReply bool,serviceMethod string, args interface{},reply
|
|||||||
return call
|
return call
|
||||||
}
|
}
|
||||||
|
|
||||||
type RequestHandler func(Returns interface{},Err *RpcError)
|
|
||||||
|
|
||||||
type RpcRequest struct {
|
|
||||||
RpcRequestData IRpcRequestData
|
|
||||||
|
|
||||||
//packhead
|
|
||||||
/*Seq uint64 // sequence number chosen by client
|
|
||||||
ServiceMethod string // format: "Service.Method"
|
|
||||||
NoReply bool //是否需要返回
|
|
||||||
//packbody
|
|
||||||
InParam []byte
|
|
||||||
*/
|
|
||||||
//other data
|
|
||||||
localReply interface{}
|
|
||||||
localParam interface{} //本地调用的参数列表
|
|
||||||
requestHandle RequestHandler
|
|
||||||
callback *reflect.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
type RpcResponse struct {
|
|
||||||
RpcResponeData IRpcResponseData
|
|
||||||
/*
|
|
||||||
//head
|
|
||||||
Seq uint64 // sequence number chosen by client
|
|
||||||
Err *RpcError
|
|
||||||
|
|
||||||
//returns
|
|
||||||
Reply []byte*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func (slf *Client) Run(){
|
func (slf *Client) Run(){
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -190,6 +151,7 @@ func (slf *Client) Run(){
|
|||||||
//1.解析head
|
//1.解析head
|
||||||
respone := &RpcResponse{}
|
respone := &RpcResponse{}
|
||||||
respone.RpcResponeData =processor.MakeRpcResponse(0,nil,nil)
|
respone.RpcResponeData =processor.MakeRpcResponse(0,nil,nil)
|
||||||
|
defer processor.ReleaseRpcRespose(respone.RpcResponeData)
|
||||||
err = processor.Unmarshal(bytes,respone.RpcResponeData)
|
err = processor.Unmarshal(bytes,respone.RpcResponeData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("rpcClient Unmarshal head error,error:%+v",err)
|
log.Error("rpcClient Unmarshal head error,error:%+v",err)
|
||||||
|
|||||||
@@ -44,6 +44,13 @@ func (slf *JsonProcessor) MakeRpcResponse(seq uint64,err *RpcError,reply []byte)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (slf *JsonProcessor) ReleaseRpcRequest(rpcRequestData IRpcRequestData){
|
||||||
|
|
||||||
|
}
|
||||||
|
func (slf *JsonProcessor) ReleaseRpcRespose(rpcRequestData IRpcResponseData){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (slf *JsonRpcRequestData) IsReply() bool{
|
func (slf *JsonRpcRequestData) IsReply() bool{
|
||||||
return slf.NoReply
|
return slf.NoReply
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,27 @@
|
|||||||
package rpc
|
package rpc
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
type IMsgp interface {
|
type IMsgp interface {
|
||||||
UnmarshalMsg(bts []byte) (o []byte, err error)
|
UnmarshalMsg(bts []byte) (o []byte, err error)
|
||||||
MarshalMsg(b []byte) (o []byte, err error)
|
MarshalMsg(b []byte) (o []byte, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rpcResponeDataPool sync.Pool
|
||||||
|
var rpcRequestDataPool sync.Pool
|
||||||
|
|
||||||
type MsgpProcessor struct {
|
type MsgpProcessor struct {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func init(){
|
||||||
|
rpcResponeDataPool.New = func()interface{}{
|
||||||
|
return &MsgpRpcResponseData{}
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcRequestDataPool.New = func()interface{}{
|
||||||
|
return &MsgpRpcRequestData{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:generate msgp
|
//go:generate msgp
|
||||||
@@ -31,6 +47,7 @@ type MsgpRpcResponseData struct {
|
|||||||
|
|
||||||
func (slf *MsgpProcessor) Marshal(v interface{}) ([]byte, error){
|
func (slf *MsgpProcessor) Marshal(v interface{}) ([]byte, error){
|
||||||
msgp := v.(IMsgp)
|
msgp := v.(IMsgp)
|
||||||
|
|
||||||
return msgp.MarshalMsg(nil)
|
return msgp.MarshalMsg(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,15 +58,30 @@ func (slf *MsgpProcessor) Unmarshal(data []byte, v interface{}) error{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (slf *MsgpProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
|
func (slf *MsgpProcessor) MakeRpcRequest(seq uint64,serviceMethod string,noReply bool,inParam []byte) IRpcRequestData{
|
||||||
return &MsgpRpcRequestData{Seq:seq,ServiceMethod:serviceMethod,NoReply:noReply,InParam:inParam}
|
rpcRequestData := rpcRequestDataPool.Get().(*MsgpRpcRequestData)
|
||||||
|
rpcRequestData.Seq = seq
|
||||||
|
rpcRequestData.ServiceMethod = serviceMethod
|
||||||
|
rpcRequestData.NoReply = noReply
|
||||||
|
rpcRequestData.InParam = inParam
|
||||||
|
|
||||||
|
return rpcRequestData//&MsgpRpcRequestData{Seq:seq,ServiceMethod:serviceMethod,NoReply:noReply,InParam:inParam}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *MsgpProcessor) MakeRpcResponse(seq uint64,err *RpcError,reply []byte) IRpcResponseData {
|
func (slf *MsgpProcessor) MakeRpcResponse(seq uint64,err *RpcError,reply []byte) IRpcResponseData {
|
||||||
return &MsgpRpcResponseData{
|
rpcRequestData := rpcResponeDataPool.Get().(*MsgpRpcResponseData)
|
||||||
Seq: seq,
|
rpcRequestData.Seq = seq
|
||||||
Err: err.Error(),
|
rpcRequestData.Err = err.Error()
|
||||||
Reply: reply,
|
rpcRequestData.Reply = reply
|
||||||
}
|
|
||||||
|
return rpcRequestData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *MsgpProcessor) ReleaseRpcRequest(rpcRequestData IRpcRequestData){
|
||||||
|
rpcRequestDataPool.Put(rpcRequestData)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *MsgpProcessor) ReleaseRpcRespose(rpcRequestData IRpcResponseData){
|
||||||
|
rpcResponeDataPool.Put(rpcRequestData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *MsgpRpcRequestData) IsReply() bool{
|
func (slf *MsgpRpcRequestData) IsReply() bool{
|
||||||
|
|||||||
@@ -22,6 +22,16 @@ func (slf *PBRpcResponseData) MakeRespone(seq uint64,err *RpcError,reply []byte)
|
|||||||
|
|
||||||
return slf
|
return slf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (slf *PBRpcRequestData) ReleaseRpcRequest(rpcRequestData IRpcRequestData){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *PBRpcRequestData) ReleaseRpcRespose(rpcRequestData IRpcRequestData){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func (slf *PBProcessor) Marshal(v interface{}) ([]byte, error){
|
func (slf *PBProcessor) Marshal(v interface{}) ([]byte, error){
|
||||||
return proto.Marshal(v.(proto.Message))
|
return proto.Marshal(v.(proto.Message))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +1,14 @@
|
|||||||
package rpc
|
package rpc
|
||||||
|
|
||||||
/*
|
|
||||||
Seq uint64 // sequence number chosen by client
|
|
||||||
ServiceMethod string // format: "Service.Method"
|
|
||||||
NoReply bool //是否需要返回
|
|
||||||
//packbody
|
|
||||||
InParam []byte
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type RpcResponse struct {
|
|
||||||
//head
|
|
||||||
Seq uint64 // sequence number chosen by client
|
|
||||||
Err *RpcError
|
|
||||||
|
|
||||||
//returns
|
|
||||||
Reply []byte
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
type IRpcRequestData interface {
|
|
||||||
GetSeq() uint64
|
|
||||||
GetServiceMethod() string
|
|
||||||
GetInParam() []byte
|
|
||||||
IsReply() bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type IRpcResponseData interface {
|
|
||||||
GetSeq() uint64
|
|
||||||
GetErr() *RpcError
|
|
||||||
GetReply() []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type IRpcProcessor interface {
|
type IRpcProcessor interface {
|
||||||
Marshal(v interface{}) ([]byte, error)
|
Marshal(v interface{}) ([]byte, error) //b表示自定义缓冲区,可以填nil,由系统自动分配
|
||||||
Unmarshal(data []byte, v interface{}) error
|
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) IRpcRequestData
|
||||||
MakeRpcResponse(seq uint64,err *RpcError,reply []byte) IRpcResponseData
|
MakeRpcResponse(seq uint64,err *RpcError,reply []byte) IRpcResponseData
|
||||||
|
|
||||||
|
ReleaseRpcRequest(rpcRequestData IRpcRequestData)
|
||||||
|
ReleaseRpcRespose(rpcRequestData IRpcResponseData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
113
rpc/rpc.go
Normal file
113
rpc/rpc.go
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
package rpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RpcRequest struct {
|
||||||
|
RpcRequestData IRpcRequestData
|
||||||
|
|
||||||
|
localReply interface{}
|
||||||
|
localParam interface{} //本地调用的参数列表
|
||||||
|
requestHandle RequestHandler
|
||||||
|
callback *reflect.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
type RpcResponse struct {
|
||||||
|
RpcResponeData IRpcResponseData
|
||||||
|
}
|
||||||
|
|
||||||
|
type IRpcRequestData interface {
|
||||||
|
GetSeq() uint64
|
||||||
|
GetServiceMethod() string
|
||||||
|
GetInParam() []byte
|
||||||
|
IsReply() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type IRpcResponseData interface {
|
||||||
|
GetSeq() uint64
|
||||||
|
GetErr() *RpcError
|
||||||
|
GetReply() []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type RequestHandler func(Returns interface{},Err *RpcError)
|
||||||
|
|
||||||
|
|
||||||
|
type Call struct {
|
||||||
|
Seq uint64
|
||||||
|
ServiceMethod string
|
||||||
|
Arg interface{}
|
||||||
|
Reply interface{}
|
||||||
|
Respone *RpcResponse
|
||||||
|
Err error
|
||||||
|
done chan *Call // Strobes when call is complete.
|
||||||
|
connid int
|
||||||
|
callback *reflect.Value
|
||||||
|
rpcHandler IRpcHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *Call) Clear(){
|
||||||
|
slf.Seq = 0
|
||||||
|
slf.ServiceMethod = ""
|
||||||
|
slf.Arg = nil
|
||||||
|
slf.Reply = nil
|
||||||
|
slf.Respone = nil
|
||||||
|
slf.Err = nil
|
||||||
|
slf.connid = 0
|
||||||
|
slf.callback = nil
|
||||||
|
slf.rpcHandler = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *Call) Done() *Call{
|
||||||
|
return <-slf.done
|
||||||
|
}
|
||||||
|
|
||||||
|
type RpcHandleFinder interface {
|
||||||
|
FindRpcHandler(serviceMethod string) IRpcHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var rpcResponePool sync.Pool
|
||||||
|
var rpcRequestPool sync.Pool
|
||||||
|
var rpcCallPool sync.Pool
|
||||||
|
|
||||||
|
func init(){
|
||||||
|
rpcResponePool.New = func()interface{}{
|
||||||
|
return &RpcResponse{}
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcRequestPool.New = func() interface{} {
|
||||||
|
return &RpcRequest{}
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcCallPool.New = func() interface{} {
|
||||||
|
return &Call{done:make(chan *Call,1)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeRpcResponse() *RpcResponse{
|
||||||
|
return rpcResponePool.Get().(*RpcResponse)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeRpcRequest() *RpcRequest{
|
||||||
|
return rpcRequestPool.Get().(*RpcRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeCall() *Call {
|
||||||
|
call := rpcCallPool.Get().(*Call)
|
||||||
|
|
||||||
|
return call
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReleaseRpcResponse(rpcRespone *RpcResponse){
|
||||||
|
rpcResponePool.Put(rpcRespone)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReleaseRpcRequest(rpcRequest *RpcRequest){
|
||||||
|
rpcRequestPool.Put(rpcRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReleaseCall(call *Call){
|
||||||
|
rpcCallPool.Put(call)
|
||||||
|
}
|
||||||
@@ -186,7 +186,7 @@ func (slf *RpcHandler) HandlerRpcResponeCB(call *Call){
|
|||||||
}else{
|
}else{
|
||||||
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),reflect.ValueOf(call.Err)})
|
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),reflect.ValueOf(call.Err)})
|
||||||
}
|
}
|
||||||
|
ReleaseCall(call)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -203,6 +203,8 @@ func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
defer processor.ReleaseRpcRequest(request.RpcRequestData)
|
||||||
|
defer ReleaseRpcRequest(request)
|
||||||
|
|
||||||
v,ok := slf.mapfunctons[request.RpcRequestData.GetServiceMethod()]
|
v,ok := slf.mapfunctons[request.RpcRequestData.GetServiceMethod()]
|
||||||
if ok == false {
|
if ok == false {
|
||||||
@@ -309,6 +311,7 @@ func (slf *RpcHandler) goRpc(bCast bool,nodeId int,serviceMethod string,args int
|
|||||||
}
|
}
|
||||||
//其他的rpcHandler的处理器
|
//其他的rpcHandler的处理器
|
||||||
pCall := pLocalRpcServer.rpcHandlerGo(true,sMethod[0],sMethod[1],args,nil)
|
pCall := pLocalRpcServer.rpcHandlerGo(true,sMethod[0],sMethod[1],args,nil)
|
||||||
|
defer ReleaseCall(pCall)
|
||||||
if pCall.Err!=nil {
|
if pCall.Err!=nil {
|
||||||
err = pCall.Err
|
err = pCall.Err
|
||||||
}
|
}
|
||||||
@@ -316,11 +319,11 @@ func (slf *RpcHandler) goRpc(bCast bool,nodeId int,serviceMethod string,args int
|
|||||||
}
|
}
|
||||||
|
|
||||||
//跨node调用
|
//跨node调用
|
||||||
pCall := pClient.Go(true,serviceMethod,args,nil)
|
pCall := pClient.Go(false,serviceMethod,args,nil)
|
||||||
if pCall.Err!=nil {
|
if pCall.Err!=nil {
|
||||||
err = pCall.Err
|
err = pCall.Err
|
||||||
}
|
}
|
||||||
|
ReleaseCall(pCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
@@ -356,8 +359,9 @@ func (slf *RpcHandler) callRpc(nodeId int,serviceMethod string,args interface{},
|
|||||||
}
|
}
|
||||||
//其他的rpcHandler的处理器
|
//其他的rpcHandler的处理器
|
||||||
pCall := pLocalRpcServer.rpcHandlerGo(false,sMethod[0],sMethod[1],args,reply)
|
pCall := pLocalRpcServer.rpcHandlerGo(false,sMethod[0],sMethod[1],args,reply)
|
||||||
pResult := pCall.Done()
|
err = pCall.Done().Err
|
||||||
return pResult.Err
|
ReleaseCall(pCall)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
//跨node调用
|
//跨node调用
|
||||||
@@ -365,8 +369,9 @@ func (slf *RpcHandler) callRpc(nodeId int,serviceMethod string,args interface{},
|
|||||||
if pCall.Err != nil {
|
if pCall.Err != nil {
|
||||||
return pCall.Err
|
return pCall.Err
|
||||||
}
|
}
|
||||||
pResult := pCall.Done()
|
err = pCall.Done().Err
|
||||||
return pResult.Err
|
ReleaseCall(pCall)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args interface{},callback interface{}) error {
|
func (slf *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args interface{},callback interface{}) error {
|
||||||
@@ -437,6 +442,8 @@ func (slf *RpcHandler) asyncCallRpc(nodeid int,serviceMethod string,args interfa
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
pCall := pLocalRpcServer.rpcHandlerGo(false,sMethod[0],sMethod[1],args,reply)
|
pCall := pLocalRpcServer.rpcHandlerGo(false,sMethod[0],sMethod[1],args,reply)
|
||||||
|
defer ReleaseCall(pCall)
|
||||||
|
|
||||||
pResult := pCall.Done()
|
pResult := pCall.Done()
|
||||||
return pResult.Err
|
return pResult.Err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,46 +13,19 @@ import (
|
|||||||
var processor IRpcProcessor = &JsonProcessor{}
|
var processor IRpcProcessor = &JsonProcessor{}
|
||||||
var LittleEndian bool
|
var LittleEndian bool
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type Call struct {
|
|
||||||
Seq uint64
|
|
||||||
ServiceMethod string
|
|
||||||
Arg interface{}
|
|
||||||
Reply interface{}
|
|
||||||
Respone *RpcResponse
|
|
||||||
Err error
|
|
||||||
done chan *Call // Strobes when call is complete.
|
|
||||||
connid int
|
|
||||||
callback *reflect.Value
|
|
||||||
rpcHandler IRpcHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
func (slf *Call) Done() *Call{
|
|
||||||
return <-slf.done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
functions map[interface{}]interface{}
|
functions map[interface{}]interface{}
|
||||||
|
|
||||||
cmdchannel chan *Call
|
cmdchannel chan *Call
|
||||||
|
|
||||||
rpcHandleFinder RpcHandleFinder
|
rpcHandleFinder RpcHandleFinder
|
||||||
rpcserver *network.TCPServer
|
rpcserver *network.TCPServer
|
||||||
}
|
}
|
||||||
|
|
||||||
type RpcHandleFinder interface {
|
|
||||||
FindRpcHandler(serviceMethod string) IRpcHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetProcessor(proc IRpcProcessor) {
|
func SetProcessor(proc IRpcProcessor) {
|
||||||
processor = proc
|
processor = proc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *Server) Init(rpcHandleFinder RpcHandleFinder) {
|
func (slf *Server) Init(rpcHandleFinder RpcHandleFinder) {
|
||||||
slf.cmdchannel = make(chan *Call,10000)
|
slf.cmdchannel = make(chan *Call,100000)
|
||||||
slf.rpcHandleFinder = rpcHandleFinder
|
slf.rpcHandleFinder = rpcHandleFinder
|
||||||
slf.rpcserver = &network.TCPServer{}
|
slf.rpcserver = &network.TCPServer{}
|
||||||
}
|
}
|
||||||
@@ -84,13 +57,10 @@ type RpcAgent struct {
|
|||||||
|
|
||||||
|
|
||||||
func (agent *RpcAgent) WriteRespone(serviceMethod string,seq uint64,reply interface{},err *RpcError) {
|
func (agent *RpcAgent) WriteRespone(serviceMethod string,seq uint64,reply interface{},err *RpcError) {
|
||||||
var rpcRespone RpcResponse
|
|
||||||
|
|
||||||
//rpcRespone.Seq = seq
|
|
||||||
//rpcRespone.Err = err
|
|
||||||
var mReply []byte
|
var mReply []byte
|
||||||
var rpcError *RpcError
|
var rpcError *RpcError
|
||||||
var errM error
|
var errM error
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rpcError = err
|
rpcError = err
|
||||||
} else {
|
} else {
|
||||||
@@ -102,13 +72,15 @@ func (agent *RpcAgent) WriteRespone(serviceMethod string,seq uint64,reply interf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcRespone.RpcResponeData = processor.MakeRpcResponse(seq,rpcError,mReply)
|
var rpcResponse RpcResponse
|
||||||
bytes,errM := processor.Marshal(rpcRespone.RpcResponeData)
|
rpcResponse.RpcResponeData = processor.MakeRpcResponse(seq,rpcError,mReply)
|
||||||
|
bytes,errM := processor.Marshal(rpcResponse.RpcResponeData)
|
||||||
if errM != nil {
|
if errM != nil {
|
||||||
log.Error("service method %s %+v Marshal error:%+v!", serviceMethod,rpcRespone,errM)
|
log.Error("service method %s %+v Marshal error:%+v!", serviceMethod,rpcResponse,errM)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
processor.ReleaseRpcRespose(rpcResponse.RpcResponeData)
|
||||||
errM = agent.conn.WriteMsg(bytes)
|
errM = agent.conn.WriteMsg(bytes)
|
||||||
if errM != nil {
|
if errM != nil {
|
||||||
log.Error("Rpc %s return is error:%+v",serviceMethod,errM)
|
log.Error("Rpc %s return is error:%+v",serviceMethod,errM)
|
||||||
@@ -126,17 +98,21 @@ func (agent *RpcAgent) Run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//解析head
|
//解析head
|
||||||
var req RpcRequest
|
req := MakeRpcRequest()
|
||||||
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil)
|
req.RpcRequestData = processor.MakeRpcRequest(0,"",false,nil)
|
||||||
err = processor.Unmarshal(data,req.RpcRequestData)
|
err = processor.Unmarshal(data,req.RpcRequestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if req.RpcRequestData.GetSeq()>0 {
|
if req.RpcRequestData.GetSeq()>0 {
|
||||||
rpcError := RpcError("rpc Unmarshal request is error")
|
rpcError := RpcError("rpc Unmarshal request is error")
|
||||||
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
continue
|
continue
|
||||||
}else{
|
}else{
|
||||||
log.Error("rpc Unmarshal request is error: %v", err)
|
log.Error("rpc Unmarshal request is error: %v", err)
|
||||||
//will close tcpconn
|
//will close tcpconn
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +122,8 @@ func (agent *RpcAgent) Run() {
|
|||||||
if len(serviceMethod)!=2 {
|
if len(serviceMethod)!=2 {
|
||||||
rpcError := RpcError("rpc request req.ServiceMethod is error")
|
rpcError := RpcError("rpc request req.ServiceMethod is error")
|
||||||
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
log.Debug("rpc request req.ServiceMethod is error")
|
log.Debug("rpc request req.ServiceMethod is error")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -154,6 +132,8 @@ func (agent *RpcAgent) Run() {
|
|||||||
if rpcHandler== nil {
|
if rpcHandler== nil {
|
||||||
rpcError := RpcError(fmt.Sprintf("service method %s not config!", req.RpcRequestData.GetServiceMethod()))
|
rpcError := RpcError(fmt.Sprintf("service method %s not config!", req.RpcRequestData.GetServiceMethod()))
|
||||||
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
log.Error("service method %s not config!", req.RpcRequestData.GetServiceMethod())
|
log.Error("service method %s not config!", req.RpcRequestData.GetServiceMethod())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -164,7 +144,13 @@ func (agent *RpcAgent) Run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcHandler.PushRequest(&req)
|
err = rpcHandler.PushRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
rpcError := RpcError(err.Error())
|
||||||
|
agent.WriteRespone(req.RpcRequestData.GetServiceMethod(),req.RpcRequestData.GetSeq(),nil,&rpcError)
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,8 +196,8 @@ func (slf *Server) myselfRpcHandlerGo(handlerName string,methodName string, args
|
|||||||
|
|
||||||
|
|
||||||
func (slf *Server) rpcHandlerGo(noReply bool,handlerName string,methodName string, args interface{},reply interface{}) *Call {
|
func (slf *Server) rpcHandlerGo(noReply bool,handlerName string,methodName string, args interface{},reply interface{}) *Call {
|
||||||
pCall := &Call{}
|
pCall := MakeCall()//&Call{}
|
||||||
pCall.done = make( chan *Call,1)
|
//pCall.done = make( chan *Call,1)
|
||||||
rpcHandler := slf.rpcHandleFinder.FindRpcHandler(handlerName)
|
rpcHandler := slf.rpcHandleFinder.FindRpcHandler(handlerName)
|
||||||
if rpcHandler== nil {
|
if rpcHandler== nil {
|
||||||
pCall.Err = fmt.Errorf("service method %s.%s not config!", handlerName,methodName)
|
pCall.Err = fmt.Errorf("service method %s.%s not config!", handlerName,methodName)
|
||||||
@@ -219,12 +205,10 @@ func (slf *Server) rpcHandlerGo(noReply bool,handlerName string,methodName strin
|
|||||||
pCall.done <- pCall
|
pCall.done <- pCall
|
||||||
return pCall
|
return pCall
|
||||||
}
|
}
|
||||||
var req RpcRequest
|
req := MakeRpcRequest()
|
||||||
|
|
||||||
//req.ServiceMethod = fmt.Sprintf("%s.%s",handlerName,methodName)
|
|
||||||
req.localParam = args
|
req.localParam = args
|
||||||
req.localReply = reply
|
req.localReply = reply
|
||||||
//req.NoReply = noReply
|
|
||||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
||||||
if noReply == false {
|
if noReply == false {
|
||||||
req.requestHandle = func(Returns interface{},Err *RpcError){
|
req.requestHandle = func(Returns interface{},Err *RpcError){
|
||||||
@@ -238,15 +222,19 @@ func (slf *Server) rpcHandlerGo(noReply bool,handlerName string,methodName strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := rpcHandler.PushRequest(req)
|
||||||
rpcHandler.PushRequest(&req)
|
if err != nil {
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
|
pCall.Err = err
|
||||||
|
pCall.done <- pCall
|
||||||
|
}
|
||||||
|
|
||||||
return pCall
|
return pCall
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *Server) rpcHandlerAsyncGo(callerRpcHandler IRpcHandler,noReply bool,handlerName string,methodName string,args interface{},reply interface{},callback reflect.Value) error {
|
func (slf *Server) rpcHandlerAsyncGo(callerRpcHandler IRpcHandler,noReply bool,handlerName string,methodName string,args interface{},reply interface{},callback reflect.Value) error {
|
||||||
pCall := &Call{}
|
pCall := MakeCall()
|
||||||
//pCall.done = make( chan *Call,1)
|
|
||||||
pCall.rpcHandler = callerRpcHandler
|
pCall.rpcHandler = callerRpcHandler
|
||||||
pCall.callback = &callback
|
pCall.callback = &callback
|
||||||
pCall.Reply = reply
|
pCall.Reply = reply
|
||||||
@@ -257,11 +245,9 @@ func (slf *Server) rpcHandlerAsyncGo(callerRpcHandler IRpcHandler,noReply bool,h
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var req RpcRequest
|
req := MakeRpcRequest()
|
||||||
//req.ServiceMethod = fmt.Sprintf("%s.%s",handlerName,methodName)
|
|
||||||
req.localParam = args
|
req.localParam = args
|
||||||
req.localReply = reply
|
req.localReply = reply
|
||||||
//req.NoReply = noReply
|
|
||||||
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
req.RpcRequestData = processor.MakeRpcRequest(0,fmt.Sprintf("%s.%s",handlerName,methodName),noReply,nil)
|
||||||
if noReply == false {
|
if noReply == false {
|
||||||
req.requestHandle = func(Returns interface{},Err *RpcError){
|
req.requestHandle = func(Returns interface{},Err *RpcError){
|
||||||
@@ -279,8 +265,11 @@ func (slf *Server) rpcHandlerAsyncGo(callerRpcHandler IRpcHandler,noReply bool,h
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
err := rpcHandler.PushRequest(&req)
|
err := rpcHandler.PushRequest(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
processor.ReleaseRpcRequest(req.RpcRequestData)
|
||||||
|
ReleaseRpcRequest(req)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user