Netty 是一个基于 Java NIO 的高性能、异步事件驱动的网络应用框架
在我简历的项目中,netty主要应用到了消息中心的消息推送提醒和在线的一个实时群聊

netty是一个比较难的技术,在这个项目中netty被用做消息通知,在线群聊,我主要理解它的基本API,怎么用的,三个核心组件,NIO与BIO的原理和八股,基于Netty是如何实现websocket的就可以了

  • 基础组件:从ChannelHandler(处理IO事件)、Bootstrap(启动类)、EventLoop(事件循环)入手,理解其责任链模式( 
  • 编解码:掌握ByteBuf(高效缓冲区)和StringEncoder/Decoder(字符串编解码),逐步扩展到复杂协议(如Protobuf)( 
  • 线程模型:区分bossGroup(接收连接)和workerGroup(处理业务),避免阻塞事件循环

在Netty中,服务端既实现服务器(Server)又实现客户端(Client)的开发模式,通常被称为双向通信模式全双工通信模式。这种模式的核心在于服务端不仅能被动接收客户端请求,还能主动向其他服务端或客户端发起连接并发送数据,形成双向交互的网络架构

由于使用到了webSocket,就不能在前端使用常规的异步请求框架了,前端也有对应的实现,所以这里就可以看出来websocket长连接和短连接的区别了

SpringBoot项目中引入Netty

<dependency>  
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>

netty中的比较重要的组件

Channel: Netty 拥有自己的 Channel 实现(例如 NioSocketChannel, NioServerSocketChannel),这些实现底层仍然基于 Java NIO 的 Channel,但提供了更多的功能和更好的性能。

Buffer: Netty 提供了 ByteBuf,它是对 Java NIO ByteBuffer 的改进和增强。 ByteBuf 更加灵活、易用、高效,并且解决了 ByteBuffer 的一些问题,例如 flip 操作的繁琐。

Selector: Netty 使用 EventLoop 来替代 Java NIO 的 Selector。 EventLoop 更加高效、可靠,并且解决了 Java NIO 的 Epoll 空轮询 Bug。

结合项目学习

群发消息和一对一实时聊天

用户发送消息,用户本人是通过接口返回的数据迅速的查看,其它用户则是通过webSocket主动推送

WebSocket

WebSocket 是一种网络通信协议,用于在客户端(通常是浏览器)和服务器之间建立全双工通信通道。这意味着一旦建立连接,客户端和服务器可以随时向对方发送消息,而不需要像传统的 HTTP 请求那样每次都重新建立连接。WebSocket 通常用于实时通信场景,如聊天应用、在线游戏、实时通知等。

1. WebSocket 的主要特点

  • 全双工通信:客户端和服务器可以同时发送和接收消息。
  • 低延迟:一旦建立连接,消息传输的延迟非常低,适合实时应用。
  • 基于 TCP:WebSocket 建立在 TCP 协议之上,确保数据传输的可靠性。
  • 支持多种数据格式:可以传输文本数据(如 JSON)或二进制数据。
    2. WebSocket 的工作原理
  1. 握手阶段:客户端通过 HTTP 请求向服务器发起 WebSocket 连接请求。服务器响应一个特殊的 HTTP 响应,表示同意建立 WebSocket 连接。
  2. 通信阶段:一旦握手成功,客户端和服务器之间就建立了一个 WebSocket 连接。双方可以随时发送和接收消息。
  3. 关闭阶段:当不再需要通信时,客户端或服务器可以发送关闭帧来关闭连接。
通过Netty实现WebSocket

在我个人的简历项目中,这个实现主要涉及到这么几个类
WebSocketService webSocket相关的业务逻辑
HttpHeadersHandler 协议升级前的处理器
NettyWebSocketServerHandler 协议升级后的处理器
NettyWebSocketServer 主类
NettyUtil 工具类

这个过程主要实现了,将Http协议升级为WebSocket协议,并发处理websocket一些连接和断开连接的操作,还有主要的业务逻辑在WebSocketServcie里面进行了封装。

HttpHeadersHandler

在协议进行升级前,传输的消息类型还是FullHttpRequest,这个类主要就是用于处理请求头信息,提取请求头中的token和客户端IP地址,把这些信息存储到Channel的属性中,在后续的WebSocket中使用到。

NettyWebSocketServer主类

  1. 通过bossGroup和workerGroup两个线程池分别处理连接请求和具体的业务逻辑;
  2. 配置了多个处理器,包括心跳检测(IdleStateHandler)、HTTP编解码(HttpServerCodec)、分块传输(ChunkedWriteHandler)等;
  3. 实现了WebSocket协议的升级,支持从HTTP协议升级到WebSocket协议;
  4. 通过自定义的NettyWebSocketServerHandler处理具体的业务逻辑;
  5. 支持优雅关闭服务器,确保资源的正确释放。

协议升级的具体实现

NettyWebSocketServer中,WebSocket协议升级是通过WebSocketServerProtocolHandler处理器实现的。在pipeline中,首先通过HttpServerCodec处理HTTP请求,然后使用HttpObjectAggregator将分段的HTTP数据聚合,接着通过HttpHeadersHandler获取并保存用户信息,最后WebSocketServerProtocolHandler会将HTTP协议升级为WebSocket协议,完成握手过程并建立全双工通信。

NettySocketServerHandler

WebSocket处理器,主要实现了以下功能:

  1. 处理WebSocket连接的建立和断开;
  2. 实现了心跳检测机制,当读空闲超时时会断开连接;
  3. 处理客户端发送的消息,根据消息类型(如登录、心跳等)进行不同的业务处理;
  4. 处理连接异常情况,在发生异常时关闭连接;
  5. 在连接建立时进行token验证,支持用户认证。

结语

本文笔者主要结合了一些netty的基础知识和我简历项目中的应用,由于笔者的简历项目是一个付费的学习项目,项目作者并没有把代码开源,出于对项目作者的尊重,没有贴具体的代码,只是说了一些我自己的理解,之前在面试美团的时候,面试官针对netty问了很多问题,具体的应用,阻塞IO和非阻塞IO这些,我都回答的不是特别好,后面准备写一下Netty的一些更深入的八股,让自己也能更深入的去了解Netty,顺便写一个第一次面试美团的面试体验