国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Netty為什么高效,為什么這么受歡迎?

這篇具有很好參考價(jià)值的文章主要介紹了Netty為什么高效,為什么這么受歡迎?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

上篇文章通過(guò) Java NIO 的處理流程與 Netty 的總體流程比較,并結(jié)合 Netty 的源碼,可以更加清晰地理解Netty。本文將結(jié)合源碼詳細(xì)解析Netty的高效和強(qiáng)大功能的設(shè)計(jì)原理,學(xué)習(xí) Netty 是如何實(shí)現(xiàn)其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的設(shè)計(jì)思想。

Netty 解決的問(wèn)題

我們先看看使用 Netty 在網(wǎng)絡(luò)編程中幫助我們解決了什么問(wèn)題

簡(jiǎn)化網(wǎng)絡(luò)編程

首先基于 Netty 初次編碼的直觀體驗(yàn)來(lái)講,開(kāi)發(fā)者不用手動(dòng)處理網(wǎng)絡(luò)通信細(xì)節(jié),包括線程管理、I/O 處理、協(xié)議解析等,可以專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。也正是因?yàn)槿绱?,在學(xué)習(xí) Netty 時(shí)比較抽象難懂 。

下面對(duì)比一下 Java NIO 實(shí)現(xiàn)的簡(jiǎn)單的服務(wù)端和 Netty 實(shí)現(xiàn)的 HTTP 服務(wù)端,如下圖,可以看到 Java NIO 的代碼大概有 80 行,而且還沒(méi)有實(shí)現(xiàn) HTTP 協(xié)議,并且還是單線程,沒(méi)有復(fù)雜的線程管理,更不用說(shuō)性能什么的,而 Netty 實(shí)現(xiàn)的代碼只有 30 多行,其中的差別一目了然。
Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程

粘包和拆包

我們一般說(shuō)粘包和拆包都是說(shuō) TCP 協(xié)議的問(wèn)題,因?yàn)楫?dāng)用戶消息通過(guò) UDP 協(xié)議傳輸時(shí),操作系統(tǒng)不會(huì)對(duì)消息進(jìn)行拆分,所以發(fā)送出去的一條 UDP 報(bào)文就是完整的用戶消息,也就是每個(gè) UDP 報(bào)文就是用戶消息的邊界。而當(dāng)用戶消息通過(guò) TCP 協(xié)議傳輸時(shí),消息可能會(huì)被操作系統(tǒng)分組成多個(gè)的 TCP 報(bào)文進(jìn)行傳輸,這個(gè)時(shí)候接收方收到多個(gè)報(bào)文后,由于不知道消息的邊界,也就無(wú)法讀出一個(gè)有效的用戶消息。

舉個(gè)例子,當(dāng)發(fā)送方準(zhǔn)備發(fā)送 「Hi」和「I am Erdan」這兩個(gè)消息,由于MTU限制、緩沖區(qū)的大小等條件,可能會(huì)出現(xiàn)幾種情況:

第一種情況,兩條消息分到一個(gè)報(bào)文中,像這樣:
Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程
第二種情況,「I am Erdan」中的部分消息隨「Hi」被分到一個(gè)報(bào)文中,像這樣:
Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程
還可能會(huì)有第三、四…種情況,而當(dāng)接收方接收到第一種情況時(shí)我們稱之為粘包,第二種情況稱之為拆包。并且上面的種種情況可以表明不能認(rèn)為一個(gè)用戶消息對(duì)應(yīng)一個(gè) TCP 報(bào)文,正因?yàn)檫@樣,所以 TCP 是面向字節(jié)流的協(xié)議。

解決粘包和拆包的根本手段就是找出消息的邊界,有幾種方式:

  • 固定消息長(zhǎng)度,這種方式靈活性不高,實(shí)際中很少用。
  • 特殊字符作為邊界,HTTP 是一個(gè)非常好的例子,通過(guò)設(shè)置回車(chē)符、換行符作為 HTTP 報(bào)文協(xié)議的邊界。Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程
  • 自定義消息結(jié)構(gòu):消息頭消息體,可以自定義一個(gè)消息結(jié)構(gòu),由包頭和數(shù)據(jù)組成,其中包頭包是固定大小的,而且包頭里有一個(gè)字段來(lái)說(shuō)明緊隨其后的數(shù)據(jù)有多大。

