Netty相关网络IO面试题(20题)

写在前面:
本文2万多字,阅读需要花费一点时间, 主要介绍网络编程部分知识,包括Netty 和 IO 网络等知识点;
仅供复习使用!

1. 网络四元组

四元组,简单理解就是在 TCP 协议中,去确定一个客户端连接的组成要素,它包括源IP 地址、目标 IP 地址、源端口号、目标端口号。
正常情况下,我们对于网络通信的认识可能是这样(如图)。
服务端通过 ServerSocket 建立一个对指定端口号的监听,比如 8080。 客户端通过目标 ip 和端口就可以和服务端建立一个连接,然后进行数据传输。
image.png
但是我们知道的是,一个 Server 端可以接收多个客户端的连接,比如像这种情况(如图)。
那,当多个客户端连接到服务端的时候,服务端需要去识别每一个连接
image.png
并且(如图),TCP 是全双工协议,也就是说数据允许在连接的两个方向上同时传输,因此这里的客户端,如果是反向通信,它又变成了服务端
image.png
所以基于这两个原因,就引入了四元组的设计,也就是说,当一个客户端和服务端建立一个 TCP 连接的时候,通过源 IP 地址、目标 IP 地址、源端口号、目标端口号来确定一个唯一的 TCP 连接。因为服务器的 IP 和端口是不变的,只要客户端的 IP 和端口彼此不同就 OK 了。
比如像这种情况(如图),同一个客户端主机上有三个连接连到 Server 端,那么这个时候源 IP 相同,源端口号不同。此时建立的四元组就是(10.23.15.3,59461 ,192.168.8.135,8080)
其中,源端口号是每次建立连接的时候系统自动分配的。
image.png
:::info
“终局思维”来看待自己的职业规划
:::

2. 对 Netty 的认识

好的,我用三点来简单的介绍下 Netty

  1.  第一:Netty 是一个 基于 NIO 模型的高性能网络通信框架,其实可以认为它是对 NIO 网络模。型的封装,提供了简单易用的 API,我们可以利用这些封装好的API 快速开发自己的网络程序。
  2.  第二:Netty 在 NIO 的基础上做了很多优化,比如零拷贝机制、高性能无锁队列、内存池等,因此性能会比 NIO 更高。
  3.  第三:Netty 可以支持多种通信协议,如 Http、WebSocket 等,并且针对数据通信的拆包黏包问题,Netty 内置了拆包策略。

为什么要用 Netty

Nety 相比于直接使用 JDK 自带的 NIO 相关的 API 来说更加易用

  1. 统一的 API,支持多种传输类型,如阻塞、非阻塞,以及 epoll、poll 等模型。
  2. 我们可以使用非常少的代码来实现,多线程 Reactor 模型以及主从多线程 Reactor模型
  3. 自带编解码器解决 TCP 粘包/拆包问题。
  4. 自带各种协议栈。
  5. 比直接使用 Java 库中的 NIO API 有更高的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。
  6. 安全性不错,有完整的 SSL/TLS 以及 StartTLS 支持。
  7. 社区活跃成熟稳定,经历了大型项目的使用和考验,而且很多开源项目都使用到了Netty, 比如我们经常接触的 Dubbo、RocketMQ ZK 等等。

Netty 可以做什么事情

核心点还是在于解决服务器如何承载更多的用户同时访问
传统的 BIO 模型,由于阻塞的特性,使得在高并发场景中,很难获得更高的吞吐量。
而后来基于 NIO 的多路复用模型虽然在阻塞方面进行了优化,但是它的 API 使用比较复杂,对于初学者来说使用不是很友好。而 Netty 是基于 NIO 的封装,提供了成熟且简单易用的 API,降低了使用成本和学习成本。
本质上来说,Netty 和 NIO 所扮演的角色是相同的,都是为提升服务端的吞吐量,让用户获得更好的产品体验。
另外,Netty 这个中间件经过很多年验证,在目前主流中间件如 Zookeeper、Dubbo、RocketMQ 中都有应用。

