博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
protobuf中RpcChannel的CallMethod方法的RpcController参数的探究
阅读量:677 次
发布时间:2019-03-17

本文共 907 字,大约阅读时间需要 3 分钟。

背景

   我们知道在protobuf中定义了service UserServiceRpc后,经过protoc编译后,会生成两个类class UserServiceRpc 和 class UserServiceRpc_stub,UserServiceRpc 是继承于service基类,UserServiceRpc_stub是继承于UserServiceRpc 。UserServiceRpc是供给rpc服务发布者(生产者)使用,UserServiceRpc_stub是供给rpc服务的调用方使用。我们在service UserServiceRpc里定义的方法,都会在UserServiceRpc_stub中提供,但是我们打开源码后,发现所有的方法底层都是调用RpcChannel的CallMethod方法:在这里插入图片描述

  进一步深入,我们发现RpcChannel是一个抽象类,CallMethod是一个纯虚函数。即我们想要调用的方法在底层上都调用了CallMethod方法是个纯虚函数,看到这里我就明白了,这个CallMethod需要我们自己来写。

在这里插入图片描述

   于是在我们的rpc框架代码的编写中,有如下定义:

在这里插入图片描述

  根据之前的分析总结,所有提供给stub代理对象调用的rpc方法,都会调用这个CallMethod方法,来做rpc方法调用的数据序列化和网络发送。在我们调用方代码中有如下:

在这里插入图片描述

  这里便出现了一个问题,上面stub调用login即底层调用我们的CallMethod是同步调用,也就是说,它会一直阻塞等待调用的结果。

提出问题

   那么问题就出现了,在我们的CallMethod方法中主要是做rpc方法调用的数据序列化和网络发送,很容易就因为各种原因调用失败,那么当rpc调用失败,我们如何得知当前rpc调用的状态呢?RpcController* controller这个参数是不是能够到达我的要求呢?

在这里插入图片描述

   进一步查看RpcController,如下:

在这里插入图片描述

  RpcController也是个抽象类,主要记录rpc方法调用过程中的错误信息,自定义MyrpcController类继承于RpcController:

在这里插入图片描述

  在调用rpc方法的调用方,做如下修改即可:

在这里插入图片描述

转载地址:http://fgbhz.baihongyu.com/

你可能感兴趣的文章