Netty

作者: 奋斗的韭菜汪 | 来源:发表于2022-07-24 16:47 被阅读0次

    what is netty & what can netty do

    【From official website】Netty is a NIO client server \color{red}{framework} which enables quick and easy development of network applications such as protocol servers and clients

    一、Netty与NIO的关系

    I : Input(向内存中写入数据)
    O : Output(从内存中读数据)
    是用来描述计算机中的信息交换,Input和Output是相对于我们计算机的内存而言的

    IO分为\color{red}{本地IO}\color{red}{网络IO}
    1. Java中对应的api(本地IO)
      Java中对本地io的操作是基于File对象的,一般需要先新建File对象
      字节流:InputStream/OutputStream
      缓冲流:Reader/Writer
    2. Java中对应的api(网络IO)
      TCP:ServerSocket/Socket
      UDP:DatagramPacket/DatagramSocket
    本地IO与网络IO的区别

    本地IO指:单挑机器上,冲A文件夹到B文件夹,或者从内存到磁盘,磁盘到内存等的过程
    网络IO指:在网络上的两台机器,通过ip地址和端口互通互联,然后通过网络协议进行交换(应用层:http、https、ftp),TCP和UDP是底层协议,大部分应用层协议都是基于tcp和udp来通信的

    IO的演变历史
    IO的演变历史

    BIO指 BlockIO
    NIO指NewIO或NonBlockIO
    AIO指异步IO

    二、Netty能做什么

    定义:Netty是高性能的网络通信底层框架(很少作为应用层开发,更多作为底层框架)

    netty的性能是传统io(bio)性能的8倍,

    传统io(bio)存在的问题:
    1. 阻塞IO不具备弹性伸缩能力,高并发导致宕机。
    2. Java序列化编码、解码的性能问题
    3. 传统IO线程模型过多占用CPU资源。

    IO性能主要影响的面:

    netty在当前通信领域是无所不能,当前的网络通信基本都是基于tcp或udp的,而netty正是对tcp和udp的封装。


    netty.png
    image.png

    Netty操作的基本流程

    Netty操作的基本流程

    Netty中的Channel简介

    image.png

    BossGroup和workerGroup工作原理


    image.png
    netty是如何解决JDK空轮训Bug的?

    代码详见:NioEventLoop.java -> select方法

    1. 创建一个新的Selector
    2. 将原来的Selector中注册的事件全部取消
    3. 将可用事件重新注册到新的Selector中,并激活。
    Reactor线程模型
    1. 单线程模型
    2. 多线程模型
    3. 主从线程模型


      image.png
    EventLoopGroup与Reactor是如何关联的?

    在netty中
    当设置BossLoopGroup线程数为1,WorkerLoopGroup为大于1,如128,即表示Reactor线程模型中的多线程模型(及多路复用模型)
    当设置BossLoopGroup线程数为大于1,如128,WorkerLoopGroup为大于1,如128,即表示Reactor线程模型中的主从线程模型

    channel与channelpipeline关系
    channel与channelpipeline关系
    pipeline中InBoundHandler与OutBoundHandler传播顺序

    先执行InBoundHander,再执行OutBoundHandler; InBoundHandler顺序输出,OutBoundHandler逆向输出

    ...
          ch.pipeline().addLast(new OutboundHandlerC());
          ch.pipeline().addLast(new InboundHandlerB());
          ch.pipeline().addLast(new OutboundHandlerB());
          ch.pipeline().addLast(new InboundHandlerA());
          ch.pipeline().addLast(new OutboundHandlerA());
          ch.pipeline().addLast(new InboundHandlerC());
    ...
    

    输出结果B -> A -> C; A -> B -> C

    reference:

    1. netty官网

    相关文章

      网友评论

          本文标题:Netty

          本文链接:https://www.haomeiwen.com/subject/bymgirtx.html