Netty
是由 JBOSS
提供的一个 Java
开源框架,现为 Github
上的独立项目。Netty
是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO
程序。Netty
主要针对在 TCP
协议下,面向 Client
端的高并发应用,或者 Peer-to-Peer
场景下的大量数据持续传输的应用。Netty
本质是一个 NIO
框架,适用于服务器通讯相关的多种应用场景。Netty
,需要先学习 NIO
,这样我们才能阅读 Netty
的源码。RPC
框架必不可少,Netty
作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC
框架使用。Dubbo
的 RPC
框 架使用 Dubbo
协议进行节点间通信,Dubbo
协议默认使用 Netty
作为基础通信组件,用于实现各进程节点之间的内部通信。Java
语言得到了越来越广泛的应用。Netty
作为高性能的基础通信组件,提供了 TCP/UDP
和 HTTP
协议栈,方便定制和开发私有协议栈,账号登录服务器。Netty
进行高性能的通信。Hadoop
的高性能通信和序列化组件 Avro
的 RPC
框架,默认采用 Netty
进行跨界点通信。NettyService
基于 Netty
框架二次封装实现。网址:https://netty.io/wiki/related-projects.html
为了更好的学习netty,我们必须先了解NIO
NIO是什么?
java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。
简单点来说就是非阻塞性IO。以下用个图来表示下
可以看出一个线程来处理三个客户端端连接,上图为啥说是非阻塞的呢?
同步非阻塞:服务器实现模式是一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。说人话就是一个线程轮询处理这三个请求,类似cpu处理线程一样。
以上就是NIO的简单概括在这顺便说下其它IO模式:
在这主要说下NIO对于其它IO模式不再赘述。
channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入(InputStream),要么是输出(OutputStream),channel 比 stream 更为底层。其实可以理解为一个供数据流转的通道。
常见的 Channel 有
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
以上是channel和buffer的关系图,因为数据是在channel中流转的,数据暂存区在哪呢?那当然就是buffer了。
buffer 则用来缓冲读写数据,常见的 buffer 有
ByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途
⚠️ 多线程版缺点
内存占用高
线程上下文切换成本高
只适合连接数少的场景
⚠️ 线程池版缺点
阻塞模式下,线程仅能处理一个 socket 连接
仅适合短连接场景
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)
调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理