1. netty是什么?
1. netty是一个基于nio的客户端-服务器框架,使用它可以快速开发网络应用程序。
2. 支持多种协议,如:FTP,SMTP,HTTP等。
3. 很多开源框架都采用netty 比如:dubbo,rocketmq,es,grpc。
2. netty应用场景
1.作用rpc框架都网络通信工具;
2.实现http服务器;
3.实现即时通信系统。
3. netty核心组件
1.channel:netty对网路操作对抽象类
基本i/o操作,bind(),connect(),read(),write()
常用子类:nioServerSocketChannel和nioSocketChannel。
2.eventLoop:事件循环,用于处理连接到生命周期中所发生的事情。
主要作用就是负责监听网络事件并调用事件处理器进行相关i/o操作。
channel作为netty网络操作抽象类;eventloop负责处理注册到其上面的channel的i/o操作。
3.ChannelFuture:作为异步操作的返回值,可以添加监听器监听返回值。
channelFuture的channel()方法可以获取关联的channel。
4.ChannelHandler和ChannelPipeline
chanelHandler是消息的具体处理器;
channelPipeline 装载channelHandler提供入站和出站的api。
5.EventLoopGroup
包含多个eventLoop,常用bossGroup处理客户端连接请求,当客户端处理完请求后,将这个连接交给wokerGroup来处理,然后wokerGroup负责处理IO相关操作。
6.Boosstrap和serverBootStrap
Bootstrap 是客户端引导类
EventLoopGroup group = new NioEventLoopGroup();
try {
//创建客户端启动引导/辅助类:Bootstrap
Bootstrap b = new Bootstrap();
//指定线程模型
b.group(group).
......
// 尝试建立连接
ChannelFuture f = b.connect(host, port).sync();
f.channel().closeFuture().sync();
} finally {
// 优雅关闭相关线程组资源
group.shutdownGracefully();
}
ServerBootstrap服务端引导类
// 1.bossGroup 用于接收连接,workerGroup 用于具体的处理
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
//2.创建服务端启动引导/辅助类:ServerBootstrap
ServerBootstrap b = new ServerBootstrap();
//3.给引导类配置两大线程组,确定了线程模型
b.group(bossGroup, workerGroup).
......
// 6.绑定端口
ChannelFuture f = b.bind(port).sync();
// 等待连接关闭
f.channel().closeFuture().sync();
} finally {
//7.优雅关闭相关线程组资源
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
7.netty线程模型
基于reactor模型的事件驱动,采用多路复用将事件分发给相应的handler处理,非常适合海量io的场景。
单线程模型
多线程模型
主从都线程模型
8.为什么出现粘包和拆包,怎么解决?
主要原因:操作系统在发送TCP数据的时候,底层有一个缓冲区,当发送的数据量太小,TCP就会将多个请求合并成一个请求进行发送,这就造成了粘包;如果发送的数据量太大,TCP就会将其拆分为多次发送,这就是拆包。
解决办法:
1).使用netty自带的解码器
LineBasedFrameDecoder
DelimiterBasedFrameDecoder 自定义分割符解码器
FixedLengthFrameDecoder 固定长度解码器
LengthFieldBasedFrameDecoder
2) .自定义序列化解码器
Serializable
Protobuf
Hessian2
json
9.零拷贝
即所谓的 Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.
参考:netty面试总结