Netty是什么?
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。
Netty的体系结构
Netty的体系结构图如下:
Netty的核心结构
Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。
在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。
Netty是事件驱动的,可以通过ChannelHandler链来控制执行流向。因为ChannelHandler链的执行过程是在subReactor中同步的,所以如果业务处理handler耗时长,将严重影响可支持的并发数。
核心结构图如下:
Netty的特点
设计
1.针对多种传输类型的统一接口 - 阻塞和非阻塞。
2.简单但更强大的线程模型。
3.真正的无连接的数据报套接字支持。
4.链接逻辑支持复用。
易用性
1.大量的 Javadoc 和 代码实例。
2.除了在 JDK 1.6 + 额外的限制。(一些特征是只支持在Java 1.7 +。可选的功能可能有额外的限制)
性能
1.比核心 Java API 更好的吞吐量,较低的延时。
2.资源消耗更少,这个得益于共享池和重用。
3.减少内存拷贝。
健壮性
1.消除由于慢,快,或重载连接产生的 OutOfMemoryError。
2.消除经常发现在 NIO 在高速网络中的应用中的不公平的读/写比。
安全
1.完整的 SSL / TLS 和 StartTLS 的支持。
2.运行在受限的环境例如 Applet 或 OSGI。
社区
1.发布的更早和更频繁。
2.社区驱动。
Netty的新特性
1.处理大容量数据流更简单。
2.处理协议编码和单元测试更简单。
3.I/O超时和idle状态检测。
4.应用程序的关闭更简单,更安全。
5.更可靠的OutOfMemoryError预防。
Netty的传输方式
1.基于BIO和NIO的UDP传输。
2.本地传输(又名 in-VM传输)。
3.HTTP通道,可绕过防火墙。
Netty的使用场景
互联网行业
在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。 典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。
游戏行业
无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈。 非常方便定制和开发私有协议栈,账号登录服务器,地图服务器之间可以方便的通过 Netty 进行高性能的通信。
大数据领域
经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨界点通信,它的 Netty Service 基于 Netty 框架二次封装实现。