概念
- 基于TCP、异步、事件驱动的网络框架;
- TCP/IP --> 原生JDK(Java的IO和网络编程) --> NIO --> Netty;
应用场景
- Netty是异步高性能的通信框架,往往被RPC框架使用;
- 阿里云分布式框架Dubbo;
- 游戏;
- 地图框架
- AVRO(RPC),使用Netty Service进行二次封装;
- Akka;
- Flink;
- Spark;
书籍
- 『Netty in Action』实战
- 『Netty权威指南』,知识点多,但其基于Netty5,目前已经过时不在维护;
I/O模型
- I/O模型决定性能
- Java BIO,同步阻塞,造成线程浪费或连接浪费;
- Java NIO,同步非阻塞,一个线程处理多个连接(维护一个Selector),并把连接注册到一个选择器中,多路复用模型,事件驱动;后期连接多了就不止一个线程而是多个线程以及多个Selector(BOSS);
- Java AIO(NIO2.0),引入异步通道,采用了Proactor模式,目前还没有广泛应用,JDK1.7引入,有效的请求才启动线程,特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用;
场景辨析
BIO
连接数较少,且架构较固定,对服务器资源要求较高,并发局限于应用,JDK 1.4以前的唯一选择;
NIO
连接数目较多连接较短的操作,比如聊天服务器、弹幕系统、服务器之间的通讯,JDK 1.4之后支持;
AIO
连接数目较多且连接较长(重操作)的架构,比如相册服务器,调用OS参与并发操作,JDK 7之后支持;
『Netty基于NIO』
BIO详解
传统的BIO可以通过线程池进行改善,实现多个客户连接服务器。
流程
- 启动ServerSocket
- 建立一个线程与每个连接进行通讯
- 客户发出请求后咨询服务器线程是否有响应,没有会等待或者判断被拒绝
- 如果有响应,客户端会等待请求结束后继续执行(阻塞)
NIO详解
同步非阻塞,JDK1.4之后,Channel、Buffer、Selector三个核心组件。面向缓冲区、或者面向块编程的,增加了处理的灵活性。