概述
- Netty封装了JDK的NIO,让你用的更丝滑更爽:
- 简化开发代码
- fixed bug,优化了细节
- 提供工具类:拆包、心跳包等
- 轻松切换BIO、NIO
- 自带两个线程池高性能
- 被众多RPC广泛使用:Dubbo、RocketMQ
Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。
为什么用Netty?
- BIO 不适合多线程,服务端多线程阻塞:1.线程资源占用厉害 2. 线程切换CPU开销大
- NIO 编程复杂
- Netty服务端开发过程:创建引导类,设置2个线程池,设置IO模型,绑定监听事件,绑定端口启动
public class NettyServer {
public static void main(String[] args) {
ServerBootstrap serverBootstrap = new ServerBootstrap();
NioEventLoopGroup boosGroup = new NioEventLoopGroup();
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
serverBootstrap
.group(boosGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<NioSocketChannel>() {
protected void initChannel(NioSocketChannel ch) {
}
});
serverBootstrap.bind(8000);
}
}
- Netty的Reactor模型:
- bossGroup接受新连接线程,主要负责创建新连接
- workerGroup,负责读取数据的线程,主要用于读取数据以及业务逻辑处理
- workerGroup里面的NioEventLoop有一个无限循环:监听事件、处理事件、处理队列消息
- 核心原理:
- 每个Client和Server连接的时候,会被丢到boss线程,boss线程的NioEventLoop负责监听Accept行为,Accept成功,就会生成一个客户端的Channel
- 把Channel Assign给workGroup里面的一个NioEventLoop,来负责这个Channel的所有的读写监听和响应
最终的模型:多个client连接上NettyServer之后,都有boss线程会获取到1个channel,channel被分给不同的NioEventLoop,每个Loop都是一个独立的线程,类似于Selector会自旋遍历所有的channel的事件。
相当于传统NIO中,一个Selector包办所有的Accept()、read、write、close等操作。现在分给N个Selector来处理,bossGroup只负责连接,N个workGroup的Selector负责各自分配channel的读写监听和处理。
- 拆包和粘包:
- 在即时性要求不高的业务场景下,降低TCP的交互次数,把多个小的消息,粘成一个大的消息,从而节省带宽
- 传递的消息超过最大数据包的限度时,必须要拆分为几个子包,才能保证数据的完整性,所以必须拆包
- 粘包、半包、拆包的解决方案
- 在报文末尾增加换行符表明一条完整的消息,这样在接收端可以根据这个换行符来判断消息是否完整。(有时候文本中有换行符,则该方法无效)
- 将消息分为消息头、消息体。可以在消息头中声明消息的长度,根据这个长度来获取报文(比如 808 协议)(编程复杂,但是避免空间浪费)
- 规定好报文长度,不足的空位补齐,取的时候按照长度截取即可。(可能浪费空间,但是编程简单)
- 工具类
- LineBasedFrameDecoder,换行符拆包,写消息的时候,末尾添加 \n即可
- LengthFieldBasedFrameDecoder 基于包长度的拆包类
Netty特性VS NIO原生
- Netty不仅支持NIO,还直播BIO:一个Client从workGroup里分配一个专门的线程阻塞式的读取消息,如果线程组用完了,新的连接就会进入排队。
- 封装更多的通用功能,比如字符串拆包,心跳检测功能,字符串的编码和解码
- 解决了NIO中JDK的一些bug,比如selector自旋的时候CPU飙升的bug
- 封装了NIO很多的细节,比如引入workGroup和bossGroup线程组,可根据实际业务场景配置工作线程个数,而NIO要自己去实现
- Netty是异步非阻塞的模式,支持ChannelFuture查看IO事件的执行情况,并且事件完成执行相应的回调方法
参考博客
闪电侠大佬博客,业界良心
https://www.jianshu.com/nb/26583432
粘包拆包 闪电侠
https://www.jianshu.com/p/dc26e944da95
非常好的一个系列,有入门、有源码分析、有实战
https://blog.csdn.net/column/details/enjoynetty.html