Netty通用api
Netty
为oio
/nio
的传输实现封装了一个通用api
。
方便用户低成本切换。
代码见:
https://github.com/xiaoyue26/netty-in-action-cn/blob/ChineseVersion/chapter4/
使用netty
的话,阻塞和非阻塞实现的切换只需两行:
1 | // oio |
也就是把EvenLoopGroup
和SeverSocketChannel
的实现换一下。
Channel接口
Channel
接口的父接口包括:
Comparable
: 每个Channel是独一无二的,不可以相等,但是可以排序;
AttributeMap: 获得各种属性
依赖的接口:
ChannelPipeLine: 有个方法返回它的pipeline;// 实现上大多有这个成员
ChannelConfig: 有个方法返回它的config;
子接口:
ServerChannel
AbstractChannel: 如果引用不相等,保证当hash值相同时,CompareTo方法会抛出Error。
相关代码:
1 |
|
ChannelPipeLine
中的设计模式: 拦截过滤器.(类似于Unix管道命令)
Netty提供的Channel
实现都是线程安全的,可以支持多个线程并发写一个Channel
。
Netty提供的传输实现
包括:
1 | NIO : 基于选择器 |
NIO传输实现
实现上基于选择器,类似于一个注册表,用户注册各种事件的处理函数。
可能的状态变化包括:
op_accept: 接受新连接并创建channel
时;
op_connect: 建立一个连接时;
op_read: 可以读时;
op_write: 可以写时。
Epoll传输实现
性能比NIO更高。代码更改:
1 | EpollEventLoopGroup |
水平触发LT
只要有事件没消费完就一直提醒。(底层把没处理完的回调重新加入readylist)
边缘触发ET
有新事件才提醒。(底层省略了重新加入readylist那一步)
优缺点对比:
属性 | 水平触发(LT) | 边缘触发(ET) |
---|---|---|
开销 | 较大 | 较小 |
时效性 | 时效性高 | 时效性较低 |
数据安全 | 无遗漏 | 需要小心编程,否则有遗漏风险 |
单线程时: 水平触发时效性好一些;
高并发时: 边缘触发并发度好一些。
jdk实现: 水平触发
netty实现: 边缘触发
OIO传输实现
Netty使用超时机制来让OIO和NIO的API统一。
Local传输实现
用于在同一个JVM中运行的客户端和服务端之间的通信。
服务端并不绑定物理网络地址,也不接受真正的网络流量。
可以一开始先使用Local
传输实现,方便以后有需求的时候迁移到NIO
,Epoll
实现。
Embedded传输实现
用途: 创建单元测试。
传输的用例
Netty4支持的网络协议:
传输实现 | TCP | UDP | SCTP | UDT |
---|---|---|---|---|
NIO | √ | √ | √ | √ |
Epoll | √ | √ | X | X |
OIO | √ | √ | √ | √ |
网络协议备注 | 串流控制传输协议,较冷门,目前主要应用在电信领域 | 基于UDP的可靠传输 |