Netty
2021-02-19 22:01:19 1 举报
AI智能生成
Netty学习
作者其他创作
大纲/内容
编解码
粘包拆包
心跳机制
零拷贝
子主题
Netty源码阅读
解释上图:NIOServerSocketChannel建立后会注册到selector上,这个selector是BossGroup上的一个EventLoop线程自己的
客户端有连接过来,selector响应到连接事件,获取到NioSocketChannel
注册到workergroup其中的一个EventLoop的selector
NIO空轮询bug的解决
重新创建个selector,替换调原来的selector,最终关闭之前的selector
IO模型
BIO
缺点:
IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源
如果线程很多,会导致服务器线程太多,压力太大,比如C10K问题
应用场景
BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 但程序简单易理解。
NIO
简介
客户端发送的连接请求都会注册到多路复用器selector上
多路复用器轮询到连接有IO请求就进行处理
应用场景
NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂
三大核心组件
Channel(通道)
Buffer(缓冲区)
Selector(多路复用器)
Redis线程模型
Redis就是典型的基于epoll的NIO线程模型(nginx也是)
epoll实例收集所有事件(连接与读写事件),由一个服务端线程连续处理所有事件命令。
AIO
应用场景
AIO方式适用于连接数目多且连接比较长(重操作)的架构
为什么Netty使用NIO而不是AIO?
在Linux系统上,AIO的底层实现仍使用Epoll,没有很好实现AIO
性能上没有明显的优势,而且被JDK封装了一层不容易深度优化,Linux上AIO还不够成熟。
Netty是异步非阻塞框架,Netty在NIO上做了很多异步的封装。
线程模型
Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写
BossGroup和WorkerGroup类型都是NioEventLoopGroup
Reactor模式编程
Netty实战聊天室系统
0 条评论
下一页