Netty是基于Java NIO的网络应用框架,是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来开发网络应用程序,这种新的方式使得它很容易上手和有很强的扩展性。Netty的内部实现是很复杂的,但是Netty提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。
Netty的架构特点是: 异步非阻塞、基于事件驱动、高性能、高可靠性、高扩展性、安全性和高可定制性。
C/S并发架构中经常涉及到选择线程型架构,还是选择事件型架构?所谓线程型架构是指当面临多个并发请求时服务器生成对应数量的线程分别处理这些请求,而创建、调度线程是非常消耗系统资源的,因此,当并发请求数比较大时,这种架构经常会拖垮整个系统。而事件型架构是指当面临多个并发请求时,服务器通过指定的进程去接收这些请求,接收后并不立即处理,而是通过队列维持这些请求,并交由指定的进程进行消费处理,当请求被处理完成后,再给出响应。线程型架构是典型的请求响应式处理方式,是同步的。而事件型架构是异步的。
线程型架构的缺陷总结如下:
线程模型存在致命缺陷:1对1连接的线程模型导致服务器无法承受大量客户端的并发连接。
性能差:频繁的上下文切换导致CPU利用率不高。
可靠性差:由于所有的IO操作都是同步的,所以业务线只要进行IO操作,也会被同步阻塞的风险,这会导致系统的可靠性差,依赖外部组件的处理能力和网络的请情况。
事件型架构的优势总结如下:
NIO采用Reactor模式,一个Reactor线程聚合一个多路复用器selector,它可以同时注册、监听和轮训成百上千个Channel,一个IO线程可以同时并发处理N个客户端连接,线程模型优化为1:N(N < 进程可用的最大句柄数),或者M:N(M通常为CPU核数 + 1, N < 进程可用的最大句柄数)。
由于IO线程总数有限,不会存在频繁的IO线程之间上下文切换和竞争,CPU利用率高。
所有的IO操作都是异步的,即使业务线程直接进行IO操作,也不会被同步阻塞,系统不再依赖外部的网络环境和外部应用程序的处理性能。
由于切换到NIO编程之后可以为系统带来巨大的可靠性、性能提升,所以,目前采用NIO进行通信已经逐渐成为主流。
Tomcat,Apache,Resin等是典型的面向线程型架构的服务器,通常适合做业务服务器。
Nginx是面向事件(epoll)的服务器,通常适合做高并发的负载均衡服务器。
Netty是面向事件(selector)的服务器,通常适合做高并发的业务服务器。
同步阻塞式模型和异步非阻塞式模型的对请求的处理方式是截然不同的,使用两者开发出来的应用程序具有截然不同的架构,简单点理解,在Tomcat上运行的程序需要较大的重构甚至重写才能适配Netty框架。
开发异步、非阻塞的TCP网络应用程序。
开发异步、非阻塞的UDP网络应用程序。
开发异步文件传输应用程序。
开发异步HTTP服务器和客户端应用程序。
提供对多种编解码框架的集成,包括谷歌的 Protobuf、Jbossmarshalling、Java 序列化、压缩编解码、XML 解码、字符串编解码等,这些编解码框架可以被用户直接使用;
提供形式多样的编解码基础类库,可以非常方便的实现私有协议栈编解码框架的二次定制和开发;
基于职责链模式的 Pipeline-Handler 机制,用户可以非常方便的对网络事件进行拦截和定制;
所有的 IO 操作都是异步的,用户可以通过 Future-Listener 机制主动 Get 结果或者由 IO 线程操作完成之后主动 Notify 结果,用户的业务线程不需要同步等待;
IP 黑白名单控制;
打印消息码流;
流量控制和整形;
性能统计;
基于链路空闲事件检测的心跳检测
Netty 是业界最流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如 Hadoop 的 RPC 框架 Avro 使用 Netty 作为通信框架。很多其它业界主流的 RPC 和分布式服务框架,也使用 Netty 来构建高性能的异步通信能力。
正是因为这些优点,Netty 逐渐成为 Java NIO 编程的首选框架。
参考: