本文主要对Java中的常用高性能通信组件Netty进行了总结和简要介绍。

Java Netty

1. 原理

1.1. 为什么传输快?

  • 使用零拷贝技术
    减少用户态和内核态的切换
    减少copy的动作,应用可以直接操作磁盘或者内存

1.2. 为什么并发高?
使用NIO
IO多路复用

1.3. 为什么封装好?
责任链模式
事件驱动

1.4. 如何解决沾包?
1.4.1. 四种解决方法

  • LineBasedFrameDecoder
    用换行符做消息标记
  • DelimiterBasedFrameDecoder
    指定消息的结束符
  • FixedLengthFrameDecoder
    定长消息
  • LengthFieldBasedFrameDecoder
    定义长度字段

1.4.2. 产生原因
应用程序的字节大小大于Socket缓冲区大小,拆包,小于缓冲区大小,沾包
以太网payload > MTC(1500字节)

1.5. 如何处理epoll空转造成的CPU飙高?
统计Seletor每秒处理的select时间数量,超过限定值则重新注册Selector

2. 组件

2.1. Channel
Socket连接

2.2. EventLoop
一个Channel在一个生命周期内只注册一个EventLoop
EventLoop在生命周期内只和一个Thread绑定
一个EventLoop可能会注册多个Channel

2.3. EventLoopGroup
包含多个EventLoop
使用线程池

2.4. ChannelFuture
Channel的操作结果

2.5. ChannelHandler
数据处理类

2.6. ChannelPipeline
数据处理流水线

2.7. ByteToMessageDecoder
解码类

2.8. MessageToByteEncoder
编码类

2.9. ByteBuf
字节容器

Contents
  1. 1. 1. 原理
  2. 2. 2. 组件