Netty面试题

【基础篇】
1、TCP、UDP的区别?
2、TCP协议如何保证可靠传输?
3、TCP的握手、挥手机制?
4、TCP的粘包/拆包原因及其解决方法是什么?
5、Netty的粘包/拆包是怎么处理的,有哪些实现?
6、同步与异步、阻塞与非阻塞的区别?
7、说说网络IO模型?
8、BIO、NIO、AIO分别是什么?
9、select、poll、epoll的机制及其区别?
10、说说你对Netty的了解?
11、Netty跟Java NIO有什么不同,为什么不直接使用JDK NIO类库?
12、Netty组件有哪些,分别有什么关联?
13、说说Netty的执行流程?

【netty篇】
1.Netty 是什么?

Netty 是一款基于 NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。难能可贵的是,在保证快速和易用性的同时,并没有丧失可维护性和性能等优势。

2.Netty 的特点是什么?

高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。

传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。

封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。

3.什么是 Netty 的零拷贝?

Netty 的零拷贝主要包含三个方面:

Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的 Buffer。

Netty 的文件传输采用了 transferTo 方法,它可以直接将文件缓冲区的数据发送到目标 Channel,避免了传统通过循环 write 方式导致的内存拷贝问题。

4.Netty 的优势有哪些?

使用简单:封装了 NIO 的很多细节,使用更简单。

功能强大:预置了多种编解码功能,支持多种主流协议。

定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。

性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。

稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。

社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。

5.Netty 的应用场景有哪些?

典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,还有 RocketMQ 也是使用 Netty 作为通讯的基础。

6.Netty 高性能表现在哪些方面?

IO 线程模型:同步非阻塞,用最少的资源做更多的事。

内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。

内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。

串形化处理读写:避免使用锁带来的性能开销。

高性能序列化协议:支持 protobuf 等高性能序列化协议。

7.Netty 和 Tomcat 的区别?

作用不同:Tomcat 是 Servlet 容器,可以视为 Web 服务器,而 Netty 是异步事件驱动的网络应用程序框架和工具用于简化网络编程,例如TCP和UDP套接字服务器。

协议不同:Tomcat 是基于 http 协议的 Web 服务器,而 Netty 能通过编程自定义各种协议,因为 Netty 本身自己能编码/解码字节流,所有 Netty 可以实现,HTTP 服务器、FTP 服务器、UDP 服务器、RPC 服务器、WebSocket 服务器、Redis 的 Proxy 服务器、MySQL 的 Proxy 服务器等等。

8.Netty 中有那种重要组件?

Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。

EventLoop:主要是配合 Channel 处理 I/O 操作,用来处理连接的生命周期中所发生的事情。

ChannelFuture:Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果。

ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。

ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。

9.Netty 发送消息有几种方式?

Netty 有两种发送消息的方式:

直接写入 Channel 中,消息从 ChannelPipeline 当中尾部开始移动;

写入和 ChannelHandler 绑定的 ChannelHandlerContext 中,消息从 ChannelPipeline 中的下一个 ChannelHandler 中移动。

10.默认情况 Netty 起多少线程?何时启动?

Netty 默认是 CPU 处理器数的两倍,bind 完之后启动。

11.Netty 支持哪些心跳类型设置?

readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息)。

writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)。

