首页 > 其他分享 >golang net/rpc inject data to service function

golang net/rpc inject data to service function

时间:2023-04-22 12:55:21浏览次数:41  
标签:function service golang rpc RealArgs WithDataFuncArgs data

在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

相关文章

  • bug|初始化项目|sass-loader报错:TypeError: this.getResolve is not a function at Ob
    Modulebuildfailed:TypeError:this.getResolveisnotafunctionatObject.loader的解决npmuninstallsass-loader(卸载当前版本)[email protected]......
  • 读书笔记 - 《Monolith to Microservices》
    如果你的产品目前是B/S或者C/S架构,想要考虑重构成微服务,这本书绝对是一个很好的参考,作者通过自己的实践经历,详述了以下几个方面:不要因为别人都做微服务,你就想要把自己的系统转成微服务,首先需要分析自己系统碰到的问题,找到最适合的解决办法,微服务不是万能的,不能解决所有问题考虑......
  • golang中通过原始socket实现tcp/udp的服务端和客户端示例
    这些天稍微空点,总结下golang中通过tcp/udp实现服务端客户端的编程实现,毕竟长久以来,如果要截单的http服务,我们直接使用net/http包实现服务,或者使用框架如gin/echo/beego等。以下就直接上代码,稍微看看都能懂起。1.TCP的实现serverpackagemainimport( "bufio" "fmt" "net"......
  • golang 中常用的超时控制的方案示例
    在go中,我们很容易就可以实现超时控制,今天分享2种解决方案:1.select+time.After2.select+context其实两种方案中,我们都是通过channel来控制的,在方案1中,对于time.After,通过返回一个只读<-chanTime实现,而context中,则通过context.Done()实现,通过返回<-chans......
  • oracle function 函数
    oraclefunction的几个实例,只限入门,高手路过 --********thesimplestexampleoffunction--tip:canusesqltodirectlycallthefunctionwithinmoduleparametercreateorreplacefunctionget_customer_namereturnvarchar2isv_uservarchar2(100);begins......
  • Android-service
    原文地址zhuanlan.zhihu.com残枫cpsService是一种可在后台执行长时间运行操作而不提供界面的应用组件。AndroidServiceAndroidService是组件,既不能说它是单独的进程也不能说它是单独的线程。如果非要从通俗的语言层面来理解的话,姑且将其理解为对象。这个Service对象本......
  • java 增删改查接口命名规范(service与mapper)
    阿里推荐命名规范:转载自:https://www.cnblogs.com/zengzy698/p/15939088.html......
  • Android之调用service的方法
    MainActivity.java:privateBackgroundMusicServicecaller;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){Intentsvc=newIntent(getApplicationContext(),BackgroundMusicService.class);if(Build.VERSION.SDK_INT>=Build.VERSIO......
  • webservice 客户端生成命令
    wsdl2java-frontendjaxws21-client-pcom.creditease.webapp.webservice.voices-dd:/http://10.105.48.14:8893/Service.svc?wsdlwsdl2java-frontendjaxws21-client-pcom.creditease.webapp.webservice.voices-dd:/http://10.105.48.14:......
  • Ingress nginx配置同一个域名不同的path访问不同的service
    配置同一个域名,不同的path,访问不同的service  #重写URL  #当您访问http://<ingress_ip>/foo/bar时,nginxingresscontroller将把请求路由到foo-service的80端口,并将原始请求的路径/foo/bar重写为/bar。    #nginx.ingress.kubernetes.io/rewrite-ta......