Netty 和 Tomcat 区别

Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,Tomcat实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。

有人说netty的性能就一定比tomcat性能高,其实不然,tomcat从6.x开始就支持了nio模式,并且后续还有arp模式:一种通过jni调用apache网络库的模式,相比于旧的bio模式,并发性能得到了很大提高,特别是arp模式,而netty是否比tomcat性能更高,则要取决于netty程序作者的技术实力了。

 

为什么Netty受欢迎?

netty是一款收到大公司青睐的框架,原因有三:

并发高

传输快

封装好

 

Netty为什么并发高 

Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。

NIO 2.0里终于有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最后一种IOasynchronous I/O

1)就IO而言:概念上有5中模型:blocking I/O,nonblocking I/O,I/O multiplexing (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX aio_functions)。

2)然后呢 不同的操作系统对上述模型支持不同: unix支持io多路复用,不同系统叫法不同 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的时候就诞生了IOCP支持最后一种异步I/O 

3)Java是一种跨平台语言,为了支持异步IO,诞生了nio,Java1.4引入的NIO 1.0是基于I/O复用的。在各个平台上会选择不同的复用方式。Linux用的epoll,BSD上用kqueue,Windows上应该是重叠I/O(肯定不是IOCP)

但是nio直接使用比较难用,所以有了mina,netty这些针对网络io部分(tcp/udp-传输层)的封装(nio也有非网络io部分),为了使nio更易用。

 

http是应用层的协议

servlet3.0则是另外一种东西,不是对协议的封装,javaee6众多规范中的一个,但凡javaee6的实现(或者像tomcat这种web容器部分的实现),都会支持servlet3.0,servlet理论上可以支持多种应用层协议(不单单只是http),而servlet3.0以后提供的异步特性与javase提供的nio或aio无直接关系,就是使用bio一样可以实现servlet3.0中提供的异步特性。

异步只是一种概念,异步与否要看,上层使用的异步,而支持的下层完全可能是阻塞的。

tomcat就是针对http层的,所以我建议http还是选择tomcat(或者其他成熟的http-server),并不是说netty不好,而是你的选择问题。

netty是一个网络组件,tcp,udp,http都可以弄,但是官方文档都是些hello wolrd级别的。如果你非常了解http结构,完全可以基于netty搞出一个比tomcat牛的http server。如果做tcp开发,netty不二之选!

现在高并发分布式网站架构一般采用 nginx(前端负载均衡)+ Netty/Tomcat(HTTP)

Netty是基于Java NIO开发的,而Tomcat是Apache下的针对HTTP的服务器项目,前者更像一个中间件框架,后者更像一个工具

 

Tomcat、Netty、Jetty 简单压测报告

淘宝的旺旺是Jetty,Jetty是一个Servlet容器, 

Netty也是一个NIO的后端框架,不依赖于web容器。

Tomcat7.0.5、Netty3.2.3、Jetty-hightide-7.2.2 做了一个简单的压测,

测试方案肯定是不太严谨的,但是对于快速评估还是有点价值的,测试结果出乎意外。

压测工具: ApacheBench(简称ab), Version 2.3

 

测试服务器有两台:

被压测服务器 和 运行ab的服务器

两台服务器的配置都是:64位Linux,双CPU,4G内存

Tomcat7.0.5 使用 BIO(阻塞IO),最大线程开了200个,

Netty3.2.3和Jetty-hightide-7.2.2都使用 NIO(非阻塞IO),Jetty最大线程开了250个。

请求总数固定是10万,对每个请求的响应字节数固定是1k,

 

以下是测试结果:

第一列是最大并发数,其他三列是每妙处理的请求数,

并发500、1000时测了4次,并发2000、3000测了两次,并发10000时测了3次。

        BIO      NIO      NIO
 并发   Tomcat   Netty    Jetty
 
 500    8723     8311     4471
        11270    10737    5667
		11064    10986    5570
		11625    10469    4688
 
1000    7994     8321     5021
        10045    9885     5006
		10162    10156    4736
		9842     10166    4762
 
2000    8040     7803     4668
        8487     8148     4562
 
3000    6540     6784     4528
        7145     7166     4158
 
10000   4303     5099     3500
        4558     5973     3006
		4457     5037     3471

可以看出Tomcat和Netty只有达到10000并发时才开始有明显差距,

而Jetty在并发为2000以下时都比Tomcat和Netty要差一倍,即使达到10000并发,Jetty的NIO也比Tomcat的BIO差。

从这个结果来看,真的很怀疑在64位OS和高速局域网中是否有必要使用NIO?

 

补充:

Tomcat7.0.5的NIO基本上不可用,每次压都是:

严重: 
java.lang.OutOfMemoryError: Java heap space
        at org.apache.coyote.http11.InternalNioInputBuffer.<init>(InternalNioInputBuffer.java:58)
        at org.apache.coyote.http11.Http11NioProcessor.<init>(Http11NioProcessor.java:77)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.createProcessor(Http11NioProtoc
ol.java:435)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:
363)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1526)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
Exception in thread "http-8080-exec-321" java.lang.OutOfMemoryError: Java heap space
SEVERE:Memory usage is low, parachute is non existent, your system may start failing.

 

参考:

Netty入门教程1——认识Netty

Netty入门教程2——动手搭建HttpServer

Netty入门教程3——Decoder和Encoder

Netty入门教程4——如何实现长连接

 

 

参考推荐:

Apache、Nginx、Tomcat 区别

Jetty 工作原理以及与 Tomcat 的比较

Tomcat 系统架构与设计模式:工作原理

Tomcat 系统架构与设计模式:设计模式分析

Tomcat 多域名配置

Ubuntu配置Tomcat

Tomcat vs Apache

Nginx 架构模型深入分析

Nginx 设计原理与技术架构

Nginx location 正则匹配规则

Spring 常见技术问题总结

Spring 编程技术的经典面试题

Docker 底层技术详解

运维人员常用软件总结

高可用网站架构的技术实践

高可用系统设计的一些技术方案

高性能、高可用、高并发的网站架构技术

高性能、高可用、高并发的技术架构的常见问题

开源的力量:Twitter

Storm 配置参数详解

Twitter:一条推文背后的开源力量

Java中常见的CMS GC问题分析与解决

腾讯大数据之TDW计算引擎解析——Shuffle