而 Netty 提供了固定長(zhǎng)度解碼器(FixedLengthFrameDecoder、行分隔符解碼器(LineBasedFrameDecoder、分隔符解碼器(DelimiterBasedFrameDecoder、**基于長(zhǎng)度字段的解碼器(LengthFieldBasedFrameDecoder)**幾種方式來(lái)解決粘包問(wèn)題,可以結(jié)合 Netty 的 ChannelPipeline 來(lái)使用。

除此之外 Netty 也提供了 HTTP、WebSocket、TCP、UDP幾種協(xié)議的編解碼器,這也是 Netty 靈活擴(kuò)展強(qiáng)大之處。

高性能的設(shè)計(jì)

Netty 除了幫助開(kāi)發(fā)人員解決了一些問(wèn)題,還提高了網(wǎng)絡(luò)編程性能,體現(xiàn)如下:

多線程調(diào)度

在網(wǎng)絡(luò)編程中如果使用單線程來(lái)處理,即便是IO多路復(fù)用,吞吐和性能也是會(huì)有局限的。而 Netty 中通過(guò) EventLoopGroup 管理線程池,每個(gè)線程就是一個(gè) EventLoop,而 EventLoop 內(nèi)部有一個(gè) Selector 負(fù)責(zé)處理一個(gè)或多個(gè) Channel 的注冊(cè)、讀寫(xiě)和其他事件。所以 Netty 通過(guò) EventLoopGroupEventLoopSelector 的配合工作,實(shí)現(xiàn)了高效的并發(fā)處理能力。
Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程

既然是多線程處理,肯定要去考慮線程安全以確保程序的正確性。而 Netty 是如何保障線程安全的?Netty 通過(guò)使用管道(ChannelPipeline)和處理器(ChannelHandler)的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)的處理和流轉(zhuǎn),而 ChannelHandler 會(huì)被分配給一個(gè) EventLoop 處理,而 EventLoop 內(nèi)部的數(shù)據(jù)結(jié)構(gòu)和狀態(tài)都是線程封閉的,不會(huì)被其他線程訪問(wèn)或修改。所以 Netty 通過(guò)合理地設(shè)計(jì)組件之間的關(guān)系,通過(guò)單線程執(zhí)行、無(wú)鎖設(shè)計(jì)等方式保證了在高并發(fā)情況下的線程安全性。

零拷貝

在傳統(tǒng)的網(wǎng)絡(luò)編程中,數(shù)據(jù)在進(jìn)行網(wǎng)絡(luò)傳輸之前需要從應(yīng)用層緩沖區(qū)復(fù)制到操作系統(tǒng)內(nèi)核的緩沖區(qū),然后再?gòu)膬?nèi)核的緩沖區(qū)復(fù)制到網(wǎng)絡(luò)設(shè)備的緩沖區(qū)。這種復(fù)制操作會(huì)增加 CPU 的負(fù)載和內(nèi)存的開(kāi)銷,如下圖
Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程

而 Netty 利用零拷貝技術(shù)來(lái)減少數(shù)據(jù)復(fù)制的次數(shù),提高了數(shù)據(jù)傳輸?shù)男省A憧截愅ㄟ^(guò)將數(shù)據(jù)從內(nèi)核空間直接傳輸?shù)骄W(wǎng)絡(luò)適配器,避免了數(shù)據(jù)在內(nèi)核空間和用戶空間之間的復(fù)制,從而減少了CPU的負(fù)擔(dān)。