allIdleTime:所有类型的超时时间。

  • 24
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 什么是NettyNetty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它基于NIO(Non-blocking I/O)技术,提供了一种高度可定制的网络编程框架。 2. Netty有哪些主要的优点? Netty的主要优点包括: - 高性能:Netty使用异步事件驱动模型,能够处理更高的并发连接数,具有更低的延迟和更高的吞吐量。 - 易于使用:Netty提供了简单、直观的API,使开发人员能够快速上手,快速开发网络应用程序。 - 可扩展性:Netty的设计使其易于扩展,可以通过添加自定义处理器来实现特定的协议或功能。 - 安全性:Netty提供了强大的安全性功能,包括SSL/TLS支持和嵌入式加密。 - 可维护性:Netty的代码结构清晰、模块化,使其易于维护和调试。 3. Netty的核心组件是什么? Netty的核心组件包括: - Channel:表示一个网络连接,可以进行读、写和关闭操作。 - EventLoop:负责处理一个或多个Channel上的事件,包括读、写和空闲事件等。 - ChannelFuture:表示一个异步操作的结果,可以通过添加监听器来处理操作完成后的事件。 - ChannelHandler:用于处理Channel上的事件,包括读、写和异常事件等。 4. Netty的线程模型是什么? Netty的线程模型采用了Reactor模式,它是一种事件驱动的设计模式。在Reactor模式中,有一个或多个EventLoop线程负责处理事件,当有事件发生时,它们会调用相应的处理器来处理事件。 在Netty中,每个Channel都会被注册到一个EventLoop上,当有事件发生时,它们会调用注册在Channel上的ChannelHandler来处理事件。由于EventLoop是单线程的,因此需要通过多个EventLoop来实现并发处理。 5. Netty支持哪些协议? Netty支持多种协议,包括: - TCP/UDP:Netty提供了TCP和UDP协议的实现,支持多种编解码器,可以轻松实现自定义协议。 - HTTP/HTTPS:Netty提供了HTTP和HTTPS协议的实现,可以轻松构建高性能的Web应用程序。 - WebSocket:Netty提供了WebSocket协议的实现,可以轻松构建实时应用程序,如聊天应用程序。 - DNS:Netty提供了DNS协议的实现,可以轻松构建高性能的DNS服务器。 - SMTP:Netty提供了SMTP协议的实现,可以轻松构建高性能的邮件服务器。 - SSH:Netty提供了SSH协议的实现,可以轻松构建安全性高的远程访问应用程序。 6. Netty的内存模型是什么? Netty的内存模型采用了堆外内存池技术,它将Java对象和操作系统的I/O缓冲区分离开来,可以减少Java垃圾回收的负担,提高了性能。 Netty的ByteBuf类用于表示堆外内存,它提供了一种高效的读写字节数据的方式。由于ByteBuf是直接内存,因此可以通过零拷贝技术来减少内存拷贝,提高了性能。 7. 如何优化Netty应用程序的性能? 要优化Netty应用程序的性能,可以采取以下措施: - 使用异步I/O:Netty的异步事件驱动模型可以提高并发连接数、降低延迟和提高吞吐量。 - 精简处理器:只加载必要的处理器,可以减少内存占用和提高性能。 - 合理使用内存:采用堆外内存池技术,可以减少Java垃圾回收的负担,提高性能。 - 使用编解码器:Netty提供了多种编解码器,可以轻松实现自定义协议,提高性能。 - 合理使用线程:合理设置线程数,可以充分利用系统资源,提高性能。 - 使用性能监控工具:可以使用性能监控工具来发现性能瓶颈和优化空间。 8. Netty的异常处理机制是什么? Netty的异常处理机制基于ChannelPipeline,ChannelPipeline中的每个ChannelHandler都可以处理异常。当发生异常时,Netty会将异常抛给最后一个ChannelHandler,并且沿着ChannelPipeline向前传播,直到有处理该异常的ChannelHandler。 如果没有找到能够处理该异常的ChannelHandler,Netty会调用默认的异常处理器,它会将该异常记录到日志中,并关闭该Channel。 9. Netty如何实现心跳机制? Netty可以通过添加IdleStateHandler处理器来实现心跳机制。该处理器会检测Channel是否空闲,如果超过指定的时间没有读或写事件发生,就会触发一个IdleStateEvent事件。开发人员可以通过重写ChannelHandler的userEventTriggered方法来处理该事件,实现心跳机制。 10. Netty如何实现高可用性? 要实现Netty应用程序的高可用性,可以采用以下措施: - 使用负载均衡器:可以通过负载均衡器将请求分发到多个Netty服务器上,提高可用性和吞吐量。 - 实现集群化部署:将Netty应用程序部署到多个服务器上,可以提高可用性和扩展性。 - 配置自动故障转移:在Netty应用程序出现故障时,可以自动将请求转移到备用服务器上,提高可用性。 - 实现数据备份:对于关键数据,可以进行备份,以防止数据丢失。 - 配置监控和告警机制:对于Netty应用程序的关键指标,可以配置监控和告警机制,及时发现和处理故障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值