Netty 框架介绍

1. Netty 框架介绍

Netty 是一个基于 Java NIO(Non-blocking I/O)的异步事件驱动网络应用框架,旨在快速开发高性能、高可靠性的网络服务器和客户端。它简化了 TCP/UDP 等协议的编程,并提供了高度可定制的组件,适用于高并发场景(如游戏服务器、即时通讯、分布式系统等)。

核心特性:
  • 高性能:基于事件驱动的 Reactor 线程模型,减少线程切换开销,支持零拷贝技术。
  • 异步非阻塞:通过 Future 或回调机制处理 I/O 操作,避免线程阻塞。
  • 模块化设计:提供可插拔的组件(如编解码器、协议支持),支持快速扩展。
  • 健壮性:内置心跳检测、重连机制、流量整形等容错功能。
核心组件:
  • Channel:封装网络连接(如 Socket),支持读写操作。
  • EventLoop:事件循环,负责处理 I/O 事件和异步任务。
  • ChannelHandler:处理 I/O 事件(如数据接收、连接建立)的核心逻辑单元。
  • ByteBuf:高效的自定义字节缓冲区,支持池化内存管理。

2. Netty 与 Java I/O 库的区别

2.1 编程模型对比

特性

Java I/O(BIO)

Java NIO

Netty

I/O 模型

阻塞式(Blocking I/O)

非阻塞式(Non-blocking I/O)

基于 NIO 的异步事件驱动

线程模型

每连接一个线程(高资源消耗)

单线程或少量线程管理多连接(Selector)

多 Reactor 线程池(EventLoopGroup)

代码复杂度

简单但难以扩展

复杂(需手动处理 Selector、Buffer)

简化了 NIO 的复杂性,提供高层抽象

内存管理

基于 byte[]InputStream

使用 ByteBuffer(需手动 flip/clear)

使用 ByteBuf(自动扩容、内存池优化)

协议支持

需自行实现

需自行实现

内置 HTTP、WebSocket、Protobuf 等

适用场景

低并发、简单协议

中高并发、需精细控制

高并发、高性能、复杂协议


2.2 示例对比:实现 Echo 服务器
Java I/O(BIO)实现
// 每个连接占用一个线程,线程数随连接数线性增长
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {Socket clientSocket = serverSocket.accept(); // 阻塞new Thread(() -> {try {BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String line;while ((line = in.readLine()) != null) { // 阻塞clientSocket.getOutputStream().write(line.getBytes());}} catch (IOException e) { /* 处理异常 */ }}).start();
}
Netty 实现
public class EchoServer {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup(); // 处理连接EventLoopGroup workerGroup = new NioEventLoopGroup(); // 处理 I/Otry {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new EchoServerHandler()); // 自定义逻辑}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// 业务逻辑(非阻塞)
public class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg); // 异步写回数据}
}

2.3 核心区别总结
  1. 线程模型
    • Java I/O:阻塞模型导致线程资源浪费。
    • Netty:通过少量线程(EventLoop)管理大量连接,减少上下文切换。
  1. 开发效率
    • Java NIO:需手动处理 Selector、Buffer 边界等问题。
    • Netty:提供编解码器、粘包/拆包解决方案(如 LengthFieldBasedFrameDecoder),简化开发。
  1. 性能优化
    • Netty 的 ByteBuf 支持内存池(减少 GC 压力),零拷贝技术(如 FileRegion)。
  1. 扩展性
    • Netty 的 ChannelHandler 链式设计允许灵活添加业务逻辑(如日志、加密)。

结论

  • 选择 Java I/O:适合简单、低并发的场景(如本地文件操作)。
  • 选择 Netty:适用于高并发、低延迟的网络应用(如微服务通信、实时消息推送)。Netty 的抽象层屏蔽了底层复杂性,显著提升开发效率和系统性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse 插件开发 5.2 编辑器 获取当前编辑器

Eclipse 插件开发 5.2 编辑器 获取当前编辑器 1 获取活跃编辑器2 获取全部编辑器 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Click1 Bundle-SymbolicName: com.xu.click1;singleton:true Bundle-Version: 1.0.0 Bundle-Activator: com.xu.click1.Activato…

完成LRU页面调度算法的模拟

目录 1.上代码 2.实现思路 1.上代码 #include<iostream> using namespace std; //内存块类 class memory { public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(me…

Three.js 直线拐角自动圆角化(圆弧转弯)

目录 前言 计算圆心坐标 计算两条直线的角平分线 计算dir1 dir2的夹角 计算圆心到直线交点的距离 计算圆心 计算从正X轴算起曲线开始、终止的角度 计算垂足与两直线交点距离 计算垂足 计算垂线 计算两垂线与x轴的夹角 ​编辑 计算圆弧是否按照顺时针方向来绘制 成功…

【MYSQL】mysql单表亿级数据查询优化处理

1、实践表明mysql单表数据超过一亿后&#xff0c;数据进行交并差效率会非常慢&#xff0c;所以这时候就要进行表的优化。 我这里主要是使用索引。 2、表字段精量精简 查索引&#xff0c;建索引&#xff0c;删索引语法 --查看索引 -- SHOW INDEX FROM 表名; -- 删除索引 --AL…

C++基础:模拟实现vector(有存在深层次的浅拷贝问题)

