Dev Guide / Java开发技术guide / 中间件
content/dev-guide/a-Java开发技术guide/04-中间件/9-netty.md
- 基于java nio的异步事件驱动网络框架,异步事件驱动的网络通信底座,屏蔽底层 I/O 差异(对原生java nio进行封装,屏蔽了selector空轮询bug,bytebuffer复杂的flip操作、黏包拆包处理等底层复杂性,提供统一的api),提供统一的连接管理、数据收发、线程调度能力(解决高并发、低延迟、高可靠网络的底层基础设施)。
- netty基于reactor模式,通过事件驱动和IO多路复用实现高并发处理。
- reactor模式
- 单reactor单线程:一个nio线程同时处理连接建立、IO读写和业务逻辑(实现简单但无法利用多核cpu,单个Handler阻塞会影响所有的连接)
、单reactor多线程:一个nio负责建立连接,IO读写和业务逻辑交给线程池处理(可利用多核,但单个Acceptor在高并发时可能成为瓶颈)
、主从reactor多线程:MainReactor负责accept连接,subReactor负责IO读写和pipline处理(各Reactor独立线程池,天然支持海量连接和高并发,netty的默认模型)
- 主从reactor的工作流程:BossGroup(MainReactor,接收客户端连接后将socketChannel注册到WorkerGroup中的某一个Worker EventLoop上,然后回到selector继续等待新连接)、WorkerGroup(subReactor,包含cpu数*2的eventloop,每个eventloop绑定多个客户端channel,负责监听客户端的读写事件,驱动channelPipeline中各个Handler的执行)、无锁化设计(channel从创建到销毁,所有io操作都绑定在同一个evenloop线程中执行)
- 核心组件
- channel:代表一个网络连接(socket连接或服务监听端口)
- eventloop:线程模型的核心执行单元,一个eventloop驱动一个selector,绑定一个thread,在其生命周期内持续轮询IO事件
- channelPipeline:ChannelHandler的有序容器,采用双向链表结构,由ChannelHandlerContext将各个Handler串联起来。所有IO时间都在pipeline中按Handler顺序传播处理
- channelHandler:对IO时间或数据进行业务处理的组件
- byteBuf:netty对Java NIO的ByteBuffer的替代品,采用指针读写分离设计,无需flip切换模式,支持动态扩容和池化复用。
- Bootstrap: 引导启动类,Bootstrap用于客户端(单个channel模式),ServerBootstrap用于服务端
- pipeline的时间转播方向:事件在pipeline中按照Inbound事件(入站)和Outbound事件(出站)规则传播
- ByteBuf的内存管理策略:分配方式(Pooled,从内存池分配,复用ByteBuf,减少GC压力)、Unpooled(非池化,每次都创建新的实例)、内存位置(Direct堆外,直接操作堆外内存,IO是减少一次内存拷贝)、Heap(堆内,由JVM托管,分配回收快速)
- TCP黏包/拆包:
- 黏包与拆包:tcp协议本身的特性,应用层调用write发送的数据,可能被tcp拆分成多个数据包发送(拆包),也可能将多个数据包合并为一个数据包发送(黏包)。
- 原因:发送端(Nagle算法合并小数据已提高网络利用率)、网络层(MTU,即最大传输单元限制,可能导致IP层堆数据包进行分片)、接收端(应用层读取速度跟不上网络接收速度,导致多个数据包堆积在内核接收缓冲区中)
- netty内置的拆包解码器:FixedLengthFrameDecoder、DelimiterBasedFrameDecoder、LineBasedFrameDecoder、LengthFieldBasedFrameDecoder(生产环境中最常用的拆包方案)
- 通信可靠性保障:
- 心跳与连接探活
- 客户端断线重连
- 高水位写保护
- 优雅关闭
- epoll空轮询
- channelOption参数配置:SO_BACKLOG、SO_KEEPALIVE、TCP_NODELAY、SO_REUSEADDR、SO_RCVBUF、SO_LINGER、CONNECT_TIMEOUT_MILLIS、ALLOCATOR
- 设计模式与最佳实践:责任链模式、观察者模式、策略模式、工厂模式
- 应用场景:rpc康佳、消息中间件、API网关(spring cloud gateway默认基于netty+webflux)、即时通讯(websocket+nett的长连接管理、消息推送、群组广播)、IoT/游戏(私有协议推送、实时对战、设备接入)、代理与隧道、分布式协调(Zookeeper,服务端与客户端之间的通信协议基于Netty实现)、HTTP服务