基本介绍

Netty核心功能与线程模型理解-LMLPHP

  • 5.x版本开发完但不太好用,已基本废弃,推荐学习4.x,JDK6+即可
  • NIO类库复杂,使用麻烦,学习难度高,开发工作量高大(例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等)
  • Netty对NIO进行了良好的封装,拥有高性能、低延迟,资源消耗小等特性
  • 基于netty的中间件有非常多,熟知的如Dubbo、Rocketmq、zk、es等等
  • 以及一些手游和网游和大数据领域

使用

  • 依赖
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.35.Final</version>
</dependency>
  • 创建boss与worker线程组
  • 创建服务器启动对象,配置相关参数
  • 编写自定义处理器,用于处理客户端发送过来的数据
  • 创建通道对象
  • 绑定端口,启动服务
  • 编写客户端测试
  • boss线程池,负责客户端连接事件处理
  • worker线程池,负责读写事件的处理
  • 属于典型的主从模型

Netty核心功能与线程模型理解-LMLPHP

  • 主从可支持:一主一从,一主多从和多主多从

Netty线程模型

Netty核心功能与线程模型理解-LMLPHP

  • BossGroup与WorkerGroup本质就是两组线程池,分别负责接收客户端的连接和处理网络读写
  • BossGroup和WorkerGroup类型都是NioEventLoopGroup
  • NioEventLoopGroup 相当于一个事件循环线程组, 这个组中含有多个事件循环线程 , 每一个事件循环线程是NioEventLoop

关键组件

  • Bootstrap:客户端引导类、ServerBootstrap:服务端启动引导类
  • Future、ChannelFuture:异步的事件监听
  • Channel:网络通信的组件,能够用于执行网络 I/O 操作
  • Selector: I/O 多路复用, Selector 一个线程可以监听多个连接的 Channel 事件
  • NioEventLoop:线程和任务队列,支持异步提交执行任务
  • NioEventLoopGroup:管理 eventLoop 的生命周期,可以理解为一个线程池,内部维护了一组线程
  • ChannelHandler:处理 I/O 事件或拦截 I/O 操作
  • ChannelHandlerContext:保存 Channel 相关的所有上下文信息
  • ChannelPipline:处理或拦截 Channel 的入站事件和出站操作

ByteBuf了解

Netty核心功能与线程模型理解-LMLPHP

  • 提供了两个索引,一个用于读取数据,一个用于写入数据

  • 两个索引通过在字节数组中移动,来定位需要读或者写信息的位置

  • 极限的情况是 readerIndex 刚好读到了 writerIndex 写入的地方,若超出,则抛出异常

  • 绿色为已读区域

  • 红色为可读区域

  • 蓝色为可写区域

使用Netty动手实战下聊天室

  • 代码:略
06-18 20:11