Muduo(C++11版本) 源码剖析(一)———总体架构

前言:

       目前工作虽然是C++/Qt客户端方向,但是研究了一段时间c++高性能服务器的一些架构设计,正好学习了一款flamingo这一款开源即时通讯软件,里面的网络层是用c++11改写的原来boost版的muduo,索性就写几篇博客分析下muduo这款网络库的源码,其实已经有不少人分析过该库,我在这里仅仅谈我的个人对该库设计、用法的一些理解 ,不对或者不准确的地方还请指出,有一些地方会直接引用陈硕老师的《c++linux多线程服务端编程》的原图或者原话。

涉及到的关键类:

       EventLoop:事件循环核心类,遵循per thread one loop的思想,一个线程一个事件循环,在循环中用IO多路复用,分发IO           事件。

       EventLoopThread:封装了std::thread,可以启动一个线程,并执行EventLoop的循环。

       EventLoopThreadPoll:用于管理EventLoopThread的线程池,启动线程,结束线程,可以将获取的任务分派到执行                         EventLoop的线程里。

       TcpServer:服务端,负责接受处理新连接,有线程池和接受Acceptor的控制权。

        Acceptor:含有服务端socket信息,并能处理接受事件,回调给TcpServer对象。

        TcpConnection:一个连接对应一个TcpConnection,内部也置有channel_,处理收事件和读事件。

        Channel:每个连接都会对应一个Channel,IO的注册和响应事件都通过Channel回调反馈给其他对象。

         贴下书上的结构图:

       

        

基本流程

       上图中空心菱形代表聚合关系,实心菱形代表组合关系。如果muduo作为库使用的话白色的UML作为暴露给用户的接口,灰色的代表内部实现,当然我们这里的版本肯定是要对整个结构进行分析。这篇博文关系服务端的设计,暂不讨论Connector和TcpClient这两个类。我简单说下流程,

        首先,TcpServer中会有一个Acceptor对象来绑定监听服务端Socket,而Acceptor中会单独有一个Channel专门负责处理接受事件,回调给TcpServer创建新连接。一个新连接生成一个TcpConnection,并将从线程池中通过一定的负载均衡算法获取到的某个线程的EventLoop传入TcpConnection构造函数。在TcpConnection中生成新通道Channel并传入对应TcpConnection的EventLoop中去,到此连接事件处理完毕。

        之后,每个线程中的每个EventLoop会调用IO多路复用(select、poll、epoll)来检测socket上客户端事件,一旦侦听到,每个活动Channel会回调给TcpConnect读出Buff,再回调给我们的业务类,同样的类似的handleClose()用于处理断开连接操作。

         对于写事件是通过我们业务层的Session,内部的TcpConnection对象发送给对端。

         到此,整个流程基本就是这样。

想法:

       我们可以看到muduo是一个基于Reactor模式的网络库,其中用到了很多的回调函数,正如书中所说,这种模式和我之的客户端编程模式不太相同,客户端开发中都是检测到消息然后主动recv消息,检测到连接后主动接受accept,muduo将这些都封装成了一个的事件处理器,通过网络库的角色告诉我们怎么做。这种基于事件的非阻塞网络编程也是现在高性能并发服务器的主流形式。之后的博客我会按照关键类一个个分析,分析每个类在这个过程中扮演了什么角色,有什么作用。

我本来想按照Tcp处理三个半事件的流程(连接建立、断开、消息到达、消息发送完毕)给大家逐个分析下代码,但是这样有很多设计的细节没有办法讲出来,决定一个一个关键类讲下具体的设计细节。

博客会按照如下顺序尽量详细说下设计细节:

          EventLoopThread+EventLoopThreadPoll设计

          EventLoop的设计

          Channel设计

          TcpConnection设计

          TcpServer和Accept设计

          Buffer类设计

          

   

猜你喜欢

转载自blog.csdn.net/qq_36533978/article/details/107975165
今日推荐