### BIO 阻塞式IO的问题 - 性能问题 - 可靠性问题 - 维护性问题 从BIO到NIO - Reactor模式 - Acceptor 只负责接收请求,具体的处理逻辑,转移给其他线程 - NIO改良:把数据的业务处理逻辑,独立到其他线程中, ## Java NIO 核心概念与交互模型 - Server - Thread - ==Selector== - ==Channel== - ==Buffer== - 一个线程对应一个selector,一个selector对应多个Channel (连接),Selector会根据不同的事件,在不同的Channel上切换,切换到哪个Channel由时间决定 - 每个Channel都会对应一个Buffer,Buffer就是一个内存块,底层是数组 #### Java NIO的问题 - 编程模型复杂,对开发人员不友好 - 功能支持不够,简单的拆包操作都需要手动实现 - 底层基于操作系统的Epoll实现,存在线程空轮询bug - 维护成本高,容易出现开发上的漏洞 ### Netty 的解决方案 | 高效的API | 内置一组辅助类,简化开发难度 | | ---------- | ------------------ | | 多协议支持 | TCP、UDP等 | | 内置编解码 | Java 序列化、ProtoBuf等 | | Listener机制 | 异步操作即成监听回调 | | 管道-过滤器 | 可插拔,高扩展架构 | ## Netty 的逻辑架构 - 服务编排层 负责组装各类服务,是Netty的核心处理链,用以实现网络事件的动态编排和有序传播 - ChannelHandlerContext - ChannelHandler - ChannelPipeline : 数据传输通道 - 事件调度层 通过Reactor模型对各类事件进行聚合处理,通过Selector主循环线程集成各种事件 - EventLoop - 和ChannelPipeline做Read、Write 等I/O操作 - Select 事件循环 - EventLoopGroup - 事件循环线程池 - TaskPool 定时任务线程池 - 网络通信层 执行网络I/O操作,并触发各种网络事件,这些网络事件会分发给事件调度层进行处理 - ServerBootGroup 服务端启动,初始化EventLoopGroup - 把Channel、ServerSocketChannel 等注册到EventLoopGroup中 ## Netty 的功能特性 - 编解码 - MessageToMessageCodec - ByteToMessageCodec - 编码解码器(Codec) - 编码器(Encoder) - 解码器(Decoder) - 粘包,拆包(流式协议,数据没有边界) - 概念 - 粘包:多个数据包在接收到的时候,是一个整体 - 拆包:一个数据包的被分成两个部分被接收到 - 分包解码器 - `FixedLengthFrameDecoder` -- 基于固定长度划分业务包 - `LengthFieldBasedFrameDecorder` -- 使用特定协议划分业务包 - `LineBasedFrameDecorder -- 基于换行符划分业务包 - `DelimiterBasedFrameDecoder` -- 使用自定义分隔符划分业务包 - 多协议 - HTTP - FTP - SSH - TCP - UDP - 自定义协议 - 可靠性 - 超时控制 - 异步连接超时配置 - ChannelConfig - 心跳检测 - 链路空闲状态处理起 - IdelStateHandler - 流量整形 - 可定制的流量整形处理器 - AbstractTrafficShapingHandler