netty的基本运行原理

netty

BIO的缺陷

  • 一个socket由一个线程处理,大量socket引起创建大量线程。

  • 数据读写是以字节流为单位,效率不高

NIO

  • 线程切换效率:NIO编程模型中,新来一个连接不再创建一个新的线程,而是可以把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由这个线程来负责。一条连接来了之后,现在不创建一个while死循环去监听是否有数据可读了,而是直接把这条连接注册到selector上,然后,通过检查这个selector,就可以批量监测出有数据可读的连接,进而读取数据。
  • IO读写单位:IO模型中,每次都是从操作系统底层一个字节一个字节地读取数据,而NIO维护一个缓冲区,每次可以从这个缓冲区里面读取一块的数据,
Netty的优势:
  • 针对多种传输类型的统一接口 - 阻塞和非阻塞
  • 简单但更强大的线程模型
  • 真正的无连接的数据报套接字支持
  • 链接逻辑支持复用
Netty的构成

Channel 是 NIO 基本的结构。它代表了一个用于连接到实体如硬件设备、文件、网络套接字或程序组件,能够执行一个或多个不同的 I/O 操作(例如读或写)的开放连接。

callback (回调) 是一个简单的方法,提供给另一种方法作为引用,这样后者就可以在某个合适的时间调用前者。这种技术被广泛使用在各种编程的情况下,最常见的方法之一通知给其他人操作已完成。(一些handler)

Future 提供了另外一种通知应用操作已经完成的方式。这个对象作为一个异步操作结果的占位符,它将在将来的某个时候完成并提供结果。JDK 附带接口 java.util.concurrent.Future ,但所提供的实现只允许您手动检查操作是否完成或阻塞了。这是很麻烦的,所以 Netty 提供自己了的实现,ChannelFuture,用于在执行异步操作时使用。

Netty架构模型的组件总览

在这里插入图片描述

客户端连接服务器,是由bossGroup建立连接。建立连接后,客户端往服务器发送数据由workGroup执行pipeline中一系列handler进行业务处理。

BossGroup

主Reactor的线程池,负责处理建立连接

WorkerGroup

从Reactor的线程池,负责处理客户端的其他事件如读、写,调用相应的handler

认识Netty的ChannelHandler 和 ChannelPipeline

ChannelPipeline 就是 ChannelHandler 链的容器。
当 ChannelHandler 被添加到的 ChannelPipeline 它得到一个 ChannelHandlerContext,它代表一个 ChannelHandler 和 ChannelPipeline 之间的“绑定”。它通常是安全保存对此对象的引用,除了当协议中的使用的是不面向连接(例如,UDP)。而该对象可以被用来获得 底层 Channel,它主要是用来写出站数据。

在这里插入图片描述

一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的双向链表,并且每个ChannelHandlerContext中又关联着一个ChannelHandler。入站事件和出站事件在一个双向链表中,入站事件会从链表head往后传递到最后一个入站的handler,出战事件会从链表tail往前传递到最前一个出站的handler,两类型的handler互不干扰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章