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

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

在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 回帖 • 35 关注
  • 继承
    6 引用 • 17 回帖
  • channel
    2 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖
  • 996
    13 引用 • 200 回帖 • 2 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 247 关注
  • 反馈

    Communication channel for makers and users.

    126 引用 • 930 回帖 • 272 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 678 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 288 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 叶归
    5 引用 • 16 回帖 • 10 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 2 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 1 关注
  • AngularJS

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

    12 引用 • 50 回帖 • 505 关注
  • App

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

    91 引用 • 384 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 655 关注
  • Word
    13 引用 • 40 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 6 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 518 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 760 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 4 关注