关于Netty的一些理解

目录

1. 为什么要用Netty?

2. 常见的几种IO模型

2.1 BIO

2.2 NIO

2.3 AIO

3. 传输层TCP和UDP的区别

4. 关于粘包/拆包

5. Netty核心组件和工作流程

5.1 核心组件

5.2 服务端工作流程

6. Tomcat和Netty的区别


网络编程的核心在于理解 I/O 模型 和 协议

而 Netty 是 Java 领域对 NIO 模型最卓越、最成熟的封装和实践,它通过 Reactor 线程模型 和 责任链模式 实现了极高的性能和扩展性,让我们能更专注于业务逻辑的开发,而不是底层网络细节。

下面对Netty相关的一些知识和常见问题作总结。

1. 为什么要用Netty?

简单来说直接通过Java NIO来网络编程其实挺痛苦的。主要因为:

API 复杂:需要自己处理 SelectorChannelBuffer 的复杂交互。

可靠性差:需要自己处理网络闪断、粘包拆包、重连、安全等问题。

工作量巨大:要实现一个高性能、高稳定的网络服务器,需要大量的底层代码。

所以为了解决这些问题通常会直接用Netty,快速开发可维护的高性能服务器和客户端。

2. 常见的几种IO模型

2.1 BIO

Blocking I/O模型就是一个线程处理一个连接,在处理accept(), read(), write()等操作的时候会阻塞直到数据就绪。在JDK中通过ServerSocketSocket实现。

所以缺点是并发连接数受限于线程数,创建线程时也会消耗大量资源,以及上下文切换开销。

2.2 NIO

Non-blocking I/O模型就是线程将连接(Channel)注册到多路复用器(Selector)上,然后Selector轮询Channel的I/O事件。在JDK中通过java.nio实现。

但缺点是API复杂度高,需要手动处理各种边界和异常情况。

2.3 AIO

Asynchronous I/O模型就是应用发起I/O操作后立即返回并且操作系统完成所有操作后回调通知应用,一般适用于长连接业务场景。

3. 传输层TCP和UDP的区别

TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠,保证数据顺序和正确到达不可靠,可能丢包/乱序
传输形式无边界字节流有边界数据报文
速度较慢
应用场景文件传输/邮件/网页HTTP/SSH视频流/语音通话

4. 关于粘包/拆包

TCP是字节流协议,发送方的多个数据包可能在接收方被合并成一个或拆分成多个。

通常来说可以设置定长消息,分隔符,消息头声明长度解决问题。

Netty中有很多解码器(Decoder)可以解决这个问题。

5. Netty核心组件和工作流程

5.1 核心组件

1) Bootstrap/ServerBootstrap: 启动引导类,配置和启动。

2) EventLoopGroup, EventLoop。

  • EventLoopGroup包含多个EventGroup;
  • 每个EventLoop绑定一个独立线程,负责处理多个Channel的I/O事件;
  • Reactor线程模型的实现,通常来说服务端会有两个Group,bossGroup接受连接和workerGroup处理已建立连接的I/O。

3) Channel:代表一个实体(websocket/file)的开放连接,处理所有I/O操作。

4) ChannelHandler, ChannelPipeline。

  • ChannelPipeline是一个ChannelHandler的责任链,数据读取和写入都会经过这里。
  • ChannelHandler是处理数据的逻辑单元,分为ChannelInboundHandler(处理入站事件)和ChannelOutboundHandler(出站事件)。

5) ChannelFeature:由于Netty是异步的,所有的I/O操作都会立即返回ChannelFeature,一般通过它来注册监听器,在操作完成成功或失败的时候做一些回调。

5.2 服务端工作流程

1) 创建bossGroup和workerGroup。

2) 创建ServerBootstrap并配置Group,Channel类型(NioServerSocketChannel),Handler。

3) bind(port)并启动服务端。

4) 当有新连接接入时,bossGroup的EventLoop会接收到这个事件,并创建一个新的Channel。

5) 将这个新的Channel注册到workerGroup中的一个EventLoop线程处理I/O事件。

6) 读写事件触发ChannelPipeline中对应的ChannelHandler执行业务逻辑。

6. Tomcat和Netty的区别

1) Tomcat是一个 Web 容器(Servlet 容器),主要用于运行 Java Web 应用(基于 Servlet/JSP 规范)。它本质上是一个 HTTP 服务器,专门针对 Web 开发场景设计,能够处理 HTTP 请求、管理 Servlet 生命周期、支持 JSP 解析等 Web 相关功能。
适合传统的 Java Web 应用(如 Spring MVC 项目),专注于 HTTP 协议和 Web 层规范的实现。

2) Netty是一个 异步事件驱动的网络应用框架,专注于 高效的网络通信底层开发。它不局限于 HTTP 协议,可用于实现各种自定义协议(如 TCP、UDP、WebSocket 等),提供了简洁的 API 来处理复杂的网络通信场景。
通过异步非阻塞、零拷贝(Zero-Copy)、内存池等机制,能在高并发场景下保持低延迟和低资源占用(为什么Netty传输快的原因),适合需要自定义协议、高性能通信的场景(如 RPC 框架、消息中间件、游戏服务器等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值