`
berdy
  • 浏览: 512409 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Netty 4 源码分析——结构概览

阅读更多
看了两天的netty源码,现在总算有了些眉目了。下面是用excel画的一个简单的结构图


  • Channel是对最终I/O处理的封装
  • EventExecutor 封装了负责处理I/O 事件的线程
  • ChannelHandler 处理相关I/O Event的扩展接口,分为ChannelInboundHandler和[*]ChannelOutboundHandler,分别处理不同流向的事件
  • ChannelHandlerContext 对ChannelHandler相关信息的包装
  • ChannelPipeline 组装多个ChannelHandlerContext的管道,I/O事件在这个管道中流动


     这里先简单描述下异步模式,就是在执行某个操作的时候,角色A通知角色B,我要执行某个操作,然后具体的执行由角色B去执行,角色B在执行操作的时候,角色A不会一直等到角色B的操作结果,而是继续执行自己的操作。角色B执行完后会将结果通知给角色A,角色A收到结果后再处理。

     姑且给角色A取名命令者,角色B取名执行者。所以这里会有两个过程。一个是命令者通知执行者。一个是执行者通知命令者。在网络通信过程中这两个角色容易理解,命令者就是执行应用逻辑的线程,执行者是底层执行具体I/O的线程。
     具体体现到类上的,EventExecutor就是I/O操作的执行者了,命令者通知执行者的过程描述是ChannelOutboundInvoker,而执行者通知命令者的过程描述就是ChannelInboundInvoker,这里的Inbound和Outbound是面向命令者来说的,而实际应用中的命令者就是应用逻辑了,netty本身作为一个框架肯定就是服务于应用的。对比ChannelOutboundInvoker和ChannelInboundInvoker中的方法名称,发现Inbound的中的都是firexxx,fire对通知是再形象不过的描述了。而Outbound中的都是xxx(ChannelPromise promise),命令口气十足啊,同时还给了执行者一个ChannelPromise,相当于告诉了执行者执行完后,把执行结果放到指定的地方,命令者在接收到执行者执行完成的通知后,就去前面指定的ChannelPromise中去取结果。

ChannelPipeline描述的是命令者与执行者交互的过程,所以它既继承了ChannelInboundInvoker也继承了ChannelOutboundInvoker。
ChannelHandlerContext是针对ChannelHandler的包装,处于ChannelPipeline中,所以它也同时实现了两个。
Channel是负责与外部进行I/O的执行者的抽象,所以它继承了ChannelOutboundInvoker。

     首先分析下Channel接口,接口文档中可以了解到:这个接口主要是封装了一些网络的I/O操作read,write,connect,bind。另外绑定了一下Channel相关的信息。ChannelConfig指定Channel的相关配置信息,ChannelPipeline负责命令者和执行者Channel之间的I/O事件传递。
     有意思的是内部的UnSafe接口了,接口文档描述的是之所以取名UnSafe是因为不能从外部线程调用UnSafe接口中的方法,只能在Channel当前相关的I/O线程中调用。有一些接口除外,这个具体看下文档。UnSafe中才是真正的I/O操作实现,里面包含了register,bind,connect,disconnect,close,read,write,flush等操作,具体实现可以看子类了。

这里先描述下具体I/O操作调用的流程,
应用->Channel的I/O操作->调用Pipeline相应的I/O操作->调用ChannelHandlerContext的相应I/O操作->调用ChannelHandler的相应操作->Channel.UnSafe中相关的I/O操作。
应用为什么不直接调用Channel.UnSafe接口中的I/O操作呢,而要绕一个大圈呢?因为它是框架,要支持扩展。
执行者完成操作后,是如何通知命令者的呢?一般流程是这样的:
Channel.UnSafe中执行相关的I/O操作,根据操作结果->调用ChannelPipeline中相应发fireXXXX()接口->调用ChannelHandlerContext中相应的fireXXXX()接口->调用ChannelHandler中相应方法->调用应用中的相关逻辑

后面将按照上图中的各个元素逐一分析他们的源码。

  • 大小: 44.6 KB
1
0
分享到:
评论
2 楼 kimikimi276 2013-11-03  
关于netty希望尽快追加源码分析,热烈盼望阿
1 楼 kimikimi276 2013-11-03  
不错不错,实在不错,图文都有,比那些贴代码的强太多

相关推荐

    netty源码分析教程视频

    一个netty的入门教程以及源码分析视频,适合刚学习的人

    读书笔记:《Netty最佳实践》——《Netty实战》补遗.zip

    读书笔记:《Netty最佳实践》——《Netty实战》补遗

    netty源码深入分析

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

    Netty4.x源码分析详解

    在深入分析 Netty 4.x 源码之前,我们首先需要了解其核心概念和架构。 Netty 的核心组件包括: 1. **ByteBuf**: 作为传统 ByteBuffer 的替代品,ByteBuf 提供了更高效且易用的内存管理机制,支持读写分离,避免了...

    netty4源码

    netty4所有的jar包和源码,资源丰富,值得下载。

    netty4 sources 源码

    这个“netty4 sources 源码”指的是Netty 4.x 版本的源代码,其中4.0.33.Final是特定的版本号。源码分析对于理解Netty的工作原理、优化性能以及定制化开发非常有帮助。 Netty 的核心特性包括: 1. **异步事件驱动*...

    Netty 4.1源码包

    Netty4.1的源码,欢迎大家下载。.............................................................................................................................................................................

    Netty 框架学习 —— 第一个 Netty 应用(csdn)————程序.pdf

    在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...

    《Netty最佳实践》——《Netty实战》补遗-Netty-Best-Practices.zip

    《Netty最佳实践》是基于Java的高性能网络应用框架Netty的一本补充读物,它旨在为开发者提供更深入、更实用的Netty使用技巧和最佳实践。这本书的内容可能涵盖Netty的基础概念、核心组件、性能优化、异常处理、安全...

    netty4.0源码,netty例子,netty api文档

    4. **Pipeline**:Netty的ChannelHandler链是通过Pipeline实现的。Pipeline允许你自定义处理网络数据的方式,每个Handler可以执行特定的任务,如解码、加密、认证等。数据在网络中的流动就像在Pipeline中的传输一样...

    netty源码 4.*版本

    在 Netty 4.* 版本中,其源码主要包括以下几个模块: 1. **core**:核心模块,包含基本的 I/O 功能,如 Channel、EventLoop、ByteBuf 等。 2. **codec**:编解码模块,提供各种网络协议的编解码实现,如 HTTP、TCP...

    netty源码剖析视频.zip

    《Netty源码剖析视频》课程是一份深度探讨Netty框架源码及其实战应用的资源集合。课程分为两个主要部分,旨在帮助开发者深入理解Netty的内部机制,并通过实战项目提升其在实际开发中的应用能力。 第一部分,深入浅...

    以netty4.1源码中的EchoServer为例对netty的源码进行分析.docx

    在本文中,我们将深入分析 Netty 4.1 源码中的 EchoServer 示例,以理解其核心组件和工作原理。 首先,我们关注 EchoServer 服务端的初始化,这涉及到两个关键组件:`bossGroup` 和 `workerGroup`。它们都是 `...

    Netty源码分析总结.rar

    这个"Netty源码分析总结.rar"压缩包文件,从其标题和描述来看,很可能是针对Netty的源码分析课程或者笔记的集合,其中包含了对Netty核心机制的深入探讨。尽管提供的子文件名是"课时34:Netty源码分析总结下期预告....

    netty_learn_netty_源码.zip

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

    Netty4&5源码编译所需jar包

    在深入研究Netty4和Netty5的源码时,开发者可能会遇到因缺少依赖jar包而导致的编译错误。这些必要的jar包是确保Netty项目正常运行的关键组成部分。 首先,我们来看一下提供的jar包列表及其对应的功能: 1. **bar...

    netty源码分析buffer

    ### Netty源码分析之Buffer #### Java Buffer 的相关基础知识 **1. Java 基本数据类型** Java 提供了八种基本数据类型:`byte`, `char`, `short`, `int`, `long`, `float`, `double`, `boolean`。 - **`byte`**:...

    netty4.1源码

    4. **线程模型**:Netty使用EventLoop和EventLoopGroup实现了一种单线程处理多个连接的模型,减少了线程创建和销毁的开销,提高了系统效率。 5. **强大的编码解码器**:Netty提供了一系列预定义的编码解码器,如...

Global site tag (gtag.js) - Google Analytics