1. 介绍一下Netty?

Netty是一个基于事件驱动的异步非阻塞式的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,实现了对于Java NIO的进一步封装,但是并发性能更高、传输速度快(依赖于零拷贝技术)和使用更加灵活简便(接口易于调用使用)。

相比于其他的网络应用框架,它具有如下的优势:

  • 使用简单:封装了Java NIO的很多细节
  • 功能强大:预置了多种编解码功能,支持多种主流协议
  • 定制能力强:通过ChannelHandler可以对框架进行灵活的扩展
  • 性能高:IO线程模型、内存零拷贝、内存可重用、串行化处理读写、高性能序列化协议
  • 稳定性好:修复了已经发现的所有NIO的bug
  • 社区活跃:版本迭代周期短,bug修复速度快

阿里的分布式服务框架Dubbo和消息队列RocketMQ都是使用Netty作为基础通信组件。


2. Netty的线程模型?

Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,bossGroup和workerGroup,其中bossGroup的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给workerGroup,其中workerGroup负责请求的read和write事件,由对应的Handler处理。

其中Reactor模型的实现又有多种形式:

  • 单线程模型:所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的
  • 多线程模型:一个NIO线程只负责监听来自客户端的TCP连接请求,NIO线程池负责网络IO的操作
  • 主从多线程模型:Acceptor线程用于绑定监听端口,接收客户端连接,将SocketChannel从主线程池的Reactor 线程的多路复用器上移除,重新注册到Sub线程池的线程上,用于处理I/O 的读写等操作,从而保证mainReactor只负责接入认证、握手等操作

3. TCP粘包/半包出现的原因和解决方法?

粘包和半包现象出现在接收端,当Netty程序将数据从内核缓冲区复制到Netty应用进程缓冲区的ByteBuf时:

  • 当TCP底层缓冲的数据包比较大时,会将一个底层包分为多次ByteBuf进行复制,进而造成进程换成那个区读到的是半包
  • 当TCP底层缓冲的数据包比较小时,一次复制的却不止一个内核缓冲区包,进而造成进程缓冲区读到的是粘包

相应的解决方法有:

  • 定长消息:FixedLengthFrameDecoder
  • 包尾增加特殊字符分隔:LineBasedFrameDecoder(行分隔符)、DelimiterBasedFrameDecoder(自定义分隔符)

4. Netty中的重要组件有哪些?

  • Channel:通道
  • EventLoop:配合Channel的处理IO操作,用来处理连接生命周期中发生的事情
  • ChannelFuture:ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果
  • ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件
  • ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的

5. Netty默认起多少线程?

Netty默认在bind方法执行后起CPU核心数两倍的线程数。


6. 序列化/反序列化以及影响性能的因素?

序列化(编码)是将对象序列化为二进制形式(字节数组),主要用于网络传输、数据持久化等;而反序列化(解码)则是将从网络、磁盘等读取的字节数组还原成原始对象,主要用于网络传输对象的解码,以便完成远程调用。
影响序列化性能的关键因素:

  • 序列化后的码流大小(网络带宽的占用)、序列化的性能(CPU资源占用)
  • 是否支持跨语言(异构系统的对接和开发语言切换)

7.Netty 和 Tomcat 的区别?

  • 作用不同:Tomcat 是 Servlet 容器,可以视为 Web 服务器,而 Netty 是异步事件驱动的网络应用程序框架和工具用于简化网络编程,例如TCP和UDP套接字服务器
  • 协议不同:Tomcat 是基于 http 协议的 Web 服务器,而 Netty 能通过编程自定义各种协议。因为 Netty 本身自己能编码/解码字节流,所有 Netty 可以实现HTTP 服务器、FTP 服务器、UDP 服务器、RPC 服务器、WebSocket 服务器、Redis 的 Proxy 服务器、MySQL 的 Proxy 服务器等等