1.Netty: Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
·应用案例:阿里巴巴的Dubbo,Twitter
2.Netty应用场景:
·高性能领域
·多线程并发领域
·异步通信领域
3.原生NIO的缺陷:
·类库和API繁杂
·书写复杂
·工作量和难度大
·JDK NIO存在BUG
4.Netty优势:
·API简单
·书写简单
·性能高
·成熟稳定,商业应用广
5.Netty对于NIO中的BUG修复
1.对Selector的select操作周期进行统计。
2.每完成一次空的select操作进行一次计数。
3.在某个周期内如果连续N次空轮询,则说明触发了JDK NIO的epoll死循环bug。
4.创建新的Selector,将出现bug的Selector上的channel重新注册到新的Selector上。
5.关闭bug的Selector,使用新的Selector进行替换。
6.Netty中的ByteBuf 的几种变化过程:
初始化:
BEFORE discardReadBytes():
AFTER discardReadBytes()
BEFORE clear()
AFTER clear()
注:以上图片内容来自于JDK1.8.151
·比较:
|-ByteBuffer缓冲区的长度固定,ByteBuf则对其进行了改进,它会自动扩展,具体的做法是,写入数据时,会调用
ensureWritable方法,传入我们需要写的字节长度,判断是否需要扩容
|-ByteBuffer中只有一个位置指针position,读写需要flip切换
7.直接内存与堆内存
·NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自
ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的
限制;而DirectBuffer直接分配在物理内存中,并不 占用堆空间,其可申请的最大内存受操作系统限制。
·直接内存的读写操作比普通Buffer快,但它的创建、销毁比普通Buffer慢。因此直接内存使用于需要大内存空间频繁
访问的场合,不适用于频繁申请释放内存的场合。
·与在JVM堆分配内存(allocate)相比,直接内存分配(allocateDirect)的访问性能更好,但分配较慢。
8.零拷贝
当应用程序需要接收数据的时候,他会在堆内存之外开辟一块内存,数据就直接从IO读到了那块内存中去,在netty里面通过
ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。
9.Channel数据传输流,与channel相关的概念有以下四个:
* Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
* ChannelHandler,核心处理业务就在这里,用于处理业务请求。
* ChannelHandlerContext,用于传输业务数据。
* ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。