摘要:的產生原因是使的編程更容易。定義一個異步事件驅動的網絡應用框架,幫助快速開發高性能的客戶端與服務端。每一個一個客戶端請求注冊一個這個會處理這個請求的事件直到這個請求結束。
近日在學習netty,卻發現沒那么容易上手,專研了幾天后算是弄清楚了netty到底是干什么的,所看資料比較多,此文章便把這些資料與我的思考做一個總結幫助大家更好入門。
要更好理解netty首先要了解以下一些前置知識
Blocking I/O ,請看以下Java 網絡編程的一段代碼
public class PlainOioServer { public void serve(int port) throws IOException { final ServerSocket socket = new ServerSocket(port); try { for (;;) { //accept一直阻塞直到獲取一個客戶端,所謂阻塞就是不執行后面代碼,不阻塞就是繼續執行后續代碼 final Socket clientSocket = socket.accept(); System.out.println( "Accepted connection from " + clientSocket); //創建一個新的Thread處理 new Thread(new Runnable() { @Override public void run() { OutputStream out; try { out = clientSocket.getOutputStream(); out.write("Hi! ".getBytes( Charset.forName("UTF-8"))); out.flush(); clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException ex) { // ignore on close } } } }).start(); } } catch (IOException e) { e.printStackTrace(); } } }
當請求很多的時候會為每一個請求創建一個線程,每一個線程都會分配一定的內存,而且這些線程都會阻塞,導致資源利用率低下,這樣的設計一定滿足不了高并發。
Non-blocking I/O ,為了滿足多個請求Java引入了NIO包進行編程,這里得引入幾個名詞
回調(Callback):A方法里有B方法的一個引用,當B方法完成某一條件后可以通知A方法 事件驅動(Event-driven):當一個事件放生時,可以在任何時間響應這個事件
具體代碼就不貼了了,涉及很多類看著頭暈,網上也有很多解析,對著下面一張圖我說一下原理
對于每一個socket,就對應一個Channel,每個Channel會到Selector注冊,當某一個Channel狀態改變的時候,就會觸發響應的事件,然后根據事件的類型去執行相應的動作。Channel狀態改變會通知selector,這就是上面指的回調,根據發生事件的類型去執行任務就是所謂的事件驅動,流程算是清楚了,但是為什么這么做呢,這一點我再好好解釋。
典型的后端服務分為通信層和業務邏輯層,通信層通常連接數很多(用戶大部分時間實在瀏覽而非點擊),收發數據是慢速I/O。傳統方式做的話每個請求分配線程,而且線程常常因為等待I/O阻塞,且不同線程間頻繁切換,這都是很浪費資源的。多線程的好處就是當一個線程阻塞時,另一個線程可以繼續執行任務,而這種模式下大部分線程都會因I/O而阻塞。怎么令線程不阻塞呢,我們就要使用異步回調的方式,用一個線程去管理這些請求的狀態,當某個請求數據準備好了就去調用它,沒準備好就操作下一個請求,這就是上面的selector。
Netty的產生原因是使Java NIO的編程更容易。
Netty定義:一個異步事件驅動的網絡應用框架,幫助快速開發高性能的客戶端與服務端。
上面是Netty的一張架構圖。
每一個Channel(一個客戶端請求)注冊一個EventLoop,這個EventLoop會處理這個請求的I/O事件直到這個請求結束。
未完待續。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68257.html
摘要:的選擇器允許單個線程監視多個輸入通道。一旦執行的線程已經超過讀取代碼中的某個數據片段,該線程就不會在數據中向后移動通常不會。 1、引言 很多初涉網絡編程的程序員,在研究Java NIO(即異步IO)和經典IO(也就是常說的阻塞式IO)的API時,很快就會發現一個問題:我什么時候應該使用經典IO,什么時候應該使用NIO? 在本文中,將嘗試用簡明扼要的文字,闡明Java NIO和經典IO之...
Netty+SpringBoot+FastDFS+Html5實現聊天App,項目介紹。Netty+SpringBoot+FastDFS+Html5實現聊天App,項目github鏈接。本章完整代碼鏈接。 本章內容 (1) 查詢好友列表的接口 (2)通過或忽略好友請求的接口 (3)添加好友功能展示 查詢好友列表的接口 /** * @Description: 查詢我的好友列表 ...
閱讀 2127·2019-08-29 16:53
閱讀 2705·2019-08-29 16:07
閱讀 2047·2019-08-29 13:13
閱讀 3271·2019-08-26 13:57
閱讀 1336·2019-08-26 13:31
閱讀 2439·2019-08-26 13:22
閱讀 1227·2019-08-26 11:43
閱讀 2089·2019-08-23 17:14