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