目录 引言 一、vector的基本框架 二、尾插push_back、reserve扩容、任意位置插入insert&#xff08;增&#xff09; 1.reserve扩容 2.push_back尾插 3.深层次的浅拷贝问题 4. 任意位置插入数据insert(会使迭代器失效) 三、构造、析构、拷贝构造函数 1.构造函数 1.1无…

【力扣】关于链表索引

怎么才能走到目标节点呢&#xff1f; 从9走到2&#xff0c;需要2步&#xff0c;他们的索引分别是&#xff1a;0&#xff0c;2 在for循环里&#xff1a;int i 0; i < 2; i i的范围是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果从虚拟头节点开始走到2&#x…

C++ ODB框架详解:现代C++对象关系映射解决方案

目录 框架简介安装与配置基础概念实体映射数据库操作查询操作高级功能性能优化最佳实践 框架简介 ODB&#xff08;Object-Relational Database&#xff09;是一个专为C设计的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司开发。它提供了一种…

Ai书签管理工具开发全记录(一):项目总览与技术蓝图

文章目录 Ai书签管理工具开发全记录&#xff08;一&#xff09;&#xff1a;项目总览与技术蓝图 ✨1. 项目背景与核心价值 &#x1f4a1;1.1. 核心特点 2. 技术架构分析 &#x1f3d7;️功能架构全景图典型工作流 3. 核心技术栈选择 &#x1f6e0;️4. 预期使用功能说明 &#…

GUI 编程——python

GUI 编程核心概念 GUI&#xff08;图形用户界面&#xff0c;Graphical User Interface&#xff09; 是一种通过图形元素&#xff08;窗口、按钮、菜单等&#xff09;与用户交互的应用程序形式&#xff0c;相比命令行界面更直观易用。以下是学习 GUI 编程的基础概念和流程&…

【Doris基础】Apache Doris 基本架构深度解析:从存储到查询的完整技术演进

目录 1 引言 2 Doris 架构全景图 2 核心组件技术解析 2.1 Frontend 层&#xff08;FE&#xff09; 2.2 Backend 层&#xff08;BE&#xff09; 3 数据存储与复制机制 3.1 存储架构演进 3.2 副本复制策略 4 查询处理全流程解析 4.1 查询生命周期 5 高可用设计 5.1 F…

光电赋能低空场景,灵途科技助力无人机持续升级

2025 UASE 主题为“步入低空经济新时代”的“2025第九届世界无人机大会暨国际低空经济与无人系统博览会/第十届深圳国际无人机展览会”5月23日在深圳会展中心隆重开幕。本届展会汇聚了全球800余家企业参展&#xff0c;展示5000多款无人机及系统设备&#xff0c;全面呈现低空经…

iOS QQ抽屉式导航的实现

QQ个人中心的侧滑功能(通常称为"抽屉式导航")可以通过以下几种方式在iOS中实现&#xff1a; 主要实现方案 使用第三方库 最快速的方式是使用成熟的第三方库&#xff1a; SWRevealViewController&#xff1a;最流行的侧滑菜单库MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行标签或列标签前添加指定前缀的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行标签或列标签后添加指定后缀的方法DataFram…

长短期记忆网络 (LSTM) 详解:从原理到应用

一、引言&#xff1a;序列数据处理的挑战​ 在自然语言处理、语音识别、时间序列分析等领域&#xff0c;数据通常以序列形式存在&#xff0c;前后数据点之间存在依赖关系。传统循环神经网络 (RNN) 虽然能捕捉序列依赖&#xff0c;但存在严重的梯度消失 / 爆炸问题&#xff0c;…

三天掌握PyTorch精髓:从感知机到ResNet的快速进阶方法论

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 一、分析式AI基础与深度学习核心概念 1.1 深度学习三要素 数学基础&#xff1a; f(x;W,b)σ(Wxb)(单层感知机) 1.2 PyTorch核心组件 张量操作示例…

Linux操作系统概述

一、操作系统的作用 1、五大基本功能 &#xff08;1&#xff09;进程和线程的管理&#xff1a;进程线程的状态、控制、同步互斥、通信调度等 (2&#xff09;存储管理&#xff1a;分配/回收、地址转换、存储保护等 (3&#xff09;文件管理&#xff1a;文件目录、文件操作、磁盘…

Python爬虫第22节- 结合Selenium识别滑动验证码实战

目录 一、引言 二、滑动验证码原理与反爬机制 2.1 验证码原理 2.2 反爬机制 三、工程实战&#xff1a;滑动验证码识别全流程 3.1 工程准备 3.1.1 环境依赖 3.1.2 目标网站与验证码识别案例 3.2 核心破解流程 3.2.1 自动化打开网页与登录 3.2.2 获取验证码图片&#…

NSSCTF-[NISACTF 2022]huaji?

下载附件得到文件 放到kali里面看看 发现是一张图片 用binwalk命令对其进行分离 发现需要密码 用010打开图片进行查看 对其进行解密 分别得到 ctf_NISA_2022 nisa_2022 发现ctf_NISA_2022是密码 得到flag NSSCTF{Nls_FumYEnnOjy}

nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

第一部分&#xff1a;MmMapViewInSystemCache函数返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …

Uniapp+UView+Uni-star打包小程序极简方案

一、减少主包体积 主包污染源&#xff08;全局文件依赖&#xff09;劲量独立导入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin节点 "usingComponents" : true,"lazyCodeLoading" : "requiredC…