zoukankan      html  css  js  c++  java
  • Netty

    Netty简介

    BossGroup和WatchGroup协同工作

    Netty是JBoss提供的一个java开源框架
    Netty是一个异步的,基于事件驱动的网络应用框架
    BIO:每个客户端连接到服务端都会新增一个线程处理,会出现性能问题,会阻塞

    NIO

    同步非阻塞,服务器实现模式为一个线程处理多个请求
    客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有io请求则进行处理

    NIO和BIO比较


    缓冲区Buffer


    flip操作:切换buffer的读写状态,其实是将position重置为0


    通道

    通道可以同时进行读写,而流只能读或者写
    通道可以实现异步读写数据
    常用的有:FileChannel(文件读写),DatagramChannel(UDP读写),ServerSocketChannel和SocketChannel


    Selector(选择器)

    selector能够检测多个注册的通道上是否有事件发生
    如果有事件发生,便获取事件然后针对每个事件进行相应的处理
    这样可以用一个单线程去管理多个通道,也就是管理多个连接和请求




    通过selectkey可以反向获取到channel

    selectionKey

    零拷贝

    常用的零拷贝有mmap和sendFile
    传统io的read方法:
    1.先使用DMA将数据从硬盘读取到内核中,(DMA拷贝就是不通过cpu的直接内存拷贝)然后用cpu将数据从内核态缓冲区读取到用户态的缓冲区中
    2.在用户态缓冲区中对数据进行修改
    3.用cpu将用户态缓冲区数据拷贝到socket的缓冲区
    4.将socket缓冲区的数据用DMZ拷贝到协议栈

    传统io是进行4次拷贝,3次状态切换
    优化方法:
    mmap:少了一次拷贝
    通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据,这样,在进行网络传输时,减少从内核空间到用户空间的拷贝次数

    sendFile:
    Linux2.1提供了sendFile函数,原理:数据根本不经过用户态,直接从内核缓冲区进入到socketbuffer,同时,由于和用户态完全无关,就减少了一次上下文切换

    0拷贝不是不拷贝,而是没有cpu拷贝的意思,从硬盘出来的DMA拷贝是一定要存在的
    Linux2.4做了一写修改,避免从内核缓冲区拷贝到socketbuffer操作,直接拷贝到协议栈
    又少了一次数据的拷贝

    mmap和sendfile的区别:

    Netty架构设计

    目前存在的线程模型:
    1.传统阻塞I/O服务模型

    采用阻塞io模式获取输入的数据
    每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
    2.Reactor模式


    Reactor一共有3中实现
    Reactor模式,通过一个或多个输入同时传递给服务处理器的模式,基于事件驱动
    服务端程序处理传入的多个请求,并将它们同步分派到相应的处理线程

    1)单Reactor单线程

    2)单Reactor多线程


    3)主从Reactor多线程

    Netty线程模式是基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor


    Netty模型

    简单版


    复杂版


    任务队列taskQueue




    异步模型



    Netty核心组件

    Bootstrap,ServerBootStrap

    Future,ChannelFuture

    Channel


    selector

    ChannelHandler

    Pipeline和ChannelPipeline


    ChannelHandlerContext


    Unpooled

  • 相关阅读:
    数据结构与算法之美-二分查找(下)
    数据结构与算法之美-二分查找(上)
    数据结构与算法之美-排序优化
    数据结构与算法之美-线性排序
    DRF框架之路由Routers
    DRF框架之视图集(ModelViewSet)简介
    DRF框架之视图子类简介
    DRF框架之视图的扩展类简介
    DRF框架之视图基类APIView和GenericAPIView简介
    DRF框架之ModelSerializer序列化器
  • 原文地址:https://www.cnblogs.com/Baronboy/p/14468132.html
Copyright © 2011-2022 走看看