Netty事件監聽和處理(上)

 

陪產假結束了,今天又開始正常上班了,正好遇上米粉節活動,又要忙上一陣了,米粉節活動時間爲4.03 - 4.10,有很多優惠,感興趣的能夠關注mi.com或小米商城app。java

今天給你們送了福利:小愛音箱F碼,聽說賣的比較好,不太好搶到,藉着此次公司福利,分享給你們,以表你們的支持和鼓勵。編程

掘金的運營真的很貼心,主動找到我說:個人福利文章不是技術型文章,不能推送到信息流,只能在我的主頁看到,爲了讓更多的人蔘與此次抽取,建議寫一篇技術文章,末尾加上送福利的內容。再次感謝掘金運營小哥「刺客」的貼心和建議。安全

RabbitMQ實戰的後續章節還沒來得及看,這篇就總結下以前在項目組分享過的技術點:Netty事件監聽和處理。服務器

經過介紹,你會了解到:微信

  • 事件監聽、NIO、線程模型等相關概念;
  • Netty整體結構;
  • 事件監聽和處理;
  • 項目實踐總結;

本篇先介紹下前兩節,下一篇介紹後兩節。markdown

本篇最後會說明下福利的抽取規則,你們積極參與 >_<網絡

相關概念

Netty是一個NIO框架,它將IO通道的創建、可讀、可寫等狀態變化,抽象成事件,以責任鏈的方式進行傳遞,能夠在處理鏈上插入自定義的Handler,對感興趣的事件進行監聽和處理。app

因此,先介紹下事件監聽、責任鏈模型、socket接口和IO模型、線程模型等基本概念,對後面理解Netty的事件監聽和處理有很大幫助。框架

事件監聽

JDK監聽器模式主要包含如下元素:異步

  • EventObject 事件對象
  • EventListener 事件監聽接口
  • 自定義事件源
  • 事件觸發

模式很簡單,用戶能夠自定義事件源,保存觸發對象的相關數據,事件被觸發後,傳遞給註冊事件的處理者。事件監聽接口是爲了統一處理者方法。

舉個比較好理解的按鈕單擊事件,其中ActionListener是事件監聽器,ActionEvent是事件對象,包含了事件源:

實現一套事件監聽的具體過程:

  • 肯定事件源;
  • 明確可能產生的事件,定義成不一樣的事件對象或事件方法;
  • 提供一個存儲結構,用於保存監聽事件的對象,當事件發生時,會通知監聽者;
  • 執行回調方法,進行業務處理;

事件監聽

責任鏈模式

主要是說事件處理者的組織方式,經過責任鏈模式,能夠在任何處理節點,添加自定義處理器,很方便。

關於責任鏈概念,這裏再簡單說下:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係,將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理他爲止。

責任鏈模式

socket

通常說NIO,主要是針對網絡IO,從網卡中讀取數據,向網卡中寫入數據,這就是監聽器模式的數據源。

網絡編程主要經過操做系統提供的socket接口進行,經過了解socket接口能夠總結出有哪些事件。

socket是用戶進程和內核網絡協議之間的統一接口。
socket也是一種特殊的文件,網絡通訊能夠看做是對文件的讀取,使得對網絡的控制和對文件的控制同樣方便。

sokcet接口

NIO和IO模型

NIO是指非阻塞IO,咱們通常說的IO都是阻塞IO,想全面瞭解這些概念,又會說的不少,這裏就簡單歸納下。

一個進程所佔的內存包括用戶態和內核態,爲了安全,用戶代碼是不能直接操做內核態內存的,經過系統調用進行交互,好比讀取網絡數據,交互過程以下:

同步阻塞

用戶線程發起read請求後,須要等待數據到達才能返回,在這期間,用戶線程不能作任何事情,若是是網絡編程,可能有不少Socket對象進行監聽,會建立大量線程被阻塞,形成資源浪費,性能降低。

針對這種狀況,出現了IO模型的概念,有幾種方式:

  • 同步非阻塞IO;
  • IO多路複用;
  • 異步IO;

