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(缓冲区)
<div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75; font-size: 14px;"><span style="font-weight: bold;">Selector(多路复用器)</span></div><!--5f39ae17-8c62-4a45-bc43-b32064c9388a:W3siYmxvY2tJZCI6IjUyNTAtMTYxMDU4OTQ1NjAyMyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NSwiYmFjay1jb2xvciI6IiIsInBhZGRpbmciOiIifSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiJTIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJsIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJjIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJvIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiIoIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiLlpJoiLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZX19LHsiY2hhciI6Iui3ryIsInN0eWxlcyI6eyJib2xkIjp0cnVlfX0seyJjaGFyIjoi5aSNIiwic3R5bGVzIjp7ImJvbGQiOnRydWV9fSx7ImNoYXIiOiLnlKgiLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZX19LHsiY2hhciI6IuWZqCIsInN0eWxlcyI6eyJib2xkIjp0cnVlfX0seyJjaGFyIjoiKSIsInN0eWxlcyI6eyJib2xkIjp0cnVlfX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX1d-->
Redis线程模型
Redis就是典型的基于epoll的NIO线程模型(nginx也是)
epoll实例收集所有事件(连接与读写事件),由一个服务端线程连续处理所有事件命令。
AIO
应用场景
AIO方式适用于连接数目多且连接比较长(重操作)的架构
为什么Netty使用NIO而不是AIO?
在Linux系统上,AIO的底层实现仍使用Epoll,没有很好实现AIO
性能上没有明显的优势,而且被JDK封装了一层不容易深度优化,Linux上AIO还不够成熟。
Netty是<b>异步非阻塞</b>框架,Netty在NIO上做了很多异步的封装。
线程模型
Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写
BossGroup和WorkerGroup类型都是NioEventLoopGroup
Reactor模式编程
Netty实战聊天室系统
0 条评论
下一页