Netty学习记录-入门篇( 二 )


  • 再通过selectionKey反向获取socketChannel,方法channel() 。
  • 可以通过得到的channel,完成业务逻辑 。
  • Netty概述异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠的网络IO程序 。
    Netty学习记录-入门篇

    文章插图
    有了NIO为什么还需要Netty?
    不需要过于关注底层的逻辑 , 对下面的sdk等进行封装,相当于简化和流程化了NIO的开发过程springspringboot的关系差不多 。
    因为 Netty 5出现重大bug,已经被官网废弃了,目前推荐使用的是Netty 4.x的稳定版本 。
    Netty高性能架构设计线程模型基本介绍
    Netty学习记录-入门篇

    文章插图
    传统阻塞 I/O 服务模型
    Netty学习记录-入门篇

    文章插图
    模型特点:
    • 采用阻塞IO模式获取输入的数据
    • 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
    问题分析:
    • 当并发数很大 , 就会创建大量的线程,占用很大系统资源
    • 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费
    Reactor 模式I/O 复用结合线程池,就是 Reactor 模式基本设计思想 。
    Netty学习记录-入门篇

    文章插图
    Reactor在一个单独的线程中运行 , 负责监听和分发事件,分发给适当的处理程序来对IO事件作出反应 。它像公司的电话接线员,接听来自客户的电话并将线路转译到适当的联系人 。
    单 Reactor 单线程
    Netty学习记录-入门篇

    文章插图
    • 优点:模型简单,没有多线程、进程通信、竞争问题,全部都在一个线程中完成 。
    • 缺点:性能问题 , 只有一个线程,无法完全发挥多核CPU性能 。Handler在处理某个连接上的业务时 , 整个进程无法处理其他连接事件,很容易导致性能瓶颈 。
    单 Reactor 多线程
    Netty学习记录-入门篇

    文章插图
    在上一代的问题上进行修改,Reactor主线程只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池的某个线程处理业务 。
    • 优点:充分利用多核CPU的处理能力 。
    • 缺点:多线程数据共享和访问比较复杂,Reactor处理所有的事件监听与响应,在单线程运行,在高并发场景容易出现性能瓶颈 。
    主从 Reactor 多线程针对单 Reactor 多线程模型中 , Reactor 在单线程中运行,高并发场景下容易成为性能瓶颈,可以让 Reactor 在多线程中运行 。
    Netty学习记录-入门篇

    文章插图
    Reactor主线程MainReactor对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件 。当Acceptor处理连接事件后,MainReactor将连接分配给 SubReactor,SubReactor将连接加入到连接队列进行监听,并创建Handler进行各种事件处理 。
    • 优点:父线程与子线程的数据交互简单职责明确 , 父线程只需要接收新连接 , 子线程完成后续的业务处理 , 无需返回数据给主线程
    • 缺点:编程复杂度较高 。
    Reactor模式小结
    1. 单Reactor单线程 , 前台接待员和服务员是同一个人,全程为客户服务 。
    2. 单Reactor多线程,1个前台接待员,多个服务员,接待员只负责接待 。
    3. 主从Reactor多线程,多个前台接待员,多个服务生 。
    Netty 模型
    Netty学习记录-入门篇

    文章插图
    • Netty抽象出两组线程池,BossGroup专门负责接收客户端的连接,WorkerGroup专门负责网络的读写 。
    • 每个worker nioEventLoop处理业务时,会使用pipeline(管道),pipeline中包含了channel,即通过pipeline可以获取到对应通道 , 管道中维护了很多的处理器 。
    异步模型基本介绍