Netty系列高性能高可靠性Netty通信原理分析
Posted 程序猿小秘圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty系列高性能高可靠性Netty通信原理分析相关的知识,希望对你有一定的参考价值。
概述
Netty和Mina是Java世界非常知名的通讯框架。它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io。我正好最近也要做一些网络方面的开发,就研究一下Netty的源码,顺便分享出来了。 Netty目前有两个分支:4.x和3.x。4.0分支重写了很多东西,并对项目进行了分包,规模比较庞大,入手会困难一些,而3.x版本则已经被广泛使用。
Netty是什么
Netty底层基于jdk的NIO,我们为什么不直接基于jdk的nio或者其他nio框架?下面是我总结出来的原因
1.使用jdk自带的nio需要了解太多的概念,编程复杂
2.netty底层IO模型随意切换,而这一切只需要做微小的改动
3.netty自带的拆包解包,异常检测等机制让你从nio的繁重细节中脱离出来,让你只需要关心业务逻辑
4.netty解决了jdk的很多包括空轮训在内的bug
5.netty底层对线程,selector做了很多细小的优化,精心设计的reactor线程做到非常高效的并发处理
6.自带各种协议栈让你处理任何一种通用协议都几乎不用亲自动手
7.netty社区活跃,遇到问题随时邮件列表或者issue
8.netty已经历各大rpc框架,消息中间件,分布式通信中间件线上的广泛验证,健壮性无比强大
Netty是一个异步的、事件驱动的网络应用框架,可以快速开发高性能的网络协议。
下图是来自netty home的官方图:
下面进入主题,我们先大概了解一下Netty和NIO:
1.Channel(NIO):字面理解为“通道”,用于完成一个I/O请求,也可以理解为通信的载体。
2.Selector(NIO):选择器,也可被称为多路复用器,是实现非阻塞IO的关键。它类似于一个监听器,通过地调用select()或selectNow()可以得到目前有多少channel处于I/O就绪状态,通过调用selectedKeys()得到就绪状态的SelectionKey的集合,然后遍历这一集合便可得到所有就绪状态的SelectableChannel,进一步便可以做相应的操作。
3.Buffer(NIO):缓冲区,在NIO中数据的读写都是面向buffer的,可以理解为内存里开辟的一块临时保存数据的区域,而本质上就是一个数组,然后基于position、limit、capacity、address来操作这个数组。在netty中衍生出ChannelBuffer。
4.ChannelHandler(Netty):ChannelHandler负责与I/O无关的业务逻辑处理。可以处理或拦截ChannelInboundInvoker或ChannelOutboundInvoker操作,分别用于处理上行和下行的消息,并将其转发到ChannelPipeline中交给下一个ChannelHandler。
5.ChannelEvent(Netty):Netty是基于事件驱动的,ChannelEvent是事件(数据或者状态改变)载体,例如传输的数据对应MessageEvent,状态的改变对应ChannelStateEvent。当对Channel进行操作时,会产生一个ChannelEvent,并发送到ChannelPipeline。ChannelPipeline会选择一个ChannelHandler进行处理。这个ChannelHandler处理之后,可能会产生新的ChannelEvent,并流转到下一个ChannelHandler。
6.ChannelPipeline(Netty):Pipeline的中文含义是“管道”,传输途径。也就是说在ChannelPipeline控制ChannelEvent事件分发和传递,流转到ChannelHandler中进行处理。ChannelPipeline包含两条线路:Upstream和Downstream,分别对应上行和下行的通信。
7.ChannelFuture(Netty):在Netty中所有的I/O操作都是异步的,因此我们总是得不到最终实际的I/O结果,而是得到ChannelFuture,它会包含一些I/O执行状态的结果。ChannelFuture往往配合监听器使用,在其中注册一个监听器,当操作执行成功或失败时监听会自动触发,相当于一个回调。
8.EventLoop(Netty):Netty中的线程池模型
以上是关于Netty系列高性能高可靠性Netty通信原理分析的主要内容,如果未能解决你的问题,请参考以下文章