欢迎来到天天文库
浏览记录
ID:30790886
大小:852.73 KB
页数:14页
时间:2019-01-03
《netty实现原理浅析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Netty实现原理浅析-编程开发技术Netty实现原理浅析原文出处:kafka0102的博客Netty是JBoss出品的高效的JavaNI0开发框架,关于其使用,可参考我的另一篇文章?nctty使用初步。木文将主要分析Netty实现方面的东西,由于精力冇限,本人并没冇对其源码做了极细致的研究。如果下而的内容冇错误或不严谨的地方,也请指正和谅解。对于Netty使用者来说,Netty提供了儿个典型的example,并有详尽的APIdoc和guidedoc,木文的一些内容及图示也来自于Netty的文档,特此致谢。1、总体结构T?ansportServices
2、BlockingOldI/OSockethansportHTTPGoogleProtobufTextLineProtocolsBinaryProtocolsCodecFrameworkNon-blockingNIOSocket"ansportProtocolSupportExtensibleEventModelOOM-ProofThreadPoolSSL/StartTLSContainer1ntegrationOSGiJBossMCSpringGuiceSecuritySupportUniversalCommunicationAPIZero-Copy-
3、CapableRichByteBuffer先放上一张漂亮的Netty总体结构图,下面的内容也主要围绕该图上的一些核心功能做分析,但对如ContainerIntegration及SecuritySupport等高级可选功能,木文不予分析。2、网络模型Netty是典型的Reactor模型结构,关于Reactor的详尽阐释,可参考P0SA2,这里不做概念性的解释。而应用JavaNIO构建Reactor模式,DougLea(就是那位让人无限景仰的大爷)在"Scalable10inJava"中给了很好的阐述。这里截取其PPT屮经典的图例说明Reactor模式的典
4、型实现:1、这是最简单的单Reactor单线程模型。Reactor线程是个多而手,负责多路分离套接字,Accept新连接,并分派请求到处理器链中。该模型适用于处理器链屮业务处理组件能快速完成的场景。不过,这种单线程模型不能充分利用多核资源,所以实际使用的不多。2、相比上一种模型,该模型在处理器链部分采用了多线程(线程池),也是后端程序常用的模型。3、第二种模型比起第二种模型,是将Reactor分成两部分,mainRcactor负责监听serversocket,accept新连接,并将建立的socket分派给subReactor<>subReactor负
5、责多路分离已连接的socket,读写网络数据,对业务处理功能,其扔给worker线程池完成。通常,subReactor个数上可与CPU个数等同。clientmainsubReactorclientsendreadsendreadclientsendreadfhreadPooldecoddecodacceptoromputle(encodompute(encodworkerthreaddecodencodqueuedtasks说完Rcacotr模型的三种形式,那么Netty是哪种呢?其实,我述有一•种Reactor模型的变种没说,那就是去掉线程池的第三种
6、形式的变种,这也是NettyN10的默认模式。在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是Runtime.getRuntime().availableProcessors())。在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffcr中,之后触发ChannelPipeline中的ChannelHandler流。Netty是事件駆动的,可以通过ChannelHandler链来控制执行流向。因为ChannelHandler链的执行过程是在
7、subReactor中同步的,所以如果业务处理handler耗时长,将严重影响口J支持的并发数。这种模型适合于像Memcache这样的应用场景,但对需要操作数据库或者和其他模块阻塞交互的系统就不是很合适。Netty的可扩展性非常好,而像ChannelHandler线程池化的需要,可以通过在ChannelPipeline中添加Netty内置的ChannelHandler实现类-ExecutionHandler实现,对使用者来说只是添加一行代码而已。对于ExecutionHandler需要的线程池模型,Netty提供了两种口J选:1)MemoryAware
8、ThreadPoolExecutor口J控制Executor中待处理任务的上限(超过上限时,后
此文档下载收益归作者所有