Netty 从入门到入土(一)

Netty 初识

  • 本质:网络应用程序框架

  • 实现:异步,事件驱动

  • 异步:高性能,可维护,快速开发

  • 特性:开发服务器和客户端

  • 架构
    Netty 从入门到入土(一)

    • Core
      • 零复制功能丰富的 Byte Buffer
      • 通用的通信层API
      • 可扩展的事件模型
    • Transport Services (支持的传输层)
    • Protocol Support (支持协议,不属于同一层协议)
  • Netty 与 Java NIO 对比

    • Netty做的更多
      • 支持常用应用层协议
      • 解决传输问题:粘包,半包现象
      • 支持流量整形
      • 完善的断连,Idle等异常处理
    • Netty做的更好
      • 规避JDK NIO bug
        • 经典epoll bug: 异常唤醒空转导致CPU 100%
        • 解决办法:设置阈值,重新rebuild 多路复用器
        • IP_TOS参数(IP包的优先级和QoS选项)使用时抛出异常
        • java.lang.AssertionError:Option not found
        • 解决办法:不支持
      • API 更友好更强大
        • 例如:ByteBuffer -> Netty 's ByteBuff
        • Threadlocal -> Netty 's FastThreadlocal
      • 隔离变化,屏蔽细节
        • 隔离JDK NIO 的实现变化: nio -> nio2(aio) -> …
        • 隔离JDK NIO 的实现细节
  • 其他产品

    • Apache Mina
    • Sun Grizzly
    • Apple SwfitNIO ACE等 其他语言不考虑
    • Cindy 生命周期不长
    • Tomcat , Jetty 还没有独立出来
  • Netty支持的协议

    • dns
    • haproxy
    • http
    • http2
    • memcache
    • matt
    • redis
    • smtp
    • socks
    • stomp
    • xml

Netty 入门

经典的三种IO模式

  • BIO 阻塞I/O
  • NIO 非阻塞I/0
  • AIO 异步I/O

概念

  • 阻塞与非阻塞
  • 同步与异步

Netty 对 以上模式支持

Netty 从入门到入土(一)

  • BIO

    • Thread-Per-Connection
      Netty 从入门到入土(一)
  • NIO

    • Reactor
      Netty 从入门到入土(一)

    • Netty 从入门到入土(一)

  • AIO

    • Proactor

    Netty 从入门到入土(一)

  • 为什么仅支持NIO

    • BIO 连接数高的情况:阻塞 -> 耗资源,效率低
  • 问什么删除已实现的AIO

    • Windows下成熟,但在服务器环境下很少使用
    • Linux常用来作服务器,但AIO实现不够成熟
    • Linux下AIO与NIO相比性能提升差别不大
  • 为什么有三种实现方式

    • 实现更好
      • Netty暴露了更多的可控参数,例如
        • JDK的NIO默认实现是水平触发
        • Netty是边缘触发(默认)和水平触发可切换
      • Netty实现的垃圾回收更少,性能更好
  • NIO 一定由于BIO吗?

    • BIO代码简单
    • 特定场景:连接数少,并发度低,BIO性能不输NIO

Netty 三种模式的切换

  • 所有I/O模式的类名都是统一风格的
  • 开发模式
    • NioEventLoopGroup
      • 死循环监听处理事件
    • OioEventLoopGroup
      • 反射工厂
    • OioServerSocketChannel
      • 创建出来的是socketchannel
  • 范型+反射+工厂实现I/O模式切换
    • channel : I/O模式

Netty 如何支持三种Reactor

  • 什么是Reactor 三种版本

    • 一个人包揽所有 -> Reactor 单线程
    • 多招几个伙计 -> Reactor 多线程模式
    • 进一步分工 -> 主从Reactor多线程模式