在golang中,net/rpc库比较牛,只需要写函数,然后使用现成的 ServerCodec 就可以完成rpc服务了。但是有个问题,service函数的参数都是来自客户端的,如果服务器想为某个特殊的函数注入一些配置或状态参数,就不好弄了。
解决方案:
修改service函数,比如原来的参数是 FuncArgs
结构体,现在改成
type WithDataArgs interface {
SetData(data Data)
RealArgs() interface{}
}
type WithDataFuncArgs struct {
FuncArgs
data Data
}
func (a *WithDataFuncArgs) SetData(data Data) {
a.data = data
}
func (a *WithDataFuncArgs) RealArgs() {
return &a.FuncArgs
}
重载 ServerCodec,重写 ReadRequestBody 函数
type serverCodec struct {
rpc.ServerCodec
}
func (s *serverCodec) ReadRequestBody(funcArgs interface{}) {
if d, ok = funcArgs.(WithDataArgs); ok {
d.SetData(data)
s.ServerCode.ReadRequstBody(d.RealArgs())
} else {
s.ServerCode.ReadRequstBody(funcArgs)
}
}
标签:function,service,golang,rpc,RealArgs,WithDataFuncArgs,data
From: https://www.cnblogs.com/windtail/p/17342805.html