Netty基础(上)

503 阅读3分钟

应用场景:

​ 大数据基础设施:提高数据传输性能

​ 游戏行业:游戏交互服务器

java中的三种网络IO模型:BIO,NIO,AIO

  1. BIO(blocked IO):

    特征:1. 同步,阻塞IO
    2.一个线程一个连接
    3.面向流(只能顺序读取)
    问题:线程利用率低
  2. NIO(Non-blocking IO,new IO)

    特征:1.同步,非阻塞IO,
    2.一个线程,多个连接。Netty就是基于NIO的,多个客户端请求都会被注册到多路复用器(selector)上,轮询这些连接是否有IO活动,降低了线程需求量,提高了线程的利用率。
    3.面向缓冲区编程,读取时候,游标可在缓冲区前后移动。
  3. AIO 异步非阻塞

    • Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑;
    • Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑
    • reactor:能收了你跟俺说一声。
    • proactor: 你给我收十个字节,收好了跟俺说一声。

    阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,则调用 read/write 过程的线程会一直等待,这个过程叫做阻塞式读写。

    非阻塞:如果线程调用 read/write 过程,但 read/write 过程没有就绪或没有完成,调用 read/write 过程的线程并不会一直等待,而是去处理其他工作,等到 read/write 过程就绪或完成后再回来处理,这个过程叫做阻塞式读写。

    异步:read/write 过程托管给操作系统来完成,完成后操作系统会通知(通过回调或者事件)应用网络 IO 程序(其中的线程)来进行后续的处理。

    同步:read/write 过程由网络 IO 程序(其中的线程)来完成。

  4. 详解NIO

3万字加50张图,带你深度解析 Netty 架构与原理(上)

Channel.class 是顶层接口

  • 是双向通道,可读可写
  • 常见子类
    • FileChannel:用于文件读写
    • DatagramChannel:用于 UDP 数据包收发
    • ServerSocketChannel:用于服务端 TCP 数据包收发
    • SocketChannel:用于客户端 TCP 数据包收发
  1. selector(选择器)
  • 实现IO多路复用,多个channel注册到某个selector上,事件驱动后,调用线程处理事件

  • 在上文的使用 Java NIO 编写的服务端示例代码中,服务端的工作流程为:

    1)当客户端发起连接时,会通过 ServerSocketChannel 创建对应的 SocketChannel。

    2)调用 SocketChannel 的注册方法将 SocketChannel 注册到 Selector 上,注册方法返回一个 SelectionKey,该 SelectionKey 会被放入 Selector 内部的 SelectionKey 集合中。该 SelectionKey 和 Selector 关联(即通过 SelectionKey 可以找到对应的 Selector),也和 SocketChannel 关联(即通过 SelectionKey 可以找到对应的 SocketChannel)。

    4)Selector 会调用 select()/select(timeout)/selectNow()方法对内部的 SelectionKey 集合关联的 SocketChannel 集合进行监听,找到有事件发生的 SocketChannel 对应的 SelectionKey。

    5)通过 SelectionKey 找到有事件发生的 SocketChannel,完成数据处理。

6.零拷贝(内核缓冲区直接拷贝到soket缓冲区)

省去了内核态和用户态的转变

零”指的是内存中数据拷贝的次数为 0。

3万字加50张图,带你深度解析 Netty 架构与原理(上)

转载来源: 作者:烂猪皮 链接:juejin.cn/post/691948… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。