Netty学习笔记(1)

一、Netty介绍

Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,例如zookeeper、阿里的dubbo等。

Netty的主要特性如下所示(吐槽下MD的表格。。):

分类 Netty的特性
设计 统一的API,支持多种传输类型;阻塞的和非阻塞的简单而强大的线程模型;真正的无连接数据报套接字支持;链接逻辑组件以支持复用
易于使用 详实的Javadoc和大量的示例集;不需要超过JDK 1.6+的依赖。(一些可选的特性可能需要Java 1.7+和/或额外的依赖)
性能 拥有比Java 的核心API 更高的吞吐量以及更低的延迟;得益于池化和复用,拥有更低的资源消耗;最少的内存复制
健壮性 不会因为慢速、快速或者超载的连接而导致OutOfMemoryError;消除在高速网络中NIO 应用程序常见的不公平读/写比率
安全性 完整的SSL/TLS 以及StartTLS 支持;可用于受限环境下,如Applet 和OSGI
社区驱动 发布快速而且频繁

二、Java NIO

传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方。而NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据。

Java NIO 由以下几个核心部分组成:

  • Buffer:即缓冲区,本质上是一个基本数据类型的数组,包括:ByteBuffer、CharBuffer、IntBuffer等。ByteBuffer的实现类包括 "HeapByteBuffer" 和 "DirectByteBuffer" 两种,前者在JVM堆上申请内存,后者通过unsafe.allocateMemory申请堆外内存,并维护指向该内存的地址。
    Buffer的四个主要属性:capacity(数组大小)、position(当前可以写入或读取数据的位置)、mark(用于备份当前的position)、limit(写模式下,表示最多能往Buffer里写多少数据;读模式下,表示最多可以读取多少数据)。Buffer有读和写两种模式,通过flip()方法切换。

  • Channel:即通道。与流(Stream)相区别,Channel是双向的,可以异步读写,且Channel的数据总是要先读到一个Buffer中,或从Buffer中写入。Channel的实现类包括FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel等。
    通过源码可以发现,基于Channel的read()和write()方法都需要借助DirectByteBuffer进行两次数据复制操作

  • Selector:即选择器。Selector 允许单线程处理多个Channel,通过将具体的SelectableChannel对象注册到Selector,并声明需要监听的事件。一共有4种事件:connect、accept、read和write。
    服务端Selector主要执行过程:
    1、创建Selector
    2、将Channel注册到Selector,该Channel必须处于非阻塞模式下。register()方法会返回一个SelectionKey对象,该对象包含了以下四种属性:interest集合、read集合、Channel和Selector。
    3、为SelectionKey绑定附加对象
    4、通过Selector选择通道:
     4.1、如果没有准备好的channel,select方法会被阻塞一段时间并返回0;
     4.2、selector的select方法会返回socket的个数,而且selectedKeys方法会返回对应的事件
    5、根据事件类型,进行不同的处理逻辑

三、Netty模型

Netty内部使用Reactor模型的实现。Reactor模型基于事件驱动,特别适合处理海量的I/O事件。通俗地说:当客人点菜的时候,服务员就可以去招呼其他客人了,等客人点好了菜,直接招呼一声“服务员”,马上就有个服务员过去服务。这就是用单个线程来做多线程的事。 (也就是当准备好了,通知系统,启用一个线程来处理事情)。

Netty中的Reactor模型主要由多路复用器(Acceptor)、事件分发器(Dispatcher)、事件处理器(Handler)组成,可以分为三种。

1、单线程模型

单线程模型

该模型所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。对于一些小容量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用却不合适。

2、多线程模型


多线程模型

多线程模型的特点:

  • 有专门一个Acceptor线程用于监听服务端,接收客户端的TCP连接请求;
  • 网络IO的读写操作由一个NIO线程池负责,包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送;
  • 一个NIO线程可以同时处理多条链路,但是一个链路只能对应一个NIO线程,防止发生并发操作问题。

在绝大多数场景下,Reactor多线程模型都可以满足性能需求;但是,在极特殊应用场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。

3、主从多线程模型

主从多线程模型

它的工作流程如下:

  • 从主线程池中选择一个Reactor线程作为Acceptor线程,用于绑定监听端口,接收客户端连接;
  • Acceptor线程接收客户端连接请求之后创建新的SocketChannel,将其注册到主线程池的其它Reactor线程上,由其负责接入认证、IP黑白名单过滤、握手等操作;
  • 步骤2完成之后,业务层的链路正式建立,将SocketChannel从主线程池的Reactor线程的多路复用器上摘除,重新注册到Sub线程池的线程上,用于处理I/O的读写操作。

四、Netty组件

Netty组件示意图

他们之间的关系:

  • 一个EventLoopGroup 包含一个或者多个EventLoop;
  • 一个EventLoop 在它的生命周期内只和一个Thread 绑定;
  • 所有由EventLoop 处理的I/O 事件都将在它专有的Thread 上被处理;
  • 一个Channel 在它的生命周期内只注册于一个EventLoop;
  • 一个EventLoop 可能会被分配给一个或多个Channel。

注意,在这种设计中,一个给定Channel 的I/O 操作都是由相同的Thread 执行的,实际上消除了对于同步的需要。

参考资料:

[1] Netty源码
[2]《Netty实战》
[3] //www.greatytc.com/nb/7269354
[4] http://www.infoq.com/cn/articles/netty-threading-model#mainLogin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容