1、Netty和Tomcat有什么区别? 前端
Netty和Tomcat最大的区别就在于通讯协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,可是Netty不同,他能经过编程自定义各类协议,由于netty可以经过codec本身来编码/解码字节流,完成相似redis访问的功能,这就是netty和tomcat最大的不一样。java
有人说netty的性能就必定比tomcat性能高,其实否则,tomcat从6.x开始就支持了nio模式,而且后续还有arp模式——一种经过jni调用apache网络库的模式,相比于旧的bio模式,并发性能获得了很大提升,特别是arp模式,而netty是否比tomcat性能更高,则要取决于netty程序做者的技术实力了。
为何Netty受欢迎?linux
netty是一款收到大公司青睐的框架,在我看来,netty可以受到青睐的缘由有三:
并发高
传输快
封装好
Netty为何并发高 nginx
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通讯框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能获得了很大提升。web
NIO 2.0里终于有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最后一种IOasynchronous I/Oredis
- 就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)。
- 而后呢 不一样的操做系统对上述模型支持不一样: unix支持io多路复用,不一样系统叫法不一样 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的时候就诞生了IOCP支持最后一种异步I/O
- 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中提供的异步特性。
异步只是一种概念,异步与否要看,上层使用的异步,而支持的下层彻底多是阻塞的。apache
- 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的服务器项目,前者更像一个中间件框架,后者更像一个工具windows