netty权威指南
2017-01-05 17:35:10 0 举报
AI智能生成
Netty权威指南
作者其他创作
大纲/内容
IO入门
linux网络IO模型
阻塞IO模型:调用recvfrom,直到数据准备好,并从内核空间拷贝到用户空间才返回
非阻塞IO模型:调用recvfrom,没有数据返回EWOULDBLOCK错误
IO复用模型:select/poll 或者 epoll
信号驱动IO模型:调用sigaction,数据准备就绪,生成一个信号,由信号通知用户程序执行recvfrom
异步IO模型:通知内核启动某个操作,并在内核完成整个操作后(数据拷贝到用户空间),通知应用程序
IO多路复用技术
通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下,可以处理多个客户端请求
NIO入门
Buffer
NIO中所有的数据都是用Buffer处理的,提供了对数据的结构化访问以及维护读写位置等信息。可对比数组和Stream
Channel
Channel是一个通道,可通过它读取和写入数据,与流的不同之处在于通道是双向的
Selector
Selector会轮询注册在其上的Channel,当发现某个或多个Channel处于就绪状态后,从阻塞状态返回就绪的Channel的选择键集合,进行IO操作
私有协议栈
协议设计
分成Header/Body,Header包括版本、消息长度、节点唯一id、消息类型、消息优先级、附加数据
链路建立
调用方建立连接,连接建立后通过握手来认证客户端
链路关闭
对方宕机或重启
消息读写过程中发生IO异常
心跳超时
可靠性设计
Ping-Pong心跳机制:N次未响应之后,客户端主动关闭连接
重连机制:等待T时间之后在重连,保证服务器有时间释放句柄资源
重复登录保护:已经登录客户端不能再次登录
消息缓存重发:链路中断后消息进入缓存队列,队列达到上限后,拒绝添加新消息
netty源码
ByteBuf
ByteBuf维护了两个指针readerIndex和writerIndex,随着数据的写入writerIndex会增加,随着数据的读取readerIndex会增加,不再需要flip()操作
自动扩容,采用先倍增后步进的方式,,保证拷贝效率的同时尽可能减少内存浪费。每个客户端都要维护自己独立的接收和发送缓冲区,浪费的内存会随着用户的增加而成比例增加
Channel&Unsafe
聚合了网络IO读写,发起和关闭链接等功能
ChannelPipeline&ChannelHandler
责任链
EventLoop&EventLoopGroup
同时负责IO读写,系统任务,定时任务
Future&Promise
代表异步操作的结果,可以添加监听器,在对象上等待
netty架构
高性能
采用异步非阻塞的IO类库,基于Reactor模式实现
TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制
通过内存池的方式循环利用ByteBuf
可配置IO线程数,TCP参数等
采用环形数组缓冲区实现无锁并发编程
关键资源的处理使用单线程串行化的方式
通过引用计数器及时地释放不再被引用的对象
可靠性
链路有效性检测
内存保护机制,ByteBuf引用计数,ByteBuf内存池,内存容量上限
优雅停机,等待超时时间T之后还没有停机,则 kill -9 pid 强杀当前进程
可定制
责任链模式
基于接口开发
提供了大量工厂类
提供了大量系统参数可按需设置
可扩展
应用层协议定制,HTTP,FTP
0 条评论
下一页