高效网络(NIO)客户端/服务器(C/S)框架

核心组件

  • NIO
    • NIO的类库和API还是有点复杂,比如Buffer的使用
    • Selector编写复杂,如果对某个事件注册后,业务代码过于耦合
    • 需要了解很多多线程的知识,熟悉网络编程
    • 面对断连重连、保丢失、粘包等,处理复杂
    • NIO存在BUG,根据网上言论说是selector空轮训导致CPU飙升,具体有兴趣的可以看看JDK的官网
  • Bootstrap:netty的组件容器,用于把其他各个部分连接起来;如果是TCP的Server端,则为ServerBootstrap.
  • Channel:代表一个Socket的连接
  • EventLoopGroup:一个Group包含多个EventLoop,可以理解为线程池
  • EventLoop:处理具体的Channel,一个EventLoop可以处理多个Channel
  • ChannelPipeline:每个Channel绑定一个pipeline,在上面注册处理逻辑handler
  • Handler:具体的对消息或连接的处理,有两种类型,Inbound和Outbound。分别代表消息接收的处理和消息发送的处理。
  • ChannelFuture:注解回调方法

    运行过程/执行链路

  • 初始化Channel

  • 注册Channel到Selector 任务队列
  • 轮询Accept事件,处理建立channel的链接
  • 注册Channel到Selector接收方
  • 轮询写事件,开线程去处理,任务队列

Netty - 图1

线程模型

线程组

  • boss:监听端口所有准备就绪的时间
  • work:监听准备工作

    TCP粘包拆包

    零拷贝

    首先零拷贝不是不要拷贝,而是减少拷贝次数;linux内核经过几个版本给我们带来了mmap,低级sendfile和高级sendfile的优化,netty使用jdk的filechannel享受到了这些优化;在java层面netty通过slicedByteBuf和compositeByteBuf减少了语言层面的字节数组拷贝;
    Netty - 图2