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

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 643 关注
  • TGIF

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

    293 引用 • 4496 回帖 • 664 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 453 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 290 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 192 关注
  • WiFiDog

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

    1 引用 • 7 回帖 • 616 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 114 关注
  • JRebel

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

    26 引用 • 78 回帖 • 695 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    97 引用 • 155 回帖 • 1 关注
  • 脑图

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

    32 引用 • 100 回帖
  • GraphQL

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

    4 引用 • 3 回帖 • 10 关注
  • 印象笔记
    3 引用 • 21 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 641 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 39 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 39 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 114 关注
  • CodeMirror
    2 引用 • 17 回帖 • 184 关注
  • 分享

    有什么新发现就分享给大家吧!

    249 引用 • 1799 回帖
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 658 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 111 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 565 关注
  • CSDN

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

    14 引用 • 155 回帖 • 2 关注