Netty-簡(jiǎn)介

Netty-簡(jiǎn)介

Netty是一個(gè)NIO client-server框架婚被,可以快速和簡(jiǎn)單的開發(fā)網(wǎng)絡(luò)應(yīng)用程序稳析,比如協(xié)議服務(wù)器服務(wù)器和客戶端洗做。Netty向你提供了一種新的方式開發(fā)你的網(wǎng)絡(luò)應(yīng)用程序,使得它簡(jiǎn)單和可擴(kuò)展彰居。它通過這樣的方式實(shí)現(xiàn):抽象出所涉及的復(fù)雜性和通過提供一種簡(jiǎn)單易用的API诚纸,這個(gè)將業(yè)務(wù)邏輯從網(wǎng)絡(luò)處理代碼中解耦出來。因?yàn)樗菫镹IO構(gòu)建,所有的Netty API都是異步的.


不選擇Java原生NIO編程的原因

為什么不建議開發(fā)者直接使用 JDK 的 NIO 類庫(kù)進(jìn)行開發(fā), 具體原因如下陈惰。

  1. NIO的類庫(kù)和API繁雜,使用麻煩,你需要熟練掌握Selector畦徘、 ServerSocketChannel、SocketChannel抬闯、ByteBuffer等井辆。
  2. 需要具備其他的額外技能做鋪墊,例如熟悉Java多線程編程。這是因?yàn)?NIO編程涉及到Reactor模式,你必須對(duì)多線程和網(wǎng)路編程非常熟悉,才能 編寫出高質(zhì)量的NIO程序溶握。
  3. 可靠性靠能力補(bǔ)齊,工作量和難度都非常大杯缺。例如客戶端面臨斷連重連、網(wǎng) 絡(luò)閃斷睡榆、半包讀寫夺谁、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等問題,NIO 編程的特點(diǎn)是功能開發(fā)相對(duì)容易,但是可靠性能力補(bǔ)齊的工作量和難度都 非常大肉微。
  4. JDK NIO的BUG,例如臭名昭著的epoll bug,它會(huì)導(dǎo)致Selector空輪詢, 最終導(dǎo)致CPU 100%。官方聲稱在JDK1.6版本的update18修復(fù)了該問題,但 是直到JDK1.7版本該問題仍舊存在,只不過該BUG發(fā)生概率降低了一些而 已,它并沒有被根本解決蜡塌。該BUG以及與該BUG相關(guān)的問題單可以參見以下 鏈接內(nèi)容碉纳。

選擇Netty的理由

Netty 是業(yè)界最流行的 NIO 框架之一,它的健壯性、功能馏艾、性能劳曹、可定制性 和可擴(kuò)展性在同類框架中都是首屈一指的,它已經(jīng)得到成百上千的商用項(xiàng)目驗(yàn)證, 例如 Hadoop 的 RPC 框架 avro 使用 Netty 作為底層通信框架;很多其他業(yè)界主流 的 RPC 框架,也使用 Netty 來構(gòu)建高性能的異步通信能力奴愉。

通過對(duì) Netty 的分析,我們將它的優(yōu)點(diǎn)總結(jié)如下 :

  • API使用簡(jiǎn)單,開發(fā)門檻低;
  • 功能強(qiáng)大,預(yù)置了多種編解碼功能,支持多種主流協(xié)議;
  • 定制能力強(qiáng),可以通過ChannelHandler對(duì)通信框架進(jìn)行靈活地?cái)U(kuò)展;
  • 性能高,通過與其他業(yè)界主流的NIO框架對(duì)比,Netty的綜合性能最優(yōu);
  • 成熟、穩(wěn)定,Netty修復(fù)了已經(jīng)發(fā)現(xiàn)的所有JDK NIO BUG,業(yè)務(wù)開發(fā)人員不需要再為NIO的BUG而煩惱;
  • 社區(qū)活躍,版本迭代周期短,發(fā)現(xiàn)的BUG可以被及時(shí)修復(fù),同時(shí),更多的新功能會(huì)加入;
  • 經(jīng)歷了大規(guī)模的商業(yè)應(yīng)用考驗(yàn),質(zhì)量得到驗(yàn)證铁孵。在互聯(lián)網(wǎng)锭硼、大數(shù)據(jù)、網(wǎng)絡(luò)游戲蜕劝、企業(yè)應(yīng)用檀头、電信軟件等眾多行業(yè)得到成功商用,證明了它已經(jīng)完全能夠滿足不同行業(yè)的商業(yè)應(yīng)用了。

