学习使用netty
netty详细介绍1:https://www.infoq.cn/article/netty-high-performance/#anch111813
netty详细介绍2:https://blog.csdn.net/sun7545526/category_7685695.html
netty使用:https://blog.csdn.net/haoyuyang/article/details/53243785
1. netty简介
Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。
作为当前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于 Netty 的 NIO 框架构建。
Netty有很多重要的特性,主要特性如下:
- 优雅的设计
- 统一的API接口,支持多种传输类型,例如OIO,NIO
- 简单而强大的线程模型
- 丰富的文档
- 卓越的性能
- 拥有比原生Java API 更高的性能与更低的延迟
- 基于池化和复用技术,使资源消耗更低
- 安全性
- 完整的SSL/TLS以及StartTLS支持
- 可用于受限环境,如Applet以及OSGI
Netty的以上特性,比较适合客户端数据较大的请求/处理场景,例如web服务器等,要想知道有哪些系统使用了Netty,可以参考:http://netty.io/wiki/adopters.html
2. bio和nio已经netty
BIO:阻塞io:在早期的java中使用:
https://blog.csdn.net/sqlgao22/article/details/102858119
NIO:非阻塞io:在java4引入
https://blog.csdn.net/sqlgao22/article/details/103087676
NIO相比于BIO,该模型有以下特点:
1.使用较少的线程便可以处理许多连接,因此也减少了内存管理和上下文切换所带来开销
2.当没有 I/O 操作需要处理的时候,线程也可以被用于其他任务.
虽然Java 的NIO在性能上比BIO已经相当的优秀,但是要做到如此正确和安全并
不容易。特别是,在高负载下可靠和高效地处理和调度 I/O 操作是一项繁琐而且容易出错的任务,此时就时Netty上场的时间了。
netty
Netty对NIO的API进行了封装,通过以下手段让性能又得到了一定程度的提升
1.使用多路复用技术,提高处理连接的并发性
2.零拷贝:Netty的接收和发送数据采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝,并且Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象进行一次操作
3.Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题
4. 内存池:为了减少堆外直接内存的分配和回收产生的资源损耗问题,Netty提供了基于内存池的缓冲区重用机制
5.使用主从Reactor多线程模型,提高并发性
6.采用了串行无锁化设计,在IO线程内部进行串行操作,避免多线程竞争导致的性能下降
7. 默认使用Protobuf的序列化框架
8. 灵活的TCP参数配置
详细说明,可参考: http://www.infoq.com/cn/articles/netty-high-performance#anch11181