Netty为什么高效,为什么这么受欢迎?

这篇具有很好参考价值的文章主要介绍了Netty为什么高效,为什么这么受欢迎?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。

Netty 解决的问题

我们先看看使用 Netty 在网络编程中帮助我们解决了什么问题

简化网络编程

首先基于 Netty 初次编码的直观体验来讲,开发者不用手动处理网络通信细节,包括线程管理、I/O 处理、协议解析等,可以专注于业务逻辑的实现。也正是因为如此,在学习 Netty 时比较抽象难懂 。

下面对比一下 Java NIO 实现的简单的服务端和 Netty 实现的 HTTP 服务端,如下图,可以看到 Java NIO 的代码大概有 80 行,而且还没有实现 HTTP 协议,并且还是单线程,没有复杂的线程管理,更不用说性能什么的,而 Netty 实现的代码只有 30 多行,其中的差别一目了然。
Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程

粘包和拆包

我们一般说粘包和拆包都是说 TCP 协议的问题,因为当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,所以发送出去的一条 UDP 报文就是完整的用户消息,也就是每个 UDP 报文就是用户消息的边界。而当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文进行传输,这个时候接收方收到多个报文后,由于不知道消息的边界,也就无法读出一个有效的用户消息。

举个例子,当发送方准备发送 「Hi」和「I am Erdan」这两个消息,由于MTU限制、缓冲区的大小等条件,可能会出现几种情况:

第一种情况,两条消息分到一个报文中,像这样:
Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程
第二种情况,「I am Erdan」中的部分消息随「Hi」被分到一个报文中,像这样:
Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程
还可能会有第三、四…种情况,而当接收方接收到第一种情况时我们称之为粘包,第二种情况称之为拆包。并且上面的种种情况可以表明不能认为一个用户消息对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议。

解决粘包和拆包的根本手段就是找出消息的边界,有几种方式:

  • 固定消息长度,这种方式灵活性不高,实际中很少用。
  • 特殊字符作为边界,HTTP 是一个非常好的例子,通过设置回车符、换行符作为 HTTP 报文协议的边界。Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程
  • 自定义消息结构:消息头消息体,可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。

