Tomcat是基于Http协议的,实质是一个基于http协议的web容器; Netty能经过编程自定义各类协议,由于netty可以经过codec本身来编码/解码字节流。
netty的性能不必定比tomcat性能高,tomcat从6.x开始就支持了nio模式,而且后续还有APR模式(一种经过JNI调用apache网络库的模式),相比于旧的bio模式,并发性能获得了很大提升,特别是APR模式。html
基于多路复用的NIO(Nonblocking I/O,非阻塞IO)开发的网络通讯框架,对比于BIO并发性能获得了很大提升。java
等待客户端发数据这个过程是阻塞的,这样就形成了一个线程只能处理一个请求的状况,而机器能支持的最大线程数是有限的(linux 的unlimit)。linux
当一个Socket创建好以后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历全部的Socket,一旦有一个Socket创建完成,他会通知Thread,而后Thread处理完数据再返回给客户端。这样就能让一个Thread处理更多的请求了。web
Netty的传输快其实也是依赖了NIO的一个特性——零拷贝。apache
Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,通常数据若是须要从IO读取到堆内存,中间须要通过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,若是数据量大,就会形成没必要要的资源浪费。(数据从网卡到内核空间 -> 内核空间再copy到用户空间)编程
Netty当须要接收数据的时候,他会在堆内存以外开辟一块内存,数据就直接从IO读到了那块内存(堆外内存)中去,在netty里面经过ByteBuf能够直接对这些数据进行直接操做,从而加快了传输速度。缓存
相对于JDK提供的BIO和NIO实现方式,Netty的封装更胜一筹。tomcat
几个重要的概念。网络
Codec
能完成字节与pojo、pojo与pojo的相互转换,从而达到自定义协议的目的!!
在Netty里面最有名的就是HttpRequestDecoder和HttpResponseEncoder了。数据结构