Netty源码分析之二类的分层设计

本贴最后更新于 3122 天前,其中的信息可能已经天翻地覆

在netty中,有些类的职责非常丰富,比如NioEventLoop,既是一个单线程的任务调度器(自己维护一个任务队列),也可以注册channel,同时也具备Reactor线程模型的特性,处理I/O操作;一个类怎么能同时实现具备这么多的特性?其思路就是分层化解,将某些具体相关功能集中到一个类中,各个类各司其职,通过继承或实现的方式来形成一颗类继承树,最底层的类具备的职责最多。如下图:

classdesign

总体上来说,netty是利用多线程技术和多路复用器技术实现了高并发和高性能要求下的异步网络服务器端程序的开发框架。所以在netty中,重要的关键类都需要继承自jdk提供的线程池,并且要使用多路复用器技术,也需用引入jdk的Selector。
下面我们看看netty中的类是如何分层设计的,以transport模块为例。

 

  • EventExecutorGroup

netty里面的顶级类,负责提供一个EventExecutor(事件执行器),通过next方法,返回属于该group中所有事件执行器中的一个;
负责控制EventExecutor的整个生命周期;
是一个ScheduledExecutorService类型的线程池,定时任务调度;
是一个线程池;
一个迭代器(iterator方法,返回的是所有此group拥有的EventExecutor);
是EventExecutor的容器。

  • EventExecutor

继承自EventExecutorGroup,是一个特殊的EventExecutorGroup,通过parent()方法获取所属的EventExecutorGroup;
一个事件执行器,提供inEventLoop方法查看一个线程在事件处理环中是否被执行。

  • EventLoopGroup

继承自EventExecutorGroup,可以注册channel,提供注册接口方法register;
其next方法也是继承自EventExecutorGroup,但是返回类型为EventLoop,不再是EventExecutor,而EventLoop是继承自EventExecutor,所以如果需要修改父类的接口,那么可以通过修改其返回类型的继承关系实现。

  • EventLoop

继承自EventLoopGroup和EventExecutor,是一个事件处理环(或者叫做多路复用环),将会处理某个channel的所有I/O操作,当然前提是这个channel必须在这个环上注册过,一般一个eventloop会处理多于一个channel,这个主要依赖于其实现细节。感觉这个类就是一个为了使框架完整而存在的。

  • SingleThreadEventExecutor

 EventExecutor的抽象基类实现,用单线程方式执行所有提交的任务,自身维护一个任务队列。关于该任务队列的公共操作都抽取在该类中完成。需要子类完成的通过抽象方法实现。公共操作具体包括有:

execute()方法中,往队列中添加task
构造方法中,实现一个队列,存放task;其子类可以自定义该队列类型,覆盖newTaskQueue()
abstract run(),给继承类自己实现,负责运行具体task
  • SingleThreadEventLoop

继承自SingleThreadEventExecutor和EventLoop,以单线程方式执行所有提交的任务,该类是一个功能集的体现。

  • MultithreadEventExecutorGroup

直接继承自AbstractEventExecutorGroup(该类的目的其实就是为了避免某个接口其下的实现类实现过多不必要的方法而存在的),间接继承自EventExecutorGroup,其功能还不是很复杂,只是一个事件执行器的容器;
用多线程方式同时处理任务,其内部包括一个EventExecutor的数组,所有的事件执行器都存在该数组中(对于这种事件执行器的容器,其具体容器的选择由各个实现类自己决定),事件执行器就是SingleThreadEventExecutor。

  • NioEventLoopGroup

MultithreadEventExecutorGroup的间接实现类,会调用其包含的事件执行器进行操作,专注于NIO的Selector等公共操作抽取出来。

  • NioEventLoop

继承自SingleThreadEventLoop,功能集。
一个多路复用器操作类,用于轮询其上注册的所有channel。

从这个图上可以看出,抽象的公共集放置在顶端,其下的每个节点都具有各自特定的功能,而越往下,节点具有的功能集越多。
我们可以总结一些特点:

  • 抽取出公共功能放在顶端
  • 需要重写的使用抽象方法由具体实现类去实现
  • 将复杂的功能类进行分解,可以按照功能点来分解,由不同的类来负责单一职责,职责类之间可以关联,但是关系不能太复杂
  • 具有多功能的类通过继承单一职责类的方式实现
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 30 关注
  • 继承
    6 引用 • 17 回帖
  • channel
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 701 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 488 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    31 引用 • 96 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 3 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖 • 3 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    295 引用 • 749 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    24569 引用 • 100643 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    87 引用 • 139 回帖 • 1 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 438 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 74 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 441 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 499 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 21 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 389 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 53 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 595 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 604 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    549 引用 • 674 回帖