Netty
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.
意思是Netty是一个高性能,高扩展性的异步事件驱动的网络应用程序框架,它极大地简化了客户端和服务器开发等网络编程。
Netty是一个比较成熟的开源框架,它的网络编程的高性能、高拓展性得到大众的认可。那么它存在的目的是什么?无疑,相比传统JDK中的网络编程技术,它更显得高性能和高拓展能力。那么问题来了,它比传统的JDK还厉害?它不是Java框架吗?它不是用Java写的?答案是对,它是Java写的,它是针对JDK网络编程的基础上进行了“重构”,让网络编程变得更加高性能和高拓展,更易于服务于大众。
那么Netty的增强点在哪里呢?下面介绍Netty的四个核心东西
Netty中的四个核心内容点:
一、ByteBuf
在Netty中引入一个叫ByteBuf的东西。它是啥?有什么用?
原来在JDK中也有那么一个东西叫ByteBuffer。嗯?名字差不多?这两个东西有什么区别?Netty引入ByteBuf的是为了取代ByteBuffer?答案是对的,就是要取代!取代的目的就很明显了,不好用,性能差。
那么说说二者的区别及作用
JDK的ByteBuffer的缺点:
- 无法动态扩容。长度是固定的,不能动态扩展和收缩,当数据大于bytebuffer容量时,会发生索引越界异常。
- api使用复杂。
Netty的ByteBuf:
- api操作便捷性
- 动态扩容(默认值256字节,最大Integer.MAX_VALUES=2GB)
- 多种bytebuf实现
- 高效的零拷贝机制
结果:对比一下,不难发现,Netty的ByteBuf不仅优化了JDK中ByteBuffer的缺点还进行了一些增强。
作用:Netty 在底层字节数据读写是以 ByteBuf 为缓冲单位进行交互的,而JDK是用ByteBuffer。
接下来重点说一下Netty中ByteBuf的一些特点
首先是ByteBuf的结构
图片来源:https://blog.csdn.net/ZBylant/article/details/83037421
由图可知,在 ByteBuf 结构存在两个指针,分别是读指针 readerIndex 和写指针 writeIndex ,始终 writeIndex > readIndex。当 writeIndex = capacity 时,ByteBuf 会一些算法来进行动态扩容,所以它的灵活性很好,然后反观JDK中的ByteBuffer如下图
图片来源https://www.cnblogs.com/stoneFang/p/6715291.html
JDK中的ByteBuffer的大小是固定的,无法扩容。position指针是当前读写的位置,即当进入写模式的时候,每写入数据position就会往下移动一格,直到 limit / capacity 的位置;当进入读模式的时候,position指针就移到第一格,然后开始读,直到 limit 。
通过对比二者的结构,可以看出Netty中ByteBuf比JDK的ByteBuffer更加灵活,性能更好。
除此之外,ByteBuf 还有一个高效的机制——高效的零拷贝机制。这是JDK中的ByteBuffer没有的。
什么是零拷贝机制?
上面讲到了 ByteBuf 是字节数据读写交互的一种单位或容器,那么如果要把这些数据组装起来呢?要怎么办?
按照一般的情况,创建一个大容器,然后把每个小容器的内容复制进去到大容器中,最后大容器的数据就组装起来了。
但是 Byte