具體介紹,網上有不少資料,就不詳細說了,這裏只提下IO多路複用,說說個人理解,咱們項目中就是使用這種方式。

所謂多路複用,主要是操做系統提供給咱們這種開發模式:能夠把感興趣的IO事件(創建、可讀、可寫等)提早註冊,並且多個socket對象能夠註冊到一個selector選擇器上,這樣就能夠多個socket對象使用一個用戶線程進行監聽,當事件發生時,會查找對應的socket進行讀、寫等操做。

以前作過NIO開發的朋友,能夠看下面的示例回顧下整個過程:

java NIO示例

線程模型

上面說了我對多路複用的理解,提到了一個線程監聽多個socket,但若是socket不少,一個線程是處理不過來的。另外,事件的接收和判斷 與 數據的讀取、處理、寫入,能夠在不一樣線程進行。

這就引出了線程模型的概念,好比Reactor和Proactor模型,具體細節就不介紹了,網上有不少資料,最終目的都是爲了提升IO事件處理的性能。

Netty整體結構

這部分主要是瞭解下Netty,對其實現原理先不作深究。

概述

Netty 是一個異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端;
它駕馭了 Java 高級 API 的能力,並將其隱藏在一個易於使用的 API 以後;

Netty整體結構

  • Core(核心部分),是底層的網絡通信的一些通用抽象,這部份內容是關鍵。
  • Transport Services(傳輸服務),具體的網絡傳輸能力的定義以及一些實現。
  • Protocol Support(協議支持),netty 對於一些通用協議的編碼解碼實現。
零拷貝

廣義的零拷貝是指計算機操做的過程當中,CPU不須要爲數據在內存之間的拷貝消耗資源。Linux中的sendfile()以及 Java NIO 中的FileChannel.transferTo()方法都實現了零拷貝的功能,而在 Netty 中也經過在FileRegion中包裝了 NIO 的FileChannel.transferTo()方法實現了零拷貝。

Netty中所指零拷貝,徹底在用戶態,更偏向於優化數據操做。Netty容許咱們將多段數據合併爲一整段虛擬數據供用戶使用,而不須要對數據進行拷貝操做。

Netty零拷貝

統一的通信模型

傳統的JAVA IO API 在應對不一樣的傳輸協議時,須要使用不一樣的類型和方法,例如:java.net.Socket和java.net.DatagramSocket,它們並不具備相同的超類型;Java新的IO API與原有的阻塞式IO API也不兼容;

Netty提供了統一的API編程接口,抽象了全部點對點通訊操做,僅調整幾行代碼,即可切換不一樣的傳輸實現:

  • 基於NIO的TCP/IP傳輸
  • 基於OIO的TCP/IP傳輸
  • 基於OIO的UDP/IP傳輸
  • 本地傳輸
事件模型

也就是要說的事件監聽和處理,提供了很好的方式去處理各類事件。

Netty事件模型

大體處理過程如上圖,具體將在下一篇介紹。


福利說明

最後,說下福利:小愛音箱F碼。

準備了2份,主要爲了感謝「微信公衆號」和「掘金社區」的朋友,每一份包括1個小愛音箱F碼和1個小愛音箱 mini F碼。

小米手機F碼源自於英文單詞」Friend」,是小米公司提供給小米核心用戶及爲小米作出貢獻的網友的優先購買權,若是您有小米F碼的話無需等待便可直接利用小米F碼購買相關產品!

簡單來講,F碼就是不用搶了,能夠直接購買 ~

抽獎截止時間

4月9號中午12點

抽獎規則
掘金社區
  • 須要關注個人掘金帳號纔有效,我的主頁

  • 使用微信抽獎助手隨機抽取for掘金社區;
    掘金抽獎

微信公衆號
  • 須要關注個人微信公衆號纔有效;
    情情說

  • 使用微信抽獎助手隨機抽取for微信公衆號;
    微信公衆號抽獎

相關文章
相關標籤/搜索