2.9 KiB
2.9 KiB
BIO
阻塞式IO的问题
- 性能问题
- 可靠性问题
- 维护性问题
从BIO到NIO
- Reactor模式
- Acceptor 只负责接收请求,具体的处理逻辑,转移给其他线程
- NIO改良:把数据的业务处理逻辑,独立到其他线程中,
Java NIO 核心概念与交互模型
- Server
- Thread
- ==Selector==
- ==Channel==
- ==Buffer==
- ==Channel==
- ==Selector==
- Thread
- 一个线程对应一个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 定时任务线程池
- EventLoop
- 网络通信层
执行网络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
- 超时控制