利用protobuf实现RPC框架之libevent

一、前言

今天聊一聊 RPC 的相关内容,来看一下如何利用 Google 的开源序列化工具protobuf,来实现一个我们自己的 RPC 框架。文章比较长,但是值得想了解RPC的小伙伴阅读参考。整个系列内容分为四个部分:

  • RPC介绍
  • protobuf 基本使用
  • 网络通信框架libevent介绍
  • 实现 RPC 框架

二、libevent

实现 RPC 框架,需要解决 2 个问题:通信和序列化。 protobuf 解决了序列化问题,那么还需要解决通讯问题。有下面几种通信方式备选:

TCP 通讯; UDP 通讯; HTTP 通讯;

如何选择,那就是见仁见智的事情了,比如 gRPC 选择的就是http,也工作的很好,更多的实现选择的是TCP通讯。

下面就是要决定:是从 socket 层次开始自己写? 还是利用已有的一些开源网络库来实现通讯?

既然标题已经是 libevent 了,那肯定选择的就是它! 当然还有很多其他优秀的网络库可以利用,比如:libev, libuv 等等

1. libevent 简介

Libevent 是一个用C 语言编写的、轻量级、高性能、基于事件的网络库。主要有以下几个亮点:

事件驱动( event-driven),高性能; 轻量级,专注于网络;源代码相当精炼、易读; 跨平台,支持 Windows、 Linux、*BSD 和 Mac Os; 支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等; 支持 I/O,定时器和信号等事件;注册事件优先顺序。

从我们用户的角度来看,libevent 库提供了以下功能:当一个文件描述符的特定事件(如可读,可写或出错)发生了,或一个定时事件发生了, libevent 就会自动执行用户注册的回调函数,来接收数据或者处理事件。

此外,libevent 还把 fd 读写、信号、DNS、定时器甚至idle(空闲) 都抽象化成了event(事件)。

总之一句话:使用很方便,功能很强大!

2.基本使用

libevent 是基于事件的回调函数机制,因此在启动监听 socket 之前,只要设置好相应的回调函数,当有事件或者网络数据到来时,libevent 就会自动调用回调函数。

struct event_base  *m_evBase = event_base_new();
struct bufferevent *m_evBufferEvent =  bufferevent_socket_new(
        m_evBase, [socket Id], 
        BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE);  
bufferevent_setcb(m_evBufferEvent, 
        [读取数据回调函数],
         NULL, 
        [事件回调函数], 
        [回调函数传参]);

// 开始监听 socket
event_base_dispatch(m_evBase);

有一个问题需要注意:protobuf 序列化之后的数据,全部是二进制的。

libevent 只是一个网络通讯的机制,如何处理接收到的二进制数据(粘包、分包的问题),是我们需要解决的问题。

小结

本篇文章对网络通信库做了简单介绍,下一篇文章我们将介绍如何实现RPC 框架。

原文链接

你可能感兴趣的:(RPC框架,rpc,网络,网络协议)