文章目录
前言
学习初衷
今天分析的都是netty的内容,但是我自己还没有真正用netty实战过,我主要在用vert.x,一直想把vert.x的架构设计和线程模型搞得明明白白的,之前也看过一些源码,但我觉得没有彻彻底底地搞清楚,这次花点心思搞明白。但线程模型里面最重要的就是eventLoop了,所以最近一直在学习。
最核心的类就是NIOEventLoop了,也搜索过很多博客,里面也有不少将这个类从头到尾一行一行代码分析地明明白白的。但是这样又有什么用呢?这样就算是学会了EventLoop了吗?远远不够。
学习核心
学习EventLoop的话,核心有如下几点:
- 它的设计需求是什么。
- 它的类图是如何设计的?每一个接口或者抽象类的职责是什么,它们之间的区别和联系是啥?
- 它的内部运行机制(最好用一张图能表达清楚)。
- 它是如何把JAVA的NIO结合在自己的框架里面的。
第一点:很重要,任何一种框架都有基本的设计需求,了解需求才能更好的理解整个框架。但是我们怎么可能知道它的需求呢?确实不容易,能查就查点,其它的就靠多学习多实践去体会了。
第二点:因为它的类图比较复杂,想学好它,就要做到这点。
第三点:如果你经常用它,它的内部运行机制必须要清楚,当你提交了一个任务,脑海里面立马能出现它的执行画面,做到心中有数,完全不慌。没有什么是一张图表达不清楚的,如果不能,说明理解的不到位。
第四点:它基于Java原生的NIO,但是也做了很多封装。那它到底做了什么?为什么要做这些工作?
学习它的每一行代码是为了上面这几点服务的,能够让自己的理解更加到位,说的就是更简单一点就是总结;说实话,我虽然也看了很多遍源码,当时也都看明白了,但是过几天好多细节就忘光光了。对我而言主要是可能大脑觉得没有什么用,就自动遗忘了。事实也是如此,但是如果说自己做了总结,把非常关键的设计和机制了解清楚,然后以可视化的方式表达出来,这效果可能非常好。
目前自己可能只对二、三比较了解,这和自己的学习初衷有关系,我是来研究vert.x的,不是来学习netty的,搞清楚这几点就够了。不过第四点,我觉得后续还是有必要学习的。当了解后面几点了,就可以去反推它的设计需求了,然后跟自己的理解不断碰撞,反复推敲,然后一瞬间恍然大悟~~~
类图的学习
先放一张所有博客都会出现的图吧:
确实很复杂,但是很遗憾,我几乎没有看见过对这个类图进行详细分析的博客,仅仅只是讲NIOEventLoop这个类的核心代码,包括比较火爆的netty书籍《Netty权威指南(第2版)》也没有。但是你不觉得这很重要吗?道行比较深的人,只要把类图分析清楚了,它的设计和机制基本也了然于胸了。
当然我也没有做到,刚开始我也打算这样做,但是因为类图中的一个点,觉得不可能思议,根本不合理,就放弃了,也是先看了NIOEventLoop类的所有代码以后,才回头去分析的。当然,最后也解答了内心的疑惑,后面会提到。
那么如何来分析这个类图呢?
我推荐有两个步骤:删减和增补。
删减就是把最下面的实现类全部删除掉,仅仅保留最上面的一些接口定义,比如:
就是EventExecutorGroup,这个接口是netty自定义的第一个接口,然后看了一下这个接口,我发现它本身就有自己的实现,并不是NIOEventLoopGroup,所以我又采取了增补的方式,把上面的类图补充了一下:
(话说IDEA的类图生成功能还是可以的)
从这个图里面就能够清晰的看到有两条线:
NIOEventLoopGroup,NIOEventLoop
以及
DefaultEventExecutorGroup,DefaultEventExecutor
对应的接口定义分别是:
EventLoopGroup,EventLoop
EventExecutorGroup,EventExecutor
并且从他们的层次关系上面可以看出来