前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ananas RPC源码分析-net库概览(一)

ananas RPC源码分析-net库概览(一)

原创
作者头像
路小饭
修改2019-02-18 11:05:35
1.1K0
修改2019-02-18 11:05:35
举报
文章被收录于专栏:C++开源框架源码分析

ananas是一个基于promise模式和google protobuf的RPC框架,目前由C++11实现,是出于教学目的写的小巧框架。

受作者所托,这两天大概浏览了net部分代码,做个简单总结。net部分实现了一个多线程非阻塞网络库,可以单独使用。相比Tars RPC代码,ananas更适合初学者学习网络库

1 网络库框架

网络库框架
网络库框架

网络库的整体框架非常简洁,如上图所示:

  • 左上角的EventLoop活在主线程中,负责listen、bind,在自己的epoll中监听客户端链接
  • 当客户端发起链接时,触发Acceptor中的HandleReadEvent,如果链接建立,则按照轮询的方式注册到EventLoopGroup中的一个EventLoop中。即每有一个新链接,就在EventLoopGroup中顺序挑选一个EventLoop进行注册
  • 请求的处理和结果的发送都是在Connection中的HandleReadEvent和HandleWriteEvent函数中完成
  • 在看代码时候,注意Acceptor和Connection都是Channel的子类。EventLoop中对Channel的调用,具体实现都在Acceptor和Connection中

2 网络库的链接分发

这一小节,详细的说明下主线程中的EventLoop是怎样将链接分发到EventLoopGroup中的EventLoop中的

  • 图中的箭头线上标明了数字,是程序的概要处理逻辑
  • 1号,BaseLoop中调用了Listen函数,在Acceptor类中完成了端口的bind和listen
  • 2号-4号,listen文件符注册到了epoll模型中
  • 5号,循环等待epoll_wait返回,这里代码用了一个预定义宏TEMP_FAILURE_RETRY,这是GUN library提供的一个便捷的方法,用于检查函数返回值,如果返回-1,就一直检查下去
  • 6号,当有客户端链接到来时,调用的是Acceptor类的HandleReadEvent方法
  • 7号-8号,当链接成功建立时候,会把链接分配到EventLoopGroup中的一个EventLoop中进行注册
  • 9号 OnNewConnection是回调函数,由用户自己定义,例子可以参考源码ananas/tests/test_net/TestServer.cc中的OnNewConnection函数。OnNewConnection是解耦的关键。如果我们想在网络库之上制作自己的RPC框架,只需要在外层编写OnNewConnection函数,通过Application类中的Listen方法进行注册即可

3 网络库怎样接收请求和处理结果

ana-Connection处理.jpg
ana-Connection处理.jpg

网络库对请求和结果的处理入口都在Connection类中。我们先忽略细节,介绍下主要流程

  • 1号,HandleReadEvent中接收请求,然后调用onMessage函数
  • 2号,onMessage函数也是在外面由用户控制的,怎么解析请求,怎样产生结果,都由用户控制
  • 3号, 生成结果后调用Connection的SendPacket函数进行发送。
  • 4号,在SendPacket函数中,如果数据较大,一次发送不完,会保存在sendBuf中在HandleWriteEvent中完成发送。网络库同时也支持批量发送数据,批量数据保存在 batchSendBuf_中,在下一次的HandleReadEvent中进行处理
  • ananas的网络库使用了和Tars一样的Buffer类,用于高效的处理消息的读写,机理在Tars-C++ 揭秘篇:TC_Buffer的妙用中已经有所阐述,不再赘述。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 网络库框架
  • 2 网络库的链接分发
  • 3 网络库怎样接收请求和处理结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档