`
xqls
  • 浏览: 27315 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Netty-概述

    博客分类:
  • Java
阅读更多
Netty是典型的Reactor模型结构,关于Reactor的详尽阐释,可参考POSA2,这里不做概念性的解释。而应用Java NIO构建Reactor模式,Doug Lea(就是那位让人无限景仰的大爷)在“Scalable IO in Java”中给了很好的阐述。这里截取其PPT中经典的图例说明 Reactor模式的典型实现:
thanks http://www.oschina.net/bbs/thread/9863

1、这是最简单的单Reactor单线程模型。Reactor线程是个多面手,负责多路分离套接字,Accept新连接,并分派请求到处理器链中。该模型 适用于处理器链中业务处理组件能快速完成的场景。不过,这种单线程模型不能充分利用多核资源,所以实际使用的不多。

Netty使用ChannelBuffer来存储并操作读写的网络数据。ChannelBuffer除了提供和ByteBuffer类似的方法,还提供了 一些实用方法,具体可参考其API文档。ChannelBuffer的实现类有多个,这里列举其中主要的几个:

1)HeapChannelBuffer:这是Netty读网络数据时默认使用的ChannelBuffer,这里的Heap就是Java堆的意思,因为 读SocketChannel的数据是要经过ByteBuffer的,而ByteBuffer实际操作的就是个byte数组,所以 ChannelBuffer的内部就包含了一个byte数组,使得ByteBuffer和ChannelBuffer之间的转换是零拷贝方式。根据网络字节续的不同,HeapChannelBuffer又分为BigEndianHeapChannelBuffer和 LittleEndianHeapChannelBuffer,默认使用的是BigEndianHeapChannelBuffer。Netty在读网络数据时使用的就是HeapChannelBuffer,HeapChannelBuffer是个大小固定的buffer,为了不至于分配的Buffer的大小不太合适,Netty在分配Buffer时会参考上次请求需要的大小。

2)DynamicChannelBuffer:相比于HeapChannelBuffer,DynamicChannelBuffer可动态自适应大 小。对于在DecodeHandler中的写数据操作,在数据大小未知的情况下,通常使用DynamicChannelBuffer。

3)ByteBufferBackedChannelBuffer:这是directBuffer,直接封装了ByteBuffer的 directBuffer。

对于读写网络数据的buffer,分配策略有两种:1)通常出于简单考虑,直接分配固定大小的buffer,缺点是,对一些应用来说这个大小限制有时是不合理的,并且如果buffer的上限很大也会有内存上的浪费。2)针对固定大小的buffer缺点,就引入动态buffer,动态buffer之于固定 buffer相当于List之于Array。

buffer的寄存策略常见的也有两种(其实是我知道的就限于此):1)在多线程(线程池)模型下,每个线程维护自己的读写buffer,每次处理新的请求前清空buffer(或者在处理结束后清空),该请求的读写操作都需要在该线程中完成。 2)buffer和socket绑定而与线程无关。两种方法的目的都是为了重用buffer。

Netty对buffer的处理策略是:读请求数据时,Netty首先读数据到新创建的固定大小的HeapChannelBuffer中,当HeapChannelBuffer满或者没有数据可读时,调用handler来处理数据,这通常首先触发的是用户自定义的DecodeHandler,因为handler对象是和ChannelSocket 绑定的,所以在DecodeHandler里可以设置ChannelBuffer成员,当解析数据包发现数据不完整时就终止此次处理流程,等下次读事件触发时接着上次的数据继续解析。就这个过程来说,和ChannelSocket绑定的DecodeHandler中的Buffer通常是动态的可重用 Buffer(DynamicChannelBuffer),而在NioWorker中读ChannelSocket中的数据的buffer是临时分配的固定大小的HeapChannelBuffer,这个转换过程是有个字节拷贝行为的。

对ChannelBuffer的创建,Netty内部使用的是ChannelBufferFactory接口,具体的实现有 DirectChannelBufferFactory和HeapChannelBufferFactory。对于开发者创建 ChannelBuffer,可使用实用类ChannelBuffers中的工厂方法。
分享到:
评论

相关推荐

    netty-socketio:在Java上实现的Socket.IO服务器。 实时Java框架

    Netty-socketio概述 该项目是服务器的开源Java实现。 基于服务器框架。 结帐 根据Apache License 2.0许可。 产品特点 支持0.7 ... 0.9.16 ( netty -socketio 1.6.6)和1.0+ (netty-socketio最新版本)版本 支持...

    netty实战-netty-thing.zip

    1. **Netty概述**:Netty是由JBOSS提供的一个开源框架,基于Java NIO(非阻塞I/O)构建,它提供了一组高度优化的网络操作API,简化了网络编程的复杂性,如TCP、UDP和HTTP等传输协议。 2. **异步事件驱动**:Netty的...

    netty-in-action中文版

    - **Netty客户端/服务端总览**:通过概述客户端和服务端的基本结构,帮助读者理解它们之间的通信机制。 - **写一个echo服务器**:通过实现简单的回显服务器来展示Netty的基本使用方法。 - **写一个echo客户端**:与...

    netty-all-4.0.53.Final.jar

    9. `overview-summary.html`:项目概述的简洁版,提供了主要组件的简介。 10. `help-doc.html`:用户指南或帮助文档,解释如何使用这个库。 Netty的核心特性包括: - **非阻塞I/O**:基于NIO(非阻塞I/O)模型,...

    netty-in-action.pdf

    - **SPDY概述**:一种由Google设计的网络协议,旨在减少网页加载时间。 - **Netty中的SPDY**:Netty支持SPDY协议,可通过特定的Codec实现。 #### 十一、UDP广播事件 - **UDP基础**:一种无连接的传输协议。 - **...

    netty-file-master.rar

    1. **Netty 框架概述** Netty 是由 JBoss 提供的开源框架,它基于 Java NIO(非阻塞I/O)设计,提供了一种高效、灵活的方式来处理网络通信。Netty 的核心是它的事件驱动模型,通过 ChannelHandler 处理 I/O 事件,...

    netty-http3使用代码

    以上只是一个简化的概述,实际的HTTP/3应用可能涉及到更复杂的错误处理、流控制、连接管理等。在Netty中,HTTP/3的实现充分利用了其异步非阻塞I/O的能力,提供了高效和灵活的API来处理HTTP/3通信。在编写这样的应用...

    task-0.0.1.zip

    一、Netty-Tcnative概述 Netty-Tcnative是Netty项目的一部分,它为Java应用程序提供了与操作系统底层交互的能力,特别是在处理SSL/TLS协议时,能够利用硬件加速功能,显著提高性能。它结合了Apache Tomcat对本机库...

    netty-action.rar

    1. **Netty 框架概述** Netty 是基于 Java NIO(非阻塞I/O)构建的,提供了一种高效、灵活的方式来处理网络通信。它的核心组件包括 Channel、EventLoop、Buffer 和 Pipeline,这些组件协同工作,使得开发网络应用变...

    《Netty、Redis、ZooKeeper高并发实战》-netty-redis-zookeeper.zip

    Netty概述: Netty是一个基于NIO(非阻塞I/O)的客户端-服务器通信框架,它提供了高度可定制化的事件驱动、异步网络通信API。Netty简化了网络应用的开发,提供了丰富的协议库支持,包括HTTP、FTP、SMTP等,使得...

    深入浅出netty-3.rar

    1. **Netty概述** - Netty的基本架构:包括服务端Bootstrap、客户端Bootstrap、Channel、ChannelHandler和EventLoopGroup等核心概念。 - Netty的非阻塞I/O模型:基于NIO(Non-blocking I/O)和EPOLL,提供高性能的...

    NettyDemo-master.zip

    1. **Netty 框架概述** - Netty 是由 JBoss 提供的一个开源项目,它提供了一种事件驱动的非阻塞 I/O 模型,能够有效提高网络服务的性能。 - Netty 支持多种传输协议,如 TCP、UDP、HTTP、FTP 等,同时也支持自定义...

    netty 官方文档

    #### 三、Netty 用户指南概述 ##### 1. 开始前的准备 - 在正式开始之前,用户需要了解一些基本概念和准备工作,例如安装 JDK、配置开发环境等。 ##### 2. 示例代码详解 - **丢弃服务 (Discard Server):**这是 ...

    Netty jar包

    1. Netty 概述: Netty 是由 JBoss 提供的开源框架,它提供了一套高度抽象的API,使得开发者可以更专注于业务逻辑,而不是底层的网络通信细节。Netty的核心特性包括:非阻塞I/O模型、内存池管理、零拷贝优化、高效...

    Netty大纲-同步netty专栏

    - **概述**:Netty由JBOSS创始人Jochen Meskel开发,它具有高性能、低延迟、易用性等优点,广泛应用于分布式系统、游戏服务器、RPC框架等领域。 - **HelloWorld**:Netty的基本使用包括服务器端和客户端的搭建,...

    netty-app:netty原始研究的演示项目

    1. **Netty概述** Netty 是由 JBoss 提供的开源框架,它提供了丰富的网络通信库,支持多种传输协议,如 TCP、UDP、HTTP、FTP 等。Netty 的核心是其高效的事件驱动模型,使用了非阻塞 I/O(NIO)来处理网络连接,...

    在 Java 上实现的 Socket.IO 服务器

    Netty-socketio概述 该项目是Socket.IO服务器的开源 Java 实现。基于Netty服务器框架。 根据 Apache License 2.0 获得许可。 特征 支持1.x - 4.x版本的Socket.IO 客户端 支持 xhr 轮询传输 支持websocket传输 支持...

    netty实战-netty_in_action.zip

    1. **Netty概述**:Netty由JBOSS组织开发,最初为JBoss AS项目的一部分,后来成为一个独立的开源项目。Netty提供了一套统一的API,可以处理各种传输协议,如TCP、UDP、HTTP、FTP等,简化了网络编程的复杂性。 2. **...

Global site tag (gtag.js) - Google Analytics