沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

    • 讲讲五种通信方式的区别
    • Dubbo入门
    • gRPC入门
    • Netty入门
      • 什么是 Netty?
      • Netty 的核心理念和原理
      • Netty 的机制(通信流程)
      • Netty 的线程模型(Reactor)
      • Netty 的优势
      • Netty 在项目中的常见应用
      • 编码解码机制(编解码器)
      • Netty 如何实现高性能(细节)
      • 总结
      • 附录
        • Selector 是什么?
        • 定义
        • 作用
        • Reactor 是什么?
        • 定义
        • 核心思想
        • 角色
  • 消息队列

  • Spring Cloud

  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

  • 虚拟机

  • 微服务
  • RPC
沉梦听雨
2025-07-10
目录

Netty入门

# Netty 入门

# 什么是 Netty?

Netty 是基于 Java NIO 封装的高性能、异步事件驱动的网络通信框架,用于开发 TCP、UDP、HTTP 等网络协议的客户端和服务端程序。

  • NIO (opens new window):同步非阻塞 IO 模型

# Netty 的核心理念和原理

Netty 核心基于 Reactor 模式 + NIO 非阻塞 I/O,实现了高并发、低延迟的通信机制。

核心组件:

组件 作用
EventLoopGroup 事件循环线程池,负责处理连接、读写等操作
Channel 抽象的网络连接通道
ChannelPipeline 责任链,保存 ChannelHandler 的执行链
ChannelHandler 业务逻辑处理器,处理读写事件
ByteBuf Netty 自定义的缓冲区,替代 ByteBuffer,使用灵活高效

# Netty 的机制(通信流程)

下面是 Netty 服务端的典型工作机制:

1. 客户端连接 -> BossGroup 线程接收连接
2. 将连接注册到 WorkerGroup 的 EventLoop
3. EventLoop 负责读写事件处理(使用 Selector 监听)
4. 收到数据 -> 解码 -> 业务逻辑处理 -> 编码 -> 写回客户端
1
2
3
4

多路复用:

  • 基于 Java NIO 的 Selector,使用一个线程监听多个 Channel,提高资源利用率。

# Netty 的线程模型(Reactor)

支持三种模式:

  • 在生产中常用 多线程 Reactor 模式(BossGroup + WorkerGroup)
  1. 单 Reactor 单线程
    • 所有操作都在一个线程中完成
    • 适合轻量级服务,性能瓶颈明显
  2. 单 Reactor 多线程
    • Reactor 线程负责监听和分发事件
    • 具体业务逻辑交给线程池执行
  3. 多 Reactor 多线程(默认)
    • 多个 Reactor 线程各自管理一组 Channel
    • 主 Reactor 接收连接后分配给子 Reactor
    • Netty 默认使用的是这种模型

# Netty 的优势

优势 说明
高性能 零拷贝、池化 ByteBuf、异步 I/O
灵活 可定制协议、编解码、事件处理
稳定成熟 Dubbo、RocketMQ、Elasticsearch 等底层使用
社区活跃 提供丰富示例和文档,更新稳定

ByteBuf 的优势:

  • 支持动态扩容、读写指针分离
  • 池化管理,减少内存分配/GC
  • 使用内存更高效(比 ByteBuffer 更强)

虽然 Netty 是基于 NIO 实现的,但它解决了原生 NIO 的一些痛点:

原生 NIO 的问题 Netty 的解决方案
使用复杂,API 不友好 提供简单易用的 API
处理空轮询 bug 内部优化避免该问题
没有内置的线程模型 提供完善的线程模型(EventLoopGroup)
没有编解码器支持 提供丰富的编解码器库
没有良好的异常处理机制 提供统一的异常捕获和处理机制

# Netty 在项目中的常见应用

  1. RPC 框架底层通信组件(如 Dubbo 使用 Netty 实现网络通信)
  2. 高并发聊天系统、IM、游戏服务端
  3. MQ 消息队列传输模块(如 RocketMQ)
  4. 自定义协议服务(如设备物联网通信协议解析)

# 编码解码机制(编解码器)

通过 ChannelHandler 中的 Decoder 和 Encoder 实现协议编解码。

常用的编解码器有:

  • LineBasedFrameDecoder:按行切分
  • LengthFieldBasedFrameDecoder:按消息长度切分
  • StringDecoder、ProtobufDecoder、HttpObjectDecoder

可用于定制自己的协议,例如:

pipeline.addLast(new LengthFieldBasedFrameDecoder(...));
pipeline.addLast(new CustomMessageDecoder());
pipeline.addLast(new BusinessLogicHandler());
1
2
3

# Netty 如何实现高性能(细节)

技术点 作用
零拷贝(Zero-Copy) 避免内核态和用户态之间的数据复制
对象复用 使用对象池(如 Recycler)减少频繁创建销毁
异步非阻塞 所有 I/O 操作都基于 Selector 异步处理
事件驱动 所有操作都是事件驱动机制,避免阻塞线程

同步 vs 异步 的关键区别:

  • 同步(Synchronous):应用程序必须自己去获取数据或等待 I/O 完成。
  • 异步(Asynchronous):系统完成后自动通知应用程序,应用程序不需要主动去取。

# 总结

Netty 是基于 NIO 的高性能网络框架,封装了复杂的底层通信细节,支持异步、事件驱动、零拷贝、线程复用等机制,广泛用于 RPC、MQ、IM 等高并发系统,是构建网络通信服务的首选框架。

总结对比表:

技术 类型 说明
Selector Java NIO API 实现 I/O 多路复用的基础组件
Reactor 设计模式 基于 Selector 构建的事件驱动模型
NIO 线程模型 编程模型 利用 Reactor 模式构建高性能服务器
Netty 框架 封装了 Reactor 模式,提供异步非阻塞风格的 API

# 附录

# Selector 是什么?

# 定义

Selector 是 Java NIO 中的一个组件,它允许一个线程可以监视多个 Channel(如 Socket)的 I/O 状态变化(例如:连接、读就绪、写就绪等),是实现 I/O 多路复用(Multiplexing) 的核心机制。

# 作用

  • 监听多个 Channel 的事件(如 OP_READ、OP_WRITE、OP_ACCEPT)
  • 避免为每个连接创建一个线程(节省资源)
  • 实现高效的 I/O 操作(适用于高并发)

# Reactor 是什么?

# 定义

Reactor 是一种设计模式,用于处理多个客户端请求,通常基于 I/O 多路复用模型 (比如 Selector)。它是一种 事件驱动(Event-driven) 的架构模式,广泛应用于服务器端网络编程中。

# 核心思想

使用一个或多个线程来监听和分发事件,将不同的 I/O 事件(如 accept、read、write)分发给相应的处理器进行处理。

# 角色

典型的 Reactor 模式包含以下角色:

组件 职责
Reactor 负责监听和分发事件(相当于主循环 + Selector)
Acceptor 当有新连接到达时,负责处理 accept 事件并创建新的 Channel
Handler 处理具体的 I/O 事件(如 read/write)
上次更新: 2025/7/10 17:42:47
gRPC入门
SpringBoot事件机制

← gRPC入门 SpringBoot事件机制→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式