最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Netty——網(wǎng)絡(luò)編程的演變

2023-03-18 15:37 作者:柳夢(mèng)磊  | 我要投稿

本系列文章,將深入探討Netty框架在網(wǎng)絡(luò)通信中的應(yīng)用,以及Netty框架如何實(shí)現(xiàn)高效的網(wǎng)絡(luò)通信。希望通過這次的輸出,能夠進(jìn)一步加深自己對(duì)網(wǎng)絡(luò)通信以及Netty這一塊的理解,從而為網(wǎng)絡(luò)應(yīng)用的開發(fā)提供更多的支持。

網(wǎng)絡(luò)通信從最初的傳輸控制協(xié)議(TCP)到現(xiàn)在的應(yīng)用層協(xié)議(HTTP),經(jīng)歷了多個(gè)階段的發(fā)展。在每一個(gè)階段,都有一些新的技術(shù)被提出來,來改善網(wǎng)絡(luò)傳輸?shù)男屎涂煽啃?。在傳輸控制協(xié)議(TCP)階段,技術(shù)有擁塞控制,流量控制,滑動(dòng)窗口協(xié)議等等;在應(yīng)用層協(xié)議(HTTP)階段,技術(shù)有HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0等等。這些技術(shù)的出現(xiàn),都是為了提高網(wǎng)絡(luò)傳輸?shù)男屎涂煽啃?,以滿足不同的應(yīng)用場景。

此外,在網(wǎng)絡(luò)通信的發(fā)展過程中,Netty這一框架也發(fā)揮了重要的作用。Netty是一個(gè)異步的,基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,它支持多種傳輸協(xié)議,可以實(shí)現(xiàn)快速的網(wǎng)絡(luò)通信。Netty的出現(xiàn),大大提高了網(wǎng)絡(luò)通信的效率,使得網(wǎng)絡(luò)應(yīng)用變得更加簡單,更加可靠。他們兩個(gè)的共同點(diǎn)就是朝著更好的支持多連接的方向發(fā)展,只不過前者是在通信協(xié)議層面,而Netty則主要是在服務(wù)端。

一、網(wǎng)絡(luò)通信協(xié)議

TCP協(xié)議概述


在網(wǎng)絡(luò)通信過程中,理解“鏈接”和“字節(jié)流”是非常重要的。為了持續(xù)發(fā)送消息,需要建立一個(gè)類似管道的鏈接,消息就以字節(jié)流的形式發(fā)送出去,這就是網(wǎng)絡(luò)通信中“鏈接”和“字節(jié)流”的概念?,F(xiàn)在最常見的HTTP和HTTPS都是基于它們而來的,但是這并不代表這就是最佳的組合,因此HTTP協(xié)議也在不斷發(fā)展,以完善其不足。

在HTTP1.0中,雖然通過維護(hù)FIFO隊(duì)列來支持連接復(fù)用的技術(shù),但默認(rèn)是不開啟的,因此建立一個(gè)通信連接時(shí)只能支持一個(gè)消息流的發(fā)送,這時(shí)對(duì)大文件的傳輸更加友好,因此出現(xiàn)了諸如雅虎23的優(yōu)化原則。在此版本中,持久連接與即時(shí)壓縮只能夠二選一,這是因?yàn)椋?/p>

如果你想標(biāo)記一個(gè)消息發(fā)送完畢,你可以采取兩種方法:斷開鏈接或者提前告知文件的大小。然而,由于當(dāng)時(shí)還沒有第三種方法,所以這兩種方法就不可兼得,因此只能選擇其中一種來提升性能。

HTTP1.1的發(fā)展使得客戶端和服務(wù)端之間的傳輸能夠同時(shí)支持持久連接和壓縮功能,它采用了分塊編碼的思路,從而實(shí)現(xiàn)了鏈接復(fù)用。然而,消息的傳輸仍然是串行的,這就導(dǎo)致了首隊(duì)列等待問題。為了緩解這一問題,后邊進(jìn)行了一定程度的優(yōu)化,變?yōu)榉?wù)端的首隊(duì)列等待,因?yàn)榉?wù)端可以更好的評(píng)估一個(gè)消息流需要的性能與消耗的時(shí)間,但還是無法徹底解決問題。

正文: 在HTTP2.0時(shí)代,消息傳輸?shù)淖钚挝粡逆溄舆M(jìn)化到幀,徹底解決了首部阻塞問題。在這個(gè)時(shí)代,一個(gè)鏈接中的多個(gè)消息可以進(jìn)行交叉?zhèn)鬏?,因此HTTP1.0時(shí)代的雅虎21條原則也不再適用。HTTP2.0更好地支持小文件傳輸,甚至更擅長小文件傳輸。這主要是基于兩點(diǎn):

1、為了減小Header的傳輸壓力對(duì)頭采用了基于字典的信息復(fù)用,從一定程度上來說請(qǐng)求越多它的壓縮效果也就越好

2、如果要是發(fā)送的過程中有消息中的一個(gè)幀傳送出現(xiàn)了問題,會(huì)影響這個(gè)鏈接中所有的消息傳送,甚至?xí)鹬貍?。換個(gè)角度說就是傳遞小的就算失敗了他返工也沒有那么大呀!