正是因?yàn)檫@些優(yōu)點(diǎn),Netty 逐漸成為 Java NIO 編程的首選框架岖沛。

Netty架構(gòu)

異步設(shè)計(jì)

異步設(shè)計(jì)并不是什么新鮮玩意暑始,異步的思想已經(jīng)很廣泛。現(xiàn)今I/O處理往往會(huì)成為系統(tǒng)的瓶頸所在婴削,異步處理顯得尤為重要廊镜。但是不同的異步模式之間是有很多區(qū)別的,我們需要弄清楚這些模式背后的規(guī)則唉俗。

異步是指在應(yīng)用處理當(dāng)前任務(wù)的同時(shí)嗤朴,可以新建一個(gè)任務(wù)處理一些其他的事情,然后在事情處理完成時(shí)再獲取通知虫溜,而不是等待雹姊。這種方式使資源利用更加有效。

Callback 回調(diào)模式

Example

public interface Fetcher {
       void fetchData(FetchCallback callback);
}

public interface FetchCallback {
       void onData(Data data);
       void onError(Throwable cause);
}

public class Worker {
    public void doWork() {
        Fetcher fetcher = ...
        fetcher.fetchData(new FetchCallback() {
           @Override
           public void onData(Data data) {                             #1
               System.out.println("Data received: " + data);
           }
           
           @Override
           public void onError(Throwable cause) {                      #2
               System.err.println("An error accour: " + cause.getMessage());
           }
        });
... }
}
  • 回調(diào)接口FetchCallback
  • Fetcher.fetchData(FetchCallback) 接收一個(gè)回調(diào)對(duì)象吼渡,這樣我們可以將執(zhí)行邏輯從回調(diào)者所在線程轉(zhuǎn)移到其他線程容为。

Future

java.util.concurrent.Future對(duì)象在任務(wù)正常時(shí)可以持有執(zhí)行結(jié)果,在任務(wù)異常時(shí)可以持有執(zhí)行的異常寺酪。

Example

ExecutorService executor = Executors.newCachedThreadPool();
Runnable task1 = new Runnable() {
    @Override
       public void run() {
           doSomeHeavyWork();
       }
    ... 
}
   
Callable<Interger> task2 = new Callable() {
    @Override
    public Integer call() {
        return doSomeHeavyWorkWithResul();
       }
    ... 
}
   
Future<?> future1 = executor.submit(task1);
Future<Integer> future2 = executor.submit(task2);
while (!future1.isDone() || !future2.isDone()) {
    ...
    // do something else
    ...
}

兩種方式各有利弊:Callback的方式好處在于坎背,當(dāng)任務(wù)完成后會(huì)自動(dòng)回調(diào)定義的回調(diào)接口,F(xiàn)uture方式需要額外的檢測(cè)寄雀;但是這樣的編碼風(fēng)格可讀性比較差得滤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盒犹,隨后出現(xiàn)的幾起案子懂更,更是在濱河造成了極大的恐慌,老刑警劉巖急膀,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮协,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡卓嫂,警方通過查閱死者的電腦和手機(jī)慷暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晨雳,“玉大人行瑞,你說我怎么就攤上這事奸腺。” “怎么了血久?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵突照,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我氧吐,道長(zhǎng)讹蘑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任副砍,我火速辦了婚禮衔肢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豁翎。我一直安慰自己角骤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布心剥。 她就那樣靜靜地躺著邦尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪优烧。 梳的紋絲不亂的頭發(fā)上蝉揍,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音畦娄,去河邊找鬼又沾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛熙卡,可吹牛的內(nèi)容都是我干的杖刷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驳癌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼滑燃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颓鲜,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤表窘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甜滨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乐严,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年衣摩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麦备。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凛篙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栏渺,我是刑警寧澤呛梆,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站磕诊,受9級(jí)特大地震影響填物,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霎终,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一滞磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莱褒,春花似錦击困、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谅海,卻和暖如春脸哀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扭吁。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工撞蜂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侥袜。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓蝌诡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親系馆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子送漠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容