大神是如何理解Netty里面的构件的?
Posted AaronLeung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大神是如何理解Netty里面的构件的?相关的知识,希望对你有一定的参考价值。
最美的不是下雨天,是曾与你躲过雨的屋檐——方文山
人类的大脑能够发展到现在的发达情况,还是因为善于开发,懂得如何开发。正如一直被视为网络编程也亦如此,很多概念非常的抽象,但是善于运用大脑的机制是很容易达到理解并且运用的效果。比如Netty这个编程界的里程碑,很多人都说如果你对java的源码反复的阅读,达到一定的瓶颈,甚至厌倦的情况,请你一定要好好看看Netty的源码,当然网上很多推荐看的书籍也是甚多,但是本人觉得还行自行从git下载最新的源码,通读一遍然后自建理解体系,再通过一些实战的观点来有所取舍的了解Netty这个框架会有比较不错的效果。
正题说到的Netty框架的使用,在阅读本文的时候建议15分钟,主要理解过程为主,如果你要想了解Netty你应该是对java有一定的了解,以及有自己深刻的体会,每次当java遇到技术瓶颈要被人淘汰,都出现了大神级别的框架来给人们使用。比如Netty,Spring,等等。
现在来分几个模块来了解Netty,从组建的整体把握,再到逻辑处理,然后是应用领域。
组件的整体把握。
提到这里不得链接一张我自己归纳的理解图,如果有好用的3D工具,小伙伴也可以推荐。这里大部分图片来自 ImportNew
图中所示,这是Reactor模型,而ThreadPool是对传统的Netty的扩展,多路复用的传递到了多个read对象以及send对象,每个大圈都为一个Channel,而每个Channel里面会注册n个pipeline,而多个pipeline会共享一个chandler,而多个chandler也可以服务多个pipeline,而资源分配方面就是由我们的cpu分派给到各自的thread,而thread就是我们的evenLoop,evenLoop会承接这些Channel的处理,比如我们一个I/O过来需要对请求进行decode,然后从后台逻辑,访问磁盘,获取数据返回到pipeline再进行encode,响应个client,这个过程就是使用到了evenLoop来分配资源处理,这个就是为什么解决了我们的传统的socket阻塞的通病,这样的设计无需等待read对象,write对象的返回才能处理下个逻辑,而是通过多个evenLoop注册到我们的channel,而这些evenLoop会在没有自己需要运行的队列任务的时候就会通过channelHandlerContex来分配执行已经注册的channel里面的handler逻辑,这样的设计就大大的减少的thread的资源分配的浪费以及消耗。
逻辑处理
提到逻辑处理就是肯定是我们顶层设计的EvenExecutorGroup,这个是扩展了java.util.concurrent包的Executor接口,为了能否使用到executor这个对象,分别出现了子接口SingleThreadEvenExecutor,以及其扩展的子接口,也就是我们最常用的接口EvenLoopGroup,其子类为我们的资源分配者EvenLoop,他有个方法就是返回父类引用 EvenLoopGroup parent().这也是为了简化整个框架来出发的,很多时候我们的程序如果出现大量配置一样的对象的对象的时候可以实现Cloneable这个接口。
我们的ChannelHandlerContext的作用做了个协调各种handler对I/O的操作。
实战应用
对于这部分的内容后续会更新,毕竟设计到工作上的一些内容。
最后配个图,有疑问可以留言,尽快回复。
以上是关于大神是如何理解Netty里面的构件的?的主要内容,如果未能解决你的问题,请参考以下文章
netty的Future异步回调难理解?手写个带回调异步框架就懂了附源码