而 Netty 提供了固定长度解码器(FixedLengthFrameDecoder行分隔符解码器(LineBasedFrameDecoder分隔符解码器(DelimiterBasedFrameDecoder、**基于长度字段的解码器(LengthFieldBasedFrameDecoder)**几种方式来解决粘包问题,可以结合 Netty 的 ChannelPipeline 来使用。

除此之外 Netty 也提供了 HTTP、WebSocket、TCP、UDP几种协议的编解码器,这也是 Netty 灵活扩展强大之处。

高性能的设计

Netty 除了帮助开发人员解决了一些问题,还提高了网络编程性能,体现如下:

多线程调度

在网络编程中如果使用单线程来处理,即便是IO多路复用,吞吐和性能也是会有局限的。而 Netty 中通过 EventLoopGroup 管理线程池,每个线程就是一个 EventLoop,而 EventLoop 内部有一个 Selector 负责处理一个或多个 Channel 的注册、读写和其他事件。所以 Netty 通过 EventLoopGroupEventLoopSelector 的配合工作,实现了高效的并发处理能力。
Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程

既然是多线程处理,肯定要去考虑线程安全以确保程序的正确性。而 Netty 是如何保障线程安全的?Netty 通过使用管道(ChannelPipeline)和处理器(ChannelHandler)的方式来实现数据的处理和流转,而 ChannelHandler 会被分配给一个 EventLoop 处理,而 EventLoop 内部的数据结构和状态都是线程封闭的,不会被其他线程访问或修改。所以 Netty 通过合理地设计组件之间的关系,通过单线程执行、无锁设计等方式保证了在高并发情况下的线程安全性。

零拷贝

在传统的网络编程中,数据在进行网络传输之前需要从应用层缓冲区复制到操作系统内核的缓冲区,然后再从内核的缓冲区复制到网络设备的缓冲区。这种复制操作会增加 CPU 的负载和内存的开销,如下图
Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程

而 Netty 利用零拷贝技术来减少数据复制的次数,提高了数据传输的效率。零拷贝通过将数据从内核空间直接传输到网络适配器,避免了数据在内核空间和用户空间之间的复制,从而减少了CPU的负担。

Netty为什么高效,为什么这么受欢迎?,Java,java,开发语言,网络编程
具体体现在以下几个方面:

  • 零拷贝文件传输:Netty 的 FileRegion 接口提供了直接在文件系统和网络之间传输数据的功能。通过使用零拷贝技术,数据可以直接从磁盘读取并发送到网络设备,避免了中间的缓冲区拷贝,提高了文件传输的性能。

  • 零拷贝内存传输:Netty 的 ByteBuf 类型支持零拷贝的内存传输。当数据在应用程序和内核之间传输时,Netty 使用直接内存缓冲区(Direct ByteBuffer)来避免额外的数据拷贝操作,提高了内存传输的效率。

通过以上方式,Netty 实现了零拷贝技术在网络编程中的应用,提高了数据传输的效率和性能。这使得 Netty 在处理大量数据传输和高并发场景下具有更好的性能表现。

总结

总的来说,Netty 不论在功能、性能以及稳定性来讲都是一款很nice的网络编程框架,很多知名的项目都将 Netty 作为其网络通信的底层框架,比如Apache Kafka、Elasticsearch、gRPC、Dubbo等。熟悉这些框架的开发者通常都具备高并发开发经验,并且掌握 Netty 是理解这些框架的重要基础之一。文章来源地址https://www.toymoban.com/news/detail-662854.html

到了这里,关于Netty为什么高效,为什么这么受欢迎?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka为什么这么快?

    Kafka 是一个基于发布-订阅模式的消息系统,它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率,即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢?本文将从七个方面来分析 Kafka 的速度优势。 零拷贝技术 仅可追加

    2024年02月11日
    浏览(48)
  • AIGC技术到底是什么?为什么这么火热?

    AIGC(Artificial Intelligence in Game Creation)技术是指 利用人工智能技术来辅助游戏创作的过程 。 它可以通过机器学习、深度学习和自然语言处理等技术,从大量的游戏数据中提取规律和模式,进而生成游戏的内容、关卡设计、角色行为等元素。   AIGC技术可以帮助游戏开发者快速

    2024年02月13日
    浏览(47)
  • 职场工作多年,为什么成长这么慢

    在职场工作多年,却没有成长,是许多人都会遇到的问题。这种情况可能让人感到沮丧和无助,但是它的根本原因是什么呢?在本文中,我们将探讨为什么会出现这种情况,以及如何克服这种困境。 成长需要我们对自己的能力和表现进行评估和反思。如果没有对自己的工作进

    2023年04月16日
    浏览(52)
  • 48 | DMA:为什么Kafka这么快?

    过去几年里,整个计算机产业界,都在尝试不停地提升 I/O 设备的速度。把 HDD 硬盘换成 SSD 硬盘,我们仍然觉得不够快;用 PCI Express 接口的 SSD 硬盘替代 SATA 接口的 SSD 硬盘,我们还是觉得不够快,所以,现在就有了傲腾(Optane)这样的技术。 但是,无论 I/O 速度如何提升,

    2024年02月21日
    浏览(49)
  • 为什么这么设计—— Go的GC

    Go语言采用了3色标记清理法来对内存进行自动垃圾回收, 过程是这样的: (1)起初所有的对象都是白色的; (2)从根对象出发扫描所有可达对象,标记为灰色,放入待处理队列; (3)从待处理队列中取出灰色对象,将其引用的对象标记为灰色并放入待处理队列中,自身标

    2024年02月12日
    浏览(50)
  • 为什么现在原生家庭的问题这么严重?

    匿名用户 191 人赞同了该回答 换一个玄学的角度来看这个问题,之前看b站,有一个up主说,中国有历史记载的人口数一直都很稳定,7-8千万到1亿左右,明朝2亿,清朝到民国算是增长比较多的,有4亿,但是从开国到现在增长了10亿,从轮回的角度来讲,哪来那么多的人来转世

    2024年02月13日
    浏览(66)
  • 玩转Discord:为什么它这么吸引加密社区?

        Twitter、Telegram、Discord,目前加密货币项目和社区必备的三件套,其重要程度堪比国内所说的“两微一抖(微博、微信和抖音)”。 Twitter和Telegram国内的用户还算了解,Discord相对来说就比较陌生了,但是近一年以来,随着国内社交平台的审查收紧,NFT、DAO的盛行,Discor

    2024年02月04日
    浏览(50)
  • 记录--强制缓存这么暴力,为什么不使用协商缓存

    前段时间在看面经的时候,发现很多份面经中都被问到了 强缓存 和 协商缓存 。因此我觉得有必要写一篇文章来好好聊聊这两者。 浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档,其中浏览

    2024年02月10日
    浏览(47)
  • 为什么C++这么复杂还不被淘汰?

    C++是一门广泛使用的编程语言,主要用于系统和应用程序的开发。尽管C++具有一些复杂的语法和概念,但它仍然是编程界的重量级选手,在编程语言排行榜中一直位居前列。 为什么C++这么复杂还不被淘汰呢? C++有以下优势 1、C++具有高性能 C++是一门编译型语言,可以直接编

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包