HTTP與TCP的結(jié)合并不一定是最完美的,因?yàn)樗鼈兪遣煌瑢哟蔚膮f(xié)議,也是一代早期的協(xié)議,存在一定的時(shí)代局限性。此外,這也不一定是唯一的選擇,我們可以選擇替代它們。這就有了UDP協(xié)議族的出現(xiàn),目前官方主推的是谷歌的QUIC,它提出了鏈接標(biāo)識(shí)符的概念,不再依賴于IP地址,可以很好地支持移動(dòng)設(shè)備的連接。也就是說,當(dāng)我們?cè)赪i-Fi或無線網(wǎng)絡(luò)環(huán)境中,不需要因?yàn)楦鼡QWi-Fi就需要重新經(jīng)歷“一輪四次握手告別,三次握手重連”的過程,那么以后我們?cè)诟哞F上的網(wǎng)速會(huì)不會(huì)變快呢?哈哈,如果是坐水平火箭,效果會(huì)更加顯著吧?此外,它還可以對(duì)每個(gè)流進(jìn)行單獨(dú)控制,即使一個(gè)流出現(xiàn)錯(cuò)誤,協(xié)議棧仍然可以獨(dú)立地為其他流提供服務(wù),這時(shí)候就可以說它對(duì)小文件和大文件的支持都很友好了。同時(shí),它也更好地分離了四層協(xié)議和七層協(xié)議的職責(zé)。

二、初代通信框架Socket與BIO編程


BIO線程模型與Socket接口


在右邊這張圖中,這就是初代網(wǎng)絡(luò)編程的一個(gè)常見接口,不只是Java語言。此時(shí)Java中的就是BIO編程,可以稱之為阻塞編程,每一個(gè)連接進(jìn)來我們都需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的線程來為其服務(wù),在前面“字節(jié)流”我們知道消息并不是一下發(fā)過來的,所以在讀取消息的過程中一定存在一個(gè)等待,這個(gè)等待就是一個(gè)阻塞。線程是計(jì)算機(jī)的稀缺資源,頻繁的創(chuàng)建和銷毀機(jī)器也吃不消。如果小時(shí)并發(fā)量小還好說,但是面對(duì)高并發(fā)的時(shí)候就無能為力了。這時(shí)候的主要問題是線程多,從而造成的創(chuàng)建和銷毀帶來的資源消耗,以及頻繁的上下文切換帶來的問題。此時(shí)NIO出現(xiàn)了,它來了!

三、非阻塞NIO

NIO啟動(dòng)流程與模型

NIO中最重要的三個(gè)元素是Selector、Channel和Buffer。Selector作為選擇器,監(jiān)聽網(wǎng)絡(luò)事件,主要是連接、讀、寫。每一個(gè)請(qǐng)求過來的鏈接都會(huì)成為一個(gè)Channel,但需要正確處理。在BIO中,由于消息不是一下子到來的,所以在消息讀取處理時(shí)會(huì)阻塞,如果有100個(gè)請(qǐng)求,就相當(dāng)于有100個(gè)線程不斷觀察是否有需要讀寫的數(shù)據(jù),這樣就有100個(gè)阻塞的線程。Selector將監(jiān)聽的工作拿過來,如果監(jiān)聽到有需要處理的事件,就交給相關(guān)的線程處理,而Selector則專門負(fù)責(zé)監(jiān)聽,這樣可以提高效率。消息不總是能夠立即被處理,所以Buffer用來進(jìn)行消息緩沖。

發(fā)展到NIO已經(jīng)解決了我們?cè)贐IO中遇到的最大痛點(diǎn),線程創(chuàng)建過多。但是這時(shí)候完全手動(dòng)編程的難度有些太高了,開發(fā)人員要熟悉Java多線程編程,因?yàn)镹IO編程涉及到Reactor模式,你必須對(duì)多線程和網(wǎng)絡(luò)編程非常熟悉,才能編寫出高質(zhì)量的NIO程序。此外,我們還需要處理一些更為復(fù)雜的問題:例如客戶端面臨斷連重連、網(wǎng)絡(luò)閃斷、半包讀寫、失敗緩存、網(wǎng)絡(luò)擁塞和異常流的處理等等。還有接口本身的一些臭名昭著的Bug,比如Epoll Bug,它會(huì)導(dǎo)致Selector的空輪訓(xùn),最終導(dǎo)致CPU 100%。由于編程復(fù)雜性,使用原生NIO往往也會(huì)造成網(wǎng)絡(luò)通信層面與業(yè)務(wù)上的強(qiáng)耦合,而這不是優(yōu)秀代碼應(yīng)該有的樣子。這時(shí)候就需要一個(gè)性能好、上手簡單的網(wǎng)絡(luò)通信框架,那么它就是我們這一系列文章的主角Netty!

~~~~~~愈看后事如何,且聽下回講解~~~~~~


Netty——網(wǎng)絡(luò)編程的演變的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
酒泉市| 睢宁县| 德令哈市| 马山县| 霍林郭勒市| 色达县| 富平县| 绍兴市| 五家渠市| 蒙山县| 蕲春县| 吉水县| 庆城县| 榆林市| 海淀区| 黄浦区| 东兰县| 竹溪县| 井冈山市| 当雄县| 富川| 永嘉县| 台山市| 信丰县| 西乌珠穆沁旗| 宜川县| 邯郸县| 崇文区| 临西县| 南开区| 望谟县| 呼玛县| 册亨县| 潞西市| 宁安市| 阳东县| 长兴县| 宝山区| 扎鲁特旗| 沾化县| 客服|