zoukankan      html  css  js  c++  java
  • 面试题-Netty框架

    前言

    Netty框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定的帮助。

    系列文章:

    面试题-Java基础

    面试题-Java集合

    面试题-Java多线程基础、实现工具和可见性保证

    面试题-线程池和原子变量

    面试题-Java虚拟机

    面试题-计算机网络1

    面试题-计算机网络-HTTP部分


    Netty框架

    1. Netty 是什么?

      • Netty是一个基于NIO的client-server框架,使用它可以快速开发网络应用程序
      • 并且支持多种协议,包括FTP,HTTP以及各种二进制和基于文本的传输协议
    2. 为什么要⽤ Netty?

      • 阻塞和⾮阻塞的Socket都使用统一的API,便于开发
      • 实现了强大的线程模型
      • 自带解决粘包拆包的解码器
      • 社区活跃,经历了大型项目的考验,成熟稳定
    3. Netty 应⽤场景了解么?

      • 我们项目中的就是利用Netty实现了一个自有协议的网络服务器
      • 很多分布式框架的网络通信工具,比如我们项目中使用的Storm底层也是使用Netty进行通信的
    4. Netty 核⼼组件有哪些?分别有什么作⽤?

      • Channel:Netty对网络操作的抽象,包括了一些常见的网络IO操作,比如read,write等等,最常见的实现类:NioServerSocketChannel和NioSocketChannel,对应Bio中的ServerSocketChannel和SocketChannel
      • EventLoop:负责监听网络事件并调用事件处理器进行相关的处理
      • ChannelFuture:Netty是异步的,所有操作都可以通过ChannelFuture来实现绑定一个监听器然后执行结果成功与否的业务逻辑,或者把通过调用sync方法,把异步方法变成同步的。
      • ChannelHandler 和 ChannelPipeline:Netty底层的处理器是一个处理器链,链条上的每一个处理器都可以对消息进行处理,选择继续传递或者到此为止,一般我们业务会实现自己的解码器/心跳处理器和实际的业务处理Handler,然后按照顺序绑定到链条上。
    5. EventloopGroup 了解么?和 EventLoop 啥关系?

      EventLoop可以理解为线程,那么Group就是线程池或者线程组,Netty的线程模型中,每一个channel需要绑定到一个固定的EventLoop进行后续的处理,Netty就是根据某一个算法从线程组中选择一个线程进行绑定的。

    6. Bootstrap 和 ServerBootstrap 了解么?

      BootStarp和ServerBootstrap都是一个启动引导类,相当于如果要使用Netty需要把相关信息配置到启动引导类中,这样Netty才能正确工作。

      • Bootstrap是客户端引导类,核心方法是connect,传入一个EventLoopGroup就可以

      • ServerBootstrap是服务断引导类,核心方法是bind,需要传入两个EventLoopGroup,一个负责接受连接,一个负责处理具体的连接上的网络IO任务。

    7. NioEventLoopGroup 默认的构造函数会起多少线程?

      NioEventLoopGroup 默认的构造函数实际会起的线程数为 CPU核⼼数*2 。

    8. Netty 线程模型了解么?

      Netty主要靠配置EventLoopGroup来实现具体的线程模型的。

      以服务端开发为例,通过配置不同的线程数量可以实现不同的线程模型。

      • 单线程:两个EventloopGroup都是用同一个只为1的group,这意味着一个线程需要处理所有的socket的所有网络IO事件,对高负载高并发高性能的场景不适用。
      • 多线程:一个acceptor线程负责监听连接,N个EventLoop负责处理具体连接的网络IO,但是如果并发连接大,就会出现性能问题
      • 主从模型:主从模型就是acceptor连接线程使用线程池来实现,我们具体项目也是使用这种方式的。
    9. 什么是 TCP 粘包/拆包?

      TCP的粘包拆包指的是,基于TCP发送数据时,多条消息会在一个包中粘在一起,或者一条消息直接被分为两个包发送过来,我们需要正确的处理,把每条消息都正确的拆分和合并起来。

    10. 简单说说Netty中自带的解决粘包拆包的解码器类型吧?

      Netty自带四种解决粘包拆包的解码器。

      • LineBasedFrameDecoder :基于换行符的解码器
      • DelimiterBasedFrameDecoder:基于分隔符的解码器
      • FixedLengthFrameDecoder:基于固定长度的解码器
      • LengthFieldBasedFrameDecoder:基于消息中的消息长度字段进行解码的解码器,我们项目中实际使用的就是这种解码器,核心就是传入长度字节的起始位置和长度即可。
    11. ⻓连接是什么

      • 什么是连接:TCP协议中如果两端想要传递数据,首先需要通过三次握手建立连接,握手完毕,连接就建立完毕,但是这个过程是比较消耗网络资源的。

      • 短连接:一轮数据传输完毕后,就断开连接,实现和管理都很方便,但是频繁的建立断开连接比较消耗网络资源。

      • 长连接:数据传输完毕后,不断开连接,下次有数据发送需求的时候再使用这个连接,省去了握手的过程。

    12. 如何实现长连接?

      我在自己的博客中专门写过一篇博客总结过为什么需要保活机制,详见此 网络编程-为什么需要应用层做心跳处理?总结来说,依赖TCP的超时或者Keep alive机制,在最差情况下的超时时间都是不可接受的,所以我们需要通过定时发送带序号的心跳包来实现应用层保活,并且为了防止误判,需要多发送几次心跳包来检测,在我们具体的业务实现中,使用的是Netty的IdeStateHandle中的回调方法来实现心跳机制。

    13. Netty 的零拷⻉了解么?

      首先说说什么是零拷贝:

      • 零拷贝技术指的是,cpu不需要为了在内存中拷贝数据而消耗资源
      • Netty中的零拷贝技术表现形式有下面几种:
        - 可以把文件中的数据直接发送到发送缓冲区中,底层用的是操作系统提供的sendFile系统调用(节省了内核到用户空间和用户空间到内核的两次拷贝)。 参考材料: 内核零拷贝的实现原理
        - 允许多段数据合并为一段虚拟数据供用户使用,节约了copy的消耗
  • 相关阅读:
    linux c++ 实现http请求
    pip 换源
    Web API接口
    DRF框架知识总览
    jq+bs插件
    element-ui插件
    axios插件
    前端存储数据汇总
    Vuex插件
    全局配置css和js
  • 原文地址:https://www.cnblogs.com/ging/p/13836855.html
Copyright © 2011-2022 走看看