RPC框架实现(一) Protobuf的rpc实现

概述git

RPC框架是云端服务基础框架之一,负责云端服务模块之间的项目调用,相似于本地的函数调用同样方便。常见的RPC框架配带的功能有:github

  • 编解码协议。好比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进行通讯,暂时考虑同步通讯的状况。socket

对于服务端和客户端的通讯协议上,采用的meta对象,用于记录过程调用的参数、具体service和method。函数

服务端设计工具

采用boost的socket,直接bind和监听,启动后则经过accept进行阻塞,对于每一个请求进行解包,并在ProcRpcMsg函数中对具体业务操做函数的调用,并在业务操做函数完成后经过done->Run()回调OnCallbackDone实现数据回写。spa

 

 

 

 

在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

相关文章
相关标签/搜索