IO基本概念
学习整理源自:https://blog.csdn.net/vtopqx/article/details/88115899
总结
Netty
利用Java高级网络能力,隐藏其背后的复杂性而提供的一个易于使用的API,是一个C-S框架。
Tomcat时基于Http协议的,实质是一个基于http协议的容器;
netty能通过编程自定义各种协议——可以通过codec自己编码/解码字节流,完成类似redis访问的功能。
Netty受到大公司的青睐,因为其具备以下三个特点:高并发、传输快、封装好。
Netty高并发
它是一款基于NIO开发的网络通信框架,相对于BIO,NIO一个线程可以处理多个socket连接,因此在有限线程资源的前提下,NIO可以提供更高的并发连接及处理能力。
下图可以看出,BIO中一个线程只能处理一个socket(其读写都是被阻塞的)。而在NIO中,引入了selector,当socket建立之后,线程不会阻塞去接收某个socket的消息,而是交给selector,selector不断轮询,一旦有socket触发了IO事件,它就会通知到线程对数据进行处理。
Netty传输快
以来了NIO的零拷贝特性。一般的,数据如果从IO读取到内存,需要经过socket缓冲区,也就是需要经过两次拷贝才能到达内存。如果数据量大会造成不必要的资源浪费。Netty在接收数据时,会在堆内存之外开辟一块内存,数据直接从IO读取到这块内存中,在netty里通过ByteBuffer可以直接读取这些数据,加快了传输速度。
Netty封装好
Netty将Socket相关的细节操作做了封装,比直接使用Java的NIO接口要有好的多。
Netty中的概念
Channel:数据传输流。
Channel表示一个连接,每个请求就是一个channel;
ChannelHandler,核心处理业务,用于处理业务请求;
ChannelHandlerContext,用于传输业务数据;
ChannelPipeline,用于保存处理过程中需要用到的channelHandler和ChannelHandlerContext。
ByteBuffer,一个存储字节的容器,既有自己的读写索引,方便对整段字节缓存读写,也支持get/set,方便对其中每个字节进行读写。
有三种使用模式:
Heap Buffer堆缓冲区:最常用的模式,将数据存储在堆空间;
Direct Buffer直接缓冲区:内存分配不发生在堆上,jdk1.4引入的NIO允许jvm调用本地方法分配内存;
Composite Buffer复合缓冲区:相当于多个不同的Buffer视图,是Netty提供的,Jdk具备这种功能。
Codec,Netty中的编码、解码器,可以完成字节与POJO、POJO与POJO的相互转换,从而达到自定义协议的目的。如HttpRequestDecoder和HttpResponseEncoder。