`
xsh5324
  • 浏览: 71377 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty源码分析 之 实现原理

    博客分类:
  • java
阅读更多

开门见山,在此我就不介绍Netty,关于Neety的介绍、用法我在此推荐一篇文章http://www.kafka0102.com/2010/06/167.html,关于Java NIO网络编程的知识请Google。

 

Netty版本:3.6.6

 

个人觉得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),此链表的数据结构如图:

 

                                                          (DefaultChanelPipeline)

 

 

当底层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
分享到:
评论
5 楼 xsh5324 2013-08-09  
qifan.yang 写道
楼主,你那个负载均衡是什么意思,模运算不就是循环么

对,也可以说是按照顺序循环选择工作线程来处理请求。
4 楼 qifan.yang 2013-08-08  
楼主,你那个负载均衡是什么意思,模运算不就是循环么
3 楼 qifan.yang 2013-08-07  
好文章,学习了
2 楼 xsh5324 2013-07-26  
damoqiongqiu 写道
阅             

欢迎漠骚!
1 楼 damoqiongqiu 2013-07-26  
阅             

相关推荐

    netty源码深入分析

    《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...

    Netty源码分析总结.rar

    尽管提供的子文件名是"课时34:Netty源码分析总结下期预告.mp4",并未直接提供详细内容,但我们可以通过一般性的Netty源码分析来讨论一些关键知识点。 1. **NIO基础**:Netty基于Java NIO(非阻塞I/O)构建,这是...

    netty源码和相关中文文档

    接下来,我们谈谈 Netty 的源码分析。通过阅读 Netty 源码,我们可以深入了解其设计模式和优化策略: 1. **EventLoop(事件循环)**:Netty 使用单线程的 EventLoop 实现了事件的高效分发,减少了线程切换的开销。 ...

    netty源码解析视频

    #### 五、Netty源码分析实战案例 1. **ChannelHandlerContext与ChannelHandlerAdaptor详解**: - 分析`ChannelHandlerContext`的生命周期及其与`ChannelHandler`之间的交互方式。 - 深入理解`...

    Netty4.x源码分析详解

    Netty 的源码分析主要包括以下几个方面: 1. **I/O 模型**:理解 Netty 如何利用 NIO 实现非阻塞 I/O,包括 Channel、Selector 和 Socket 的工作原理。 2. **Pipeline 实现**:分析 Handler 的添加、移除和调用链的...

    netty源码 4.*版本

    在深入探讨 Netty 源码之前,我们先了解一下 Netty 的核心概念和架构。 Netty 的主要特点包括: 1. **异步非阻塞I/O**:Netty 基于 NIO(Non-blocking I/O)库,利用了 Java 的 Channel 和 Selector,使得网络操作...

    Netty源码依赖包

    1. **理解底层机制**:通过分析Netty的源码依赖包,可以更深入地理解其内部的工作原理和设计模式,这对于优化网络应用性能至关重要。 2. **学习优秀实践**:Netty作为一个成熟且广泛使用的项目,其代码质量和架构...

    NIO+Netty5视频教程与Netty源码剖析视频教程

    压缩包内的文件"netty源码剖析视频教程.txt"可能是课程的详细大纲或笔记,提供了对课程内容的进一步概述,包括每个章节的重点和案例分析,是学习过程中不可或缺的参考资料。通过结合视频教程和文本资料,学习者可以...

    netty源码+Spring源码视频教程.txt

    ### Netty源码分析 #### 1. Netty简介 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器与客户端。其核心设计思想是简化网络编程的复杂性,并提供高度可定制化的API,...

    netty源码解析视频.txt

    通过对Netty源码的深入分析,我们不仅能够了解到其内部工作原理,还能学习到许多优秀的设计思想和技术实践,这对于提高个人的技术水平和解决实际问题有着非常重要的意义。希望本文能够帮助读者更好地理解和掌握Netty...

    Netty核心精讲之Reactor线程模型源码分析.mp4

    Netty的源码分析中,我们会关注以下几个关键点: 1. `NioEventLoop`:这是Netty针对Java NIO实现的EventLoop类,其中包含了对选择器(Selector)的管理和事件的分发。 2. `ChannelHandlerContext`:它是Netty的上...

    netty_learn_netty_源码.zip

    通过阅读和分析这个“netty_learn_netty_源码.zip”中的源代码,你可以深入了解Netty如何实现这些功能,以及它是如何优化网络通信效率的。此外,你还可以学习到Netty如何处理异常、优雅地关闭连接、线程安全等问题,...

    Netty权威指南源码-maven版

    这个“Netty权威指南源码-maven版”压缩包包含了使用 Maven 构建系统的 Netty 框架的源代码,旨在帮助开发者深入理解 Netty 的工作原理并进行实际开发。 Netty 的核心特性包括: 1. **异步非阻塞I/O**:Netty 基于...

    netty源码深入剖析.txt

    《Netty源码深入剖析》一书旨在帮助读者深入了解Netty框架的工作原理和技术细节,从基础知识入手,逐步过渡到高级优化技巧,使开发者能够更好地掌握并应用Netty于实际项目中。 ### 一、Netty简介与核心特性 Netty...

    Netty源码阅读笔记

    以上内容便是Netty源码阅读笔记中提到的主要知识点。这些知识点构成了Netty框架的核心,涵盖了从数据容器到事件处理,再到粘包半包问题处理的完整流程。了解和掌握这些知识点对于深入使用Netty进行网络编程具有重要...

    java Netty 框架例子源码.rar

    Java Netty 是一个高性能、异步...通过分析这些示例源码,我们可以深入理解 Netty 的工作原理,掌握如何在实际项目中构建高性能的网络应用。同时,这也将有助于我们了解如何处理异常、实现安全性以及优化网络通信性能。

    netty权威指南 源码

    此外,源码分析有助于我们了解 Netty 如何处理网络事件、协议解析、线程调度等核心问题,对于提高开发水平和解决实际问题大有裨益。 书中可能涵盖了以下主题: - Netty 的设计理念和架构 - 异步事件驱动模型的实现...

    netty4 sources 源码

    源码分析对于理解Netty的工作原理、优化性能以及定制化开发非常有帮助。 Netty 的核心特性包括: 1. **异步事件驱动**:Netty 使用非阻塞I/O(NIO)模型,通过事件循环(EventLoop)和通道(Channel)来处理网络...

    Netty源码剖析与实战视频教程

    总的来说,Netty源码剖析与实战视频教程将引导你深入了解Netty的架构和工作流程,提升你的网络编程能力。通过学习,你不仅可以理解Netty如何实现高效的网络通信,还能学会如何利用它的强大功能来构建高性能的网络...

    Netty源码解析1

    学习Netty源码可以从以下几个方面入手: 1. 了解TCP协议基础,理解连接建立、数据传输和关闭的过程。 2. 熟悉Java多线程,理解线程池和并发控制。 3. 学习NIO的基本概念,包括Selector、Channel和Buffer等。 4. 分析...

Global site tag (gtag.js) - Google Analytics