- boy-learning-netty | 06 Netty 怎么
- boy-learning-netty | 11 Netty 的哪
- boy-learning-netty | 02 为什么舍近求远:
- boy-learning-netty | 03 为什么孤注一掷:
- boy-learning-netty | 04 Netty 的前
- boy-learning-netty | 01 认识 Netty
- boy-learning-netty | 05 Netty 的现
- boy-learning-netty | 07 Netty 如何
- boy-learning-netty | 08 Netty 是如
- boy-learning-netty | 09 Netty 对常
相关源码:boy-learning-netty
个人博客:http://bruce.bugmakers.club
内容来自《极客时间 - Netty源码剖析与实战》
Netty 怎么切换三种 I/O 模式
-
什么是经典的三种 I/O 模式
-
Netty 对三种 I/O 模式的支持
-
为什么 Netty 仅支持 NIO 了?
-
为什么 Netty 有多种 NIO 实现?
-
NIO 一定优于 BIO 吗?
-
源码解读 Netty 怎么切换 I/O 模式
什么是经典的三种 I/O 模式
场景
当我们去饭店吃饭时:
-
食堂排队打饭模式:排队在窗口,打好才走
-
点单、等待被叫模式:等待被叫,好了自己去端
-
包厢模式:点单后菜直接被端上桌
类比
-
饭店 -> 服务器
-
饭菜 -> 数据
-
饭菜好了 -> 数据就绪
-
端菜/送菜 -> 数据读取
场景 | I/O 模式 | JDK |
---|---|---|
排队打饭模式 | BIO(阻塞I/O) | jdk1.4之前 |
点单、等待被叫模式 | NIO(非阻塞I/O) | jdk1.4 (2002年,java.nio包) |
包厢模式 | AIO(异步I/O) | jdk1.7 (2011年) |
-
阻塞与非阻塞
-
菜没好,要不要死等 -> 数据就绪前要不要等待?
-
阻塞:没有数据传过来时,读会阻塞知道有数据;缓冲区满时,写操作也会阻塞。非阻塞遇到这些情况都是直接返回。
-
-
同步与异步
-
菜好了,谁端 -> 数据就绪后,数据操作谁完成?
-
数据就绪后,需要自己去读是同步,数据就绪直接读好再回调给程序是异步。
-
Netty 对三种 I/O 模式的支持
-
BIO 曾经支持,现已经不支持了
-
NIO 都支持,且有多种实现:通用的实现,linux上的实现,macOs上的实现
-
AIO 曾经支持,现已移除
为什么 Netty 仅支持 NIO 了?
-
为什么不建议阻塞I/O (BIO 或 OIO)?
连接数高的情况下,阻塞 -> 耗资源、效率低
-
为什么删除已经做好的 AIO 支持?
-
Windows 实现成熟,但是windows系统很好用来做服务器
-
Linux 常用来做服务器,但是 AIO 实现不够成熟
-
Linux 下 AIO 相比较 NIO 性能提升不明显
-
为什么 Netty 有多种 NIO 实现?
通用的 NIO 实现在 Linux 下也是使用 epoll,为什么自己单独实现?
实现得更好!
-
Netty 暴露了更多的可控参数,例如:
-
JDK 的 NIO 默认现实是水平触发
-
Netty 是边缘触发(默认)和水平触发可切换
-
-
Netty 实现的垃圾回收更少、性能更好
NIO 一定优于 BIO 吗?
-
BIO 实现的代码简单
-
特定场景:连接数少,并发度低,BIO 性能不输 NIO
源码解读 Netty 怎么切换 I/O 模式
-
怎么切换
修改
EventLoopGroup —— 开发模式
SocketChannel —— I/O 模式
-
原理是什么
泛型+反射+工厂 实现 I/O 模式的切换
-
为什么服务器开发并不需要切换客户端对应 Socket
Reactor 模式,死循环监听处理事件
网友评论