3. Netty 核心组件和作用

高手:Netty 由三层结构构成:网络通信层、事件调度器与服务编排层
在网络通信层有三个核心组件:Bootstrap、ServerBootStrap、Channel
 Bootstrap 负责客户端启动并用来链接远程 netty server
 ServerBootStrap 负责服务端监听,用来监听指定端口,
 Channel 是负责网络通信的载体
事件调度器有两个核心组件:EventLoopGroup 与 EventLoop
 EventLoopGroup 本质上是一个线程池,主要负责接收 I/O 请求,并分配线程执行处理请求。
 EventLoop。相当于线程池中的线程
在服务编排层有三个核心组件 ChannelPipeline、ChannelHandler、ChannelHandlerContext
 ChannelPipeline 负责将多个 Channelhandler 链接在一起
 ChannelHandler 针对 IO 数据的处理器,数据接收后,通过指定的 Handler 进行处理。
 ChannelHandlerContext 用来保存 ChannelHandler 的上下文信息

Netty 有几种线程模型吧?

Netty 提供了三种 Reactor 模型的支持
 单线程单 Reactor 模型
 多线程单 Reactor 模型
 多线程多 Reactor 模型

对于这三种线程 Reactor 模型的理解

Reactor 模型有三个重要的组件:

  1. Reactor :将 I/O 事件发派给对应的 Handler
  2. Acceptor :处理客户端连接请求
  3. Handlers :执行非阻塞读/写
    这是最基本的单 Reactor 单线程模型
    image.png
    其中 Reactor 线程,负责多路分离套接字,有新连接到来触发 connect 事件之后,交
    由 Acceptor 进行处理,有 IO 读写事件之后交给 hanlder 处理。
    Acceptor 主要任务就是构建 handler ,在获取到和 client 相关的 SocketChannel 之
    后 ,绑定到相应的 hanlder 上,对应的 SocketChannel 有读写事件之后,基于 racotor
    分发,hanlder 就可以处理了(所有的 IO 事件都绑定到 selector 上,有 Reactor 分发)
    多线程单 Reactor 模型
    单线程 Reactor 这种实现方式有存在着缺点,从实例代码中可以看出,handler 的执行
    是串行的,如果其中一个 handler 处理线程阻塞将导致其他的业务处理阻塞。由于
    handler 和 reactor 在同一个线程中的执行,这也将导致无法接收新的请求。
    为了解决这种问题,有人提出使用多线程的方式来处理业务,也就是在业务处理的地方
    加入线程池异步处理,将 reactor 和 handler 在不同的线程来执行,这就是多线程单
    Reactor 模型
    image.png
    多线程多 Reactor 模型
    在多线程单 Reactor 模型中,所有的 I/O 操作是由一个 Reactor 来完成,而 Reactor
    运行在单个线程中,它需要处理包括 Accept()/read()/write/connect 操作,对于小容
    量的场景,影响不大。但是对于高负载、大并发或大数据量的应用场景时,容易成为瓶
    颈,主要原因如下:
     一个 NIO 线程同时处理成百上千的链路,性能上无法支撑,即便 NIO 线程的 CPU
    负荷达到 100%,也无法满足海量消息的读取和发送;
     当 NIO 线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超
    时之后往往会进行重发,这更加重了 NIO 线程的负载,最终会导致大量消息积压
    和处理超时,成为系统的性能瓶颈;
    所以,我们还可以更进一步优化,引入多 Reactor 多线程模式
    image.png
    Main Reactor 负责接收客户端的连接请求,然后把接收到的请求传递给
    SubReactor(其中 subReactor 可以有多个),具体的业务 IO 处理由 SubReactor
    完成。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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应用程序的关键指标,可以配置监控和告警机制,及时发现和处理故障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值