基本介绍
- 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线程模型
- 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了解
-
提供了两个索引,一个用于读取数据,一个用于写入数据
-
两个索引通过在字节数组中移动,来定位需要读或者写信息的位置
-
极限的情况是 readerIndex 刚好读到了 writerIndex 写入的地方,若超出,则抛出异常
-
绿色为已读区域
-
红色为可读区域
-
蓝色为可写区域
使用Netty动手实战下聊天室
- 代码:略