Netty是什么
Netty是由JBOSS提供的一个java开源框架。Netty是提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty的内部实现是很复杂的,但通过精心设计,Netty提供了一种新的方式来开发网络应用程序,这种新的方式使它很容易使用(易于开发),同时保证了性能、稳定性和可扩展性。在使用Netty时可以不用去管复杂的网络通信,而只关注业务开发,对网络编程和业务逻辑做了很好的解耦。
Netty在许多开源项目使用,比如Hadoop、RoketMQ以及Dubbo等等。
Netty和Tomcat
Netty和Tomcat最大的区别就在于通信协议。Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,这就是netty和tomcat最大的不同。Tomcat是一个Web Server,而Netty是一个Network Server,你甚至可以使用Netty模仿Tomcat做一个提供HTTP服务的Web容器。
是不是netty的性能就一定比tomcat性能高?
其实不然,tomcat从6.x开始就支持了nio模式,并且后续还有ARP模式——一种通过jni调用apache网络库的模式,相比于旧的bio模式,并发性能得到了很大提高,特别是ARP模式。而netty是否比tomcat性能更高,则要取决于netty使用者的技术实力了。
Netty为什么性能高?
并发高
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,与BIO(Blocking I/O,阻塞IO)相比,并发性能得到了很大提高。
BIO通信模型图
采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,接收到客户端连接之后为客户端连接创建一个新的线程处理请求消息,处理完成之后,返回应答消息给客户端,线程销毁,这就是典型的一请求一应答模型。
该架构最大的问题就是不具备弹性伸缩能力,当并发访问量增加后,服务端的线程个数和并发访问数成线性正比,由于线程是JAVA虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能急剧下降,随着并发量的继续增加,可能会发生句柄溢出、线程堆栈溢出等问题,并导致服务器最终宕机。
而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理完数据再返回给客户端。
Netty是典型的Reactor模型结构。