文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Netty:我为啥这么受欢迎你们不知道吗?

2024-11-30 00:33

关注

Netty 解决的问题

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

简化网络编程

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

如下图,可以看到 Java NIO 的代码大概有 80 行,而且还没有实现 HTTP 协议,并且还是单线程,没有复杂的线程管理,更不用说性能什么的。

而 Netty 实现的代码只有 30 多行,其中的差别一目了然。

图片

粘包和拆包

我们一般说粘包和拆包都是说 TCP 协议的问题,因为当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,所以发送出去的一条 UDP 报文就是完整的用户消息,也就是每个 UDP 报文就是用户消息的边界。

而当用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文进行传输,这个时候接收方收到多个报文后,由于不知道消息的边界,也就无法读出一个完整的消息。

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

第一种情况,两条消息分到一个报文中,像这样:

图片

第二种情况,「I am Erdan」中的部分消息随「Hi」被分到一个报文中,像这样:

图片

还可能会有第三、四...种情况。

当接收方接收到第一种情况时我们称之为粘包,第二种情况称之为拆包。

上面的种种情况表明,一个用户消息不能对应一个 TCP 报文,正因为这样,所以 TCP 是面向字节流的协议。

粘包和拆包解决手段

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

图片

HTTP格式

Netty的编解码器

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

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

高性能的设计

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

多线程调度

在网络编程中如果使用单线程来处理,即便是IO多路复用,吞吐和性能也是会有局限的。

而 Netty 中通过 EventLoopGroup 管理线程池,每个线程就是一个 EventLoop。EventLoop 内部有一个 Selector 负责处理一个或多个 Channel 的注册、读写和其他事件。

所以 Netty 通过 EventLoopGroup、EventLoop 和 Selector 的配合工作,实现了高效的并发处理能力。

图片

线程安全保障

既然是多线程处理,肯定要去考虑线程安全以确保程序的正确性。

Netty 是如何保障线程安全的?

Netty 通过使用管道(ChannelPipeline)和处理器(ChannelHandler)的方式来实现数据的处理和流转。而 ChannelHandler 会被分配给一个 EventLoop 处理, EventLoop 内部的数据结构和状态都是线程封闭的,不会被其他线程访问或修改。

所以 Netty 通过合理地设计组件之间的关系,通过单线程执行、无锁设计等方式保证了在高并发情况下的线程安全性。

零拷贝

在传统的网络编程中,数据在进行网络传输之前需要从应用层缓冲区复制到操作系统内核的缓冲区,然后再从内核的缓冲区复制到网络设备的缓冲区。这种复制操作会增加 CPU 的负载和内存的开销,如下图

图片

而 Netty 利用零拷贝技术来减少数据复制的次数,提高了数据传输的效率。

零拷贝将数据从内核空间直接传输到网络适配器,避免了数据在内核空间和用户空间之间的复制,从而减少了CPU的负担。如下图

图片

Netty的零拷贝体现在以下几个方面:

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

总结

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

本文转载自微信公众号「Hi程序员」,可以通过以下二维码关注。转载本文请联系Hi程序员公众号。


来源:Hi程序员内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