Netty是什么?
Netty 是一个广泛使用的 Java 网络编程框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 的内部实现时很复杂的,但是 Netty 提供了简单易用的 api 从网络处理代码中解耦业务逻辑。 Netty 是完全基于 NIO 实现的,实际上相当于NIO+多线程,所以整个 Netty 都是异步的。 简单点说就是Netty提供了一个简单,间接的方法来操作网络之间的通讯。
Netty的优势是什么?
-
并发高
-
传输快
-
封装好
为什么并发高?
Netty是基于NIO实现的 ,相较于BIO(单个线程控制单个连接),它的并发性得到了很大的提高(原因在于selector的出现,使得单个线程可以控制多个连接),从下图可以明显看出NIO与BIO的区别:
BIO处理流程
NIO处理流程
在BIO中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。
而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理完数据再返回给客户端——这个过程是阻塞的,这样就能让一个Thread处理更多的请求了。
为什么传输快?
Netty的传输快其实也是依赖了NIO的一个特性——零拷贝。我们知道,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。
Netty针对这种情况,使用了NIO中的另一大特性——零拷贝,当他需要接收数据的时候,他会在堆内存之外开辟一块内存,数据就直接从IO读到了那块内存中去,在netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。
关于零拷贝的内容会在下篇博文介绍。
为什么封装好?
Netty基于NIO,同时也改进了NIO中的一些问题,将改进方法进行了封装,使用户不用在意底层操作,操作更加简便。详细会在Netty的源码分析进行介绍。
基本组件是什么?
-
Channel ----Socket
-
EventLoop ----控制流,多线程处理,并发;
-
ChannelHandler和ChannelPipeline
-
Bootstrap 和 ServerBootstrap
Channel 接口
基本的I/O操作,在基于java 的网络编程中,其基本的构造是 Socket,在jdk中channel是通讯载体,在netty中channel被赋予了更多的功能。
EventLoop 接口
EventLoop 是用来处理连接的生命周期中所发生的事情,EventLoop, channel, Thread 以及 EventLoopGroup 之间的关系如下图: