88 lines
2.9 KiB
Markdown
88 lines
2.9 KiB
Markdown
### 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
|