ray-note/后端/极客时间Java实战/Netty/Netty 与 网络通信.md

88 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### BIO
阻塞式IO的问题
- 性能问题
- 可靠性问题
- 维护性问题
从BIO到NIO
- Reactor模式
- Acceptor 只负责接收请求,具体的处理逻辑,转移给其他线程
- NIO改良把数据的业务处理逻辑独立到其他线程中
## Java NIO 核心概念与交互模型
- Server
- Thread
- ==Selector==
- ==Channel==
- ==Buffer==
- 一个线程对应一个selector一个selector对应多个Channel (连接)Selector会根据不同的事件在不同的Channel上切换切换到哪个Channel由时间决定
- 每个Channel都会对应一个BufferBuffer就是一个内存块底层是数组
#### 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