概述
RPC 框架是云端服务基础框架之一, 负责云端服务模块之间的项目调用, 类似于本地的函数调用一样方便. 常见的 RPC 框架配带的功能有:
编解码协议. 比如 protobuf,thrift 等等.
服务发现. 指服务提供者更新接口后, 服务使用者如何知道该接口更新. Protobuf 协议使用的是预编译方式, dubbo 中使用的是 zk 作为媒介.
负载均衡.
流量控制, 熔断.
运维工具.
常见 RPC 框架有
谷歌的 GRPC.
百度的 BRPC.
阿里的 dubbo.
脸书的 thrift.
腾讯的 tars.
本系列主要教大家如何实现 RPC 框架, 使用的语音是 C++, 协议使用的是 protobuf.
基于 protobuf 的 RPC 框架
这里不介绍具体 protoc 的使用方法, 网上很多. 在完成 protoc 编译后, 会输出 protobuf 提供的服务框架中, 主要有如下几个类
Controller, 主要是 rpc 通信过程的辅助接口, 记录错误状态和简单的控制.
Service, 指特定的一个服务. 在 protobuf 中, 一个服务 (service) 可以包含多个方法(method), 通过 service+method 可以唯一确定一个过程.
Channel, 指使用者和提供者直接的连接通道, 是 protobuf 的核心, 但是 rpc 框架开发者一般不直接调用该类, 而是调用下面的 stub(桩 / 存根).
Stub, 客户端使用的存根, 通过该类去发起远程过程调用. 至于为什么需要 stub, 笔者也还没有弄清楚.
在整体框架实现上基本上集成 protobuf 提供的类即可, 采用 boost 的 socket 进行通信, 暂时考虑同步通信的情况.
对于服务端和客户端的通信协议上, 采用的 meta 对象, 用于记录过程调用的参数, 具体 service 和 method.
服务端设计
采用 boost 的 socket, 直接 bind 和监听, 启动后则通过 accept 进行阻塞, 对于每个请求进行解包, 并在 ProcRpcMsg 函数中对具体业务操作函数的调用, 并在业务操作函数完成后通过 done->Run()回调 OnCallbackDone 实现数据回写.
在 service 的 callmethod 方法中, 对具体 method 进行调用.
此外, 在服务和过程的管理上, 服务端建立了 key-val 的 map 来进行管理.
客户端设计
客户端相对简单, 也是基于 boost 的 socket 进行 connect,send,receive 等同步的操作.
在 echo 例子中, 我们通常调用 stub 的函数, stub 调用 channel 的 Callmethod 函数, 因此我的操作需要在 Channel::CallMethod 中进行实现.
总结
本文简单介绍了基于 protobuf 的 rpc 框架实现, 都是使用同步模型且单线程形式. 这个程序在状态控制, 并发高等上还不够, 下篇文章讲如何提升收发效率.
代码路径: https://github.com/thszhong/srpc
来源: https://www.cnblogs.com/thsss/p/12634381.html