RPC项目具体细节

在实现RPC框架的整体步骤中,需要弄清楚caller与callee的通信过程,那么就需要针对protobuf进行具体的了解。

protobuf

三大方面:在整体框架上,需要对这三部分进行继承与重写

Service

当在 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 方法

stub_callmethod

对 CallMethod 函数进行追踪,发现 RpcChannel 是一个抽象类,CallMethod 是一个纯虚函数,而调用的方法在底层上都调用了 CallMethod 函数,那么这个 CallMethod 就必须重写。

当客户端stub调用远程函数或者方法时,底层调用 CallMethod 是同步调用,也就是说,会一直阻塞等待调用的结果。

那么如果调用失败,该如何得知当前RPC的调用状态呢?因此就需要使用 RpcController 来记录RPC方法调用过程中的错误信息

RpcController

在 RpcController 主要有3个纯虚函数,因此也需要重写这三个函数。三个函数包括

Reset()

Failed()

ErrorText()

这三个函数记录了错误信息

RpcController_callmethod

RpcChannel

由上面的介绍可知,RpcChannel内部只有一个函数,就是调用函数

RpcChannel_callmethod

全部过程

文字版

文字

具体函数

函数

致谢

感谢大佬

(https://blog.csdn.net/T_Solotov/article/details/124170856)

(https://blog.csdn.net/qq_45132647?type=blog)

(https://github.com/shenmingik/RPC)