Netty面试题大全
目录
文档索引
面试题汇总
Q:Netty是什么?为什么需要Netty?
Q:Netty为什么性能高?
Q:Netty有哪些组件?
Q:Netty如何解决半包读写问题?
Q:Netty如何解决断连重连问题?
文档索引
面试题汇总
Q:Netty是什么?为什么需要Netty?
A: Netty时异步事件驱动的网络应用程序框架
NIO使用麻烦,且客户端面临断连重连、网络闪断、半包读写、失败缓冲、网络拥塞和异常流的处理等等;Netty对JDK自带的NIO的API进行封装,使用方便,解决了上述问题
在分布式系统中,各个节点之间需要远程服务调用,Netty往往作为基础通信组件被这些RPC框架使用。比如Dubbo、RocketMQ、Seata、Hadoop、Avro
Q:Netty为什么性能高?
A:
1、高效的Reactor线程模型
2、高性能序列化协议,支持protobuf等高性能序列化协议
3、使用零拷贝
4、无锁化的串行设计理念
5、灵活的TCP参数配置能力
6、使用内存池
Q:Netty有哪些组件?
A:
Q:Netty如何解决半包读写问题?
A: Netty的拆包器大致如下:
1、固定长度的拆包器 FixedLengthFrameDecoder
每个应用层数据包都拆分成固定长度大小
2、行拆包器 LineBasedFrameDecoder
每个应用层数据包,都通过换行符作为分隔符,进行分割拆分
3、分隔符拆包器 DelimiterBasedFrameDecoder
每个应用层数据包,都通过自定义的分隔符,进行分割拆分
4、基于数据包长度的拆包器 LengthFieldBasedFrameDecoder
将应用层数据包的长度,作为接收端应用层数据包的拆分依据。按照应用层数据包的大小,拆包。拆包器需要求应用层协议中包含数据包的长度
Q:Netty如何解决断连重连问题?
A: Netty中提供了一个IdleStateHandle类用于心跳检测,用法如下:
ch.pipeline().addLast("ping", new IdleStateHandler(60, 20, 60 * 10, TimeUnit.SECONDS));
第一个参数 60 表示读操作空闲时间
第二个参数 20 表示写操作空闲时间
第三个参数 60 * 10 表示读写操作空闲时间
第四个参数 单元 秒
通过心跳检测机制,可以检测客户端与服务的长连接是否保持,当客户端发送的心跳包没有收到服务端的响应时,可以认为服务端已经出故障了,这个时候可以重新连接或者选择其他的可用的服务进行连接