Netty-01
Netty简介
Netty
是由JBOSS
提供的一个Java
开源框架,现为Github
上的独立项目。Netty
是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络IO
程序。Netty
主要针对在TCP
协议下,面向Client
端的高并发应用,或者Peer-to-Peer
场景下的大量数据持续传输的应用。Netty
本质是一个NIO
框架,适用于服务器通讯相关的多种应用场景。- 要透彻理解
Netty
,需要先学习NIO
,这样我们才能阅读Netty
的源码。
Netty 的应用场景
互联网行业
- 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的
RPC
框架必不可少,Netty
作为异步高性能的通信框架,往往作为基础通信组件被这些RPC
框架使用。 - 典型的应用有:阿里分布式服务框架
Dubbo
的RPC
框 架使用Dubbo
协议进行节点间通信,Dubbo
协议默认使用Netty
作为基础通信组件,用于实现各进程节点之间的内部通信。
游戏行业
- 无论是手游服务端还是大型的网络游戏,
Java
语言得到了越来越广泛的应用。 Netty
作为高性能的基础通信组件,提供了TCP/UDP
和HTTP
协议栈,方便定制和开发私有协议栈,账号登录服务器。- 地图服务器之间可以方便的通过
Netty
进行高性能的通信。
大数据领域
- 经典的
Hadoop
的高性能通信和序列化组件Avro
的RPC
框架,默认采用Netty
进行跨界点通信。 - 它的
NettyService
基于Netty
框架二次封装实现。
其它开源项目使用到 Netty
网址:https://netty.io/wiki/related-projects.html
为了更好的学习netty,我们必须先了解NIO
NIO
NIO是什么?
java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。
简单点来说就是非阻塞性IO。以下用个图来表示下
可以看出一个线程来处理三个客户端端连接,上图为啥说是非阻塞的呢?
同步非阻塞:服务器实现模式是一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。说人话就是一个线程轮询处理这三个请求,类似cpu处理线程一样。
以上就是NIO的简单概括在这顺便说下其它IO模式:
- BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
- NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
- AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
在这主要说下NIO对于其它IO模式不再赘述。
NIO的三大组件
Channel
常见的 Channel 有
-
FileChannel
-
DatagramChannel
-
SocketChannel
-
ServerSocketChannel
以上是channel和buffer的关系图,因为数据是在channel中流转的,数据暂存区在哪呢?那当然就是buffer了。
Buffer
buffer 则用来缓冲读写数据,常见的 buffer 有
-
ByteBuffer
-
ShortBuffer
-
IntBuffer
-
LongBuffer
-
FloatBuffer
-
DoubleBuffer
-
CharBuffer
⚠️ 多线程版缺点
-
内存占用高
-
线程上下文切换成本高
-
只适合连接数少的场景
⚠️ 线程池版缺点
-
阻塞模式下,线程仅能处理一个 socket 连接
-
selector 版设计
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)
调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)