Netty為什么高效,為什么這么受歡迎?,Java,java,開(kāi)發(fā)語(yǔ)言,網(wǎng)絡(luò)編程
具體體現(xiàn)在以下幾個(gè)方面:

  • 零拷貝文件傳輸:Netty 的 FileRegion 接口提供了直接在文件系統(tǒng)和網(wǎng)絡(luò)之間傳輸數(shù)據(jù)的功能。通過(guò)使用零拷貝技術(shù),數(shù)據(jù)可以直接從磁盤(pán)讀取并發(fā)送到網(wǎng)絡(luò)設(shè)備,避免了中間的緩沖區(qū)拷貝,提高了文件傳輸?shù)男阅堋?/p>

  • 零拷貝內(nèi)存?zhèn)鬏?/strong>:Netty 的 ByteBuf 類型支持零拷貝的內(nèi)存?zhèn)鬏?。?dāng)數(shù)據(jù)在應(yīng)用程序和內(nèi)核之間傳輸時(shí),Netty 使用直接內(nèi)存緩沖區(qū)(Direct ByteBuffer)來(lái)避免額外的數(shù)據(jù)拷貝操作,提高了內(nèi)存?zhèn)鬏數(shù)男省?/p>

通過(guò)以上方式,Netty 實(shí)現(xiàn)了零拷貝技術(shù)在網(wǎng)絡(luò)編程中的應(yīng)用,提高了數(shù)據(jù)傳輸?shù)男屎托阅?。這使得 Netty 在處理大量數(shù)據(jù)傳輸和高并發(fā)場(chǎng)景下具有更好的性能表現(xiàn)。

總結(jié)

總的來(lái)說(shuō),Netty 不論在功能、性能以及穩(wěn)定性來(lái)講都是一款很nice的網(wǎng)絡(luò)編程框架,很多知名的項(xiàng)目都將 Netty 作為其網(wǎng)絡(luò)通信的底層框架,比如Apache Kafka、Elasticsearch、gRPC、Dubbo等。熟悉這些框架的開(kāi)發(fā)者通常都具備高并發(fā)開(kāi)發(fā)經(jīng)驗(yàn),并且掌握 Netty 是理解這些框架的重要基礎(chǔ)之一。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-662854.html

到了這里,關(guān)于Netty為什么高效,為什么這么受歡迎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Kafka為什么這么快?

    Kafka 是一個(gè)基于發(fā)布-訂閱模式的消息系統(tǒng),它可以在多個(gè)生產(chǎn)者和消費(fèi)者之間傳遞大量的數(shù)據(jù)。Kafka 的一個(gè)顯著特點(diǎn)是它的高吞吐率,即每秒可以處理百萬(wàn)級(jí)別的消息。那么 Kafka 是如何實(shí)現(xiàn)這樣高得性能呢?本文將從七個(gè)方面來(lái)分析 Kafka 的速度優(yōu)勢(shì)。 零拷貝技術(shù) 僅可追加

    2024年02月11日
    瀏覽(26)
  • AIGC技術(shù)到底是什么?為什么這么火熱?

    AIGC技術(shù)到底是什么?為什么這么火熱?

    AIGC(Artificial Intelligence in Game Creation)技術(shù)是指 利用人工智能技術(shù)來(lái)輔助游戲創(chuàng)作的過(guò)程 。 它可以通過(guò)機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和自然語(yǔ)言處理等技術(shù),從大量的游戲數(shù)據(jù)中提取規(guī)律和模式,進(jìn)而生成游戲的內(nèi)容、關(guān)卡設(shè)計(jì)、角色行為等元素。 ? AIGC技術(shù)可以幫助游戲開(kāi)發(fā)者快速

    2024年02月13日
    瀏覽(22)
  • 職場(chǎng)工作多年,為什么成長(zhǎng)這么慢

    在職場(chǎng)工作多年,卻沒(méi)有成長(zhǎng),是許多人都會(huì)遇到的問(wèn)題。這種情況可能讓人感到沮喪和無(wú)助,但是它的根本原因是什么呢?在本文中,我們將探討為什么會(huì)出現(xiàn)這種情況,以及如何克服這種困境。 成長(zhǎng)需要我們對(duì)自己的能力和表現(xiàn)進(jìn)行評(píng)估和反思。如果沒(méi)有對(duì)自己的工作進(jìn)

    2023年04月16日
    瀏覽(32)
  • 為什么這么設(shè)計(jì)—— Go的GC

    Go語(yǔ)言采用了3色標(biāo)記清理法來(lái)對(duì)內(nèi)存進(jìn)行自動(dòng)垃圾回收, 過(guò)程是這樣的: (1)起初所有的對(duì)象都是白色的; (2)從根對(duì)象出發(fā)掃描所有可達(dá)對(duì)象,標(biāo)記為灰色,放入待處理隊(duì)列; (3)從待處理隊(duì)列中取出灰色對(duì)象,將其引用的對(duì)象標(biāo)記為灰色并放入待處理隊(duì)列中,自身標(biāo)

    2024年02月12日
    瀏覽(21)
  • 為什么現(xiàn)在原生家庭的問(wèn)題這么嚴(yán)重?

    匿名用戶 191 人贊同了該回答 換一個(gè)玄學(xué)的角度來(lái)看這個(gè)問(wèn)題,之前看b站,有一個(gè)up主說(shuō),中國(guó)有歷史記載的人口數(shù)一直都很穩(wěn)定,7-8千萬(wàn)到1億左右,明朝2億,清朝到民國(guó)算是增長(zhǎng)比較多的,有4億,但是從開(kāi)國(guó)到現(xiàn)在增長(zhǎng)了10億,從輪回的角度來(lái)講,哪來(lái)那么多的人來(lái)轉(zhuǎn)世

    2024年02月13日
    瀏覽(36)
  • 48 | DMA:為什么Kafka這么快?

    48 | DMA:為什么Kafka這么快?

    過(guò)去幾年里,整個(gè)計(jì)算機(jī)產(chǎn)業(yè)界,都在嘗試不停地提升 I/O 設(shè)備的速度。把 HDD 硬盤(pán)換成 SSD 硬盤(pán),我們?nèi)匀挥X(jué)得不夠快;用 PCI Express 接口的 SSD 硬盤(pán)替代 SATA 接口的 SSD 硬盤(pán),我們還是覺(jué)得不夠快,所以,現(xiàn)在就有了傲騰(Optane)這樣的技術(shù)。 但是,無(wú)論 I/O 速度如何提升,

    2024年02月21日
    瀏覽(16)
  • 玩轉(zhuǎn)Discord:為什么它這么吸引加密社區(qū)?

    玩轉(zhuǎn)Discord:為什么它這么吸引加密社區(qū)?

    ? ? Twitter、Telegram、Discord,目前加密貨幣項(xiàng)目和社區(qū)必備的三件套,其重要程度堪比國(guó)內(nèi)所說(shuō)的“兩微一抖(微博、微信和抖音)”。 Twitter和Telegram國(guó)內(nèi)的用戶還算了解,Discord相對(duì)來(lái)說(shuō)就比較陌生了,但是近一年以來(lái),隨著國(guó)內(nèi)社交平臺(tái)的審查收緊,NFT、DAO的盛行,Discor

    2024年02月04日
    瀏覽(29)
  • 為什么C++這么復(fù)雜還不被淘汰?

    為什么C++這么復(fù)雜還不被淘汰?

    C++是一門(mén)廣泛使用的編程語(yǔ)言,主要用于系統(tǒng)和應(yīng)用程序的開(kāi)發(fā)。盡管C++具有一些復(fù)雜的語(yǔ)法和概念,但它仍然是編程界的重量級(jí)選手,在編程語(yǔ)言排行榜中一直位居前列。 為什么C++這么復(fù)雜還不被淘汰呢? C++有以下優(yōu)勢(shì) 1、C++具有高性能 C++是一門(mén)編譯型語(yǔ)言,可以直接編

    2024年02月05日
    瀏覽(19)
  • ChatGPT是怎么實(shí)現(xiàn)的?為什么它這么有效?

    ChatGPT是怎么實(shí)現(xiàn)的?為什么它這么有效?

    ChatGPT 能夠自動(dòng)生成類似于人類寫(xiě)作的文本,這一點(diǎn)非常引人注目,也令人意外。但它是如何實(shí)現(xiàn)的?為什么它能夠如此出色地生成我們認(rèn)為有意義的文本?我的目的是在這里概述ChatGPT內(nèi)部的運(yùn)行情況,并探討它能夠如此出色地產(chǎn)生有意義文本的原因。 首先需要解釋的是,

    2023年04月26日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包