golang net/rpc inject data to service function
在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)
  }
}
    
------------------------------------------------------------ 
本文由WindTaiL在cnblogs中发布,转载请注明出处
本文由WindTaiL在cnblogs中发布,转载请注明出处
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号