`

Netty源码分析 之 实现原理

 
阅读更多

 

个人觉得Netty之所以高性能主要是因为它的多路I/O复用模型和零拷贝的Buffer。

Netty中有两大核心组件ChannelFactory与ChannelPipeline,可以说Netty的整个架构的核心都是靠这两大组件支撑起来的。

 

Netty的网络模型(ChannelFactory)

 



 

ChannelFactory有两组线程池BossPoolWorkerPoolBossPool相对上图的mainReactor负责接受连接请求,workerPool对应上图的SubReactorThreadPool部分,用于处理自身任务队列、读、写等操作。

BossPool工作线程接受到连接后,将此连接交给workerPoolworkerPool监听并处理此连接的读写事件.

下面看一下Netty的网络模型实现原理

ChannelFactory接口

它负责创建Channel

 

NioServerSocketChannelFactory

实现自ChannelFactory接口,服务器端的Channel工厂

 

NioClientSocketChannelFactory

实现自ChannelFactory接口,客户端的Channel工厂

这两个实现类中都维护了3个对象bossPoolworkerPoolsink;

sink:则对应PipeLine设计模式(下面会了解到)中的sink部分;

 

下面是ChannelFactory的基本原理图(有些类,有些方法看不懂没事,源码分析的时候会了解到)



 

Thread Pipeline设计模式

 

关于此设计模式的思想请参看此PPThttp://febird.googlecode.com/svn-history/r515/trunk/febird/doc/multi_thread_pipeline_cn.pptx

这个PPT讲得可能有点抽象,我举个包子解释一下:

Pipeline可以看成是生产车间的一条生产流水线,原材料(数据)经过流水线中的每一道工序加工(也就是Handler)最终成为一个产品,每道工序由不同的人(Thread)干,有的工序复杂做得比较慢,有的工序简单做得比较快,但是一个产品必需等到所有工序都加工完后才能进行组装出厂(sink所干的事)。

 

WorkThreadPool:有了生产线流水线那谁来负责生产呢?工人。如果把工人看成是一个Thread那么一个生产车间里的所有工人组成的集合可以看成是ThreadPool。正常情况下,一个工人往往会被分配很多的原材料(数据),但一个工人每次只能加工一个原材料(假设是这样),因此必需要有一个池子(任务排队)来保证工人们正常完成工作,工人的工资一般与自己加工的产品量挂钩,如果大家都从这个池子里拿原材料加工将很有可能会导致冲突(线程同步导致的阻塞),因此厂里给每个工人按月给定一定的数量的任务(WorkThread有了自己的队列),这样每个工人各自完成各自的任务,几乎不会有竞争。

ChannelPipeline的默认实现类是DefaultChannelPipeline,各个被注册到Pipeline中的ChanelHandler都是在同一个工作线程中执行的,不会被拆分到多个线程中去,DefaultChannelPipeline中维护的是一个单向前后节点相连的链表的首尾指针(head,tail),此链表的数据结构如图:



 

当底层NIO触发“读”事件的时候将从head节点开始执行如下动作:

1、判断当前节点的Handler是否实现了ChannelUpstreamHandler接口

             a)如果是则执行其handleUpstream(ctx, e)

             b)否则继续向查找next直到为next为null

 

当代码调用channel.write方法后将从tail节点开始执行如下动作:

1、判断当前节点的Handler是否实现了ChannelDownstreamHandler接口

             a)如果是则执行其handleDownstream(ctx, e)

             b)否则继续查找prev直到为prev为null

             c)当上面两种情况在执行的时候,如果当前节点的prev为null的时候则执行此Pipeline中sink对象的eventSunk方法做关闭、绑定、链接、写数据等操作



 

 

 

 从图中可以看出底层NIO触发read事件将触发PipelineUpstream直到最后的Hhandler处理完成(这里通常做解码操作)后丢弃;当用户代码调用Channelwrite方法后将触发PipelineDownStream直到最前面的Handler处理完后(这里通常做编码操作)再执行底层Socketwrite操作。

自定义的ChannelHandler可以控制是否继续执行后续的handler。这点很像Spring中的ReflectiveMethodInvocation

 

  • 大小: 80.5 KB
  • 大小: 201.5 KB
  • 大小: 7.6 KB
  • 大小: 15.3 KB
分享到:
评论

相关推荐

    深入浅出NETTY

    构,底层都需要一个...由于 Netty 源码的复杂性和 NIO 编程本身的技术门槛限制,对于大多数初学者而言,通过自己阅读和分析源码来深入掌握 Netty 的设计原理和实现细节是件非常困难的事情。感兴趣的朋友可以过来看看

    netty权威指南 第1版(李林峰) + 源码

    《Netty权威指南》第1版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...

    Netty实现原理浅析.docx

    本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 究。如果下面的内容有错误或不严谨的地方,也请指正和谅解。对于Netty使用者来说,Netty提供了几个典型的example,并有详尽的...

    精通并发与netty视频教程(2018)视频教程

    53_Netty对Executor的实现机制源码分析 54_Netty服务端初始化过程与反射在其中的应用分析 55_Netty提供的Future与ChannelFuture优势分析与源码讲解 56_Netty服务器地址绑定底层源码分析 57_Reactor模式透彻理解及其...

    精通并发与netty 无加密视频

    第53讲:Netty对Executor的实现机制源码分析 第54讲:Netty服务端初始化过程与反射在其中的应用分析 第55讲:Netty提供的Future与ChannelFuture优势分析与源码讲解 第56讲:Netty服务器地址绑定底层源码分析 第...

    netty权威指南 第2版(李林峰) + 源码

    《Netty权威指南》第2版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...

    93个netty高并发教学视频下载.txt

    88_ReplayingDecoder源码分析与特性解读;89_Netty常见且重要编解码器详解;90_TCP粘包与拆包实例演示及分析;91_Netty自定义协议与TCP粘包拆包问题解决之道;92_精通并发与Netty课程总结与展望

    Netty权威指南书中案例

    《Netty权威指南》是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和核心...

    Netty权威指南

    《Netty权威指南》是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和核心...

    精通并发与 netty 视频教程(2018)视频教程

    52_NioEventLoopGroup源码分析与线程数设定 53_Netty对Executor的实现机制源码分析 54_Netty服务端初始化过程与反射在其中的应用分析 55_Netty提供的Future与ChannelFuture优势分析与源码讲解 56_Netty服务器地址...

    Java开发面试必备知识技能总结视频合集

    HashMap源码分析与实现、JVM底层奥秘ClassLoader源码分析与案例讲解、大型网站数据库瓶颈之数据库分库分表方案实践、Spring Cloud Eureka场景分析与实战、分库分表之后分布式下如何保证ID全局唯一性、RPC底层通讯...

    ArchKnowledgeTree:架构师知识谱系梳理,包含Java core, JUC, JVM, MySQL,MQ, redis,分布式相关等各种知识点整理。是我按个人理解学习、整理出的一个知识库

    源码分析之JDBC实现原理与SPI机制 tomcat和dubbo对于JDK线程池的修改 源码分析之Java线程池ThreadPoolExecutor 常见工具 [源码分析之Guava RateLimiter源码分析](source_code/源码分析之Guava RateLimiter源码...

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统源码+数据库+项目说明.zip

    **项目描述**:项目基于 SpringCloud Gateway + Nacos + Sentinel + OpenFeign 作为分布式系统架构,基于 Netty 实现高性能网络通信。主要功能有:一对一聊天以及群组聊天、好友管理、群组管理等。 项目独立完成,...

    dubbo源码解析

    dubbo源码解析,包含dubbo框架的源码分析和原理介绍;加入了dubbo中netty是如何实现dubbo协议的粘包和拆包问题

    Java思维导图xmind文件+导出图片

    Dubbo设计原理及源码分析 基于Dubbo构建大型分布式电商平台实战雏形 Dubbo容错机制及扩展性分析 分布式解决方案 分布式全局ID生成方案 session跨域共享及企业级单点登录解决方案实战 分布式事务解决方案实战 ...

    最新JAVA架构师技术内幕!从亿万级业务处理到大型互联网高并发设计课程(16.11G)

    Kafka、Zookeeper、手写Tomcat+心跳机制、手写RPC框架、Dubbo框架、Netty源码解析、Eureka、ChannelPipeline源码解析、ElasticSearch、RocketMQ、K8S全实战、大型互联网高可用设计、ELK日志监控收集及网站流量监控...

    java8集合源码分析-java-demos:java-演示

    集合源码分析 java-demos other collect github project leetcode springCloud [Spring Cloud 从入门到实战] () [全网最详细的一篇SpringCloud总结] () [feign] () [Spring Security 真正的前后分离实现] () [Spring...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 13.RPC底层通讯原理之Netty线程模型源码分析.wmv │ │ │ ├─14.分库分表之后分布式下如何保证ID全局唯一性 │ │ 14.分库分表之后分布式下如何保证ID全局唯一性.mp4 │ │ │ └─15.大型公司面试必答之...

    java nio 原理浅析

    本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细 致的研 究。如果下面的内容有错误或不严谨的地方,也请指正和谅解。对于Netty使用者来说,Netty提供了几个典型的example,并有详尽的...

Global site tag (gtag.js) - Google Analytics