http://www.javashuo.com/article/p-fdbsfhxn-bp.htmlhtml
有了Netty,你能夠實現本身的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的Proxy服務器等等。服務器
咱們回顧一下傳統的HTTP服務器的原理併發
一、建立一個ServerSocket,監聽並綁定一個端口框架
二、一系列客戶端來請求這個端口socket
三、服務器使用Accept,得到一個來自客戶端的Socket鏈接對象高併發
四、啓動一個新線程處理鏈接性能
4.一、讀Socket,獲得字節流編碼
4.二、解碼協議,獲得Http請求對象操作系統
4.三、處理Http請求,獲得一個結果,封裝成一個HttpResponse對象線程
4.四、編碼協議,將結果序列化字節流 寫Socket,將字節流發給客戶端
五、繼續循環步驟3
HTTP服務器之因此稱爲HTTP服務器,是由於編碼解碼協議是HTTP協議,若是協議是Redis協議,那它就成了Redis服務器,若是協議是WebSocket,那它就成了WebSocket服務器,等等。 使用Netty你就能夠定製編解碼協議,實現本身的特定協議的服務器。
上面是一個傳統處理http的服務器,可是在高併發的環境下,線程數量會比較多,System load也會比較高,因而就有了NIO。
他並非Java獨有的概念,NIO表明的一個詞彙叫着IO多路複用。它是由操做系統提供的系統調用,早期這個操做系統調用的名字是select,可是性能低下,後來漸漸演化成了Linux下的epoll和Mac裏的kqueue。咱們通常就說是epoll,由於沒有人拿蘋果電腦做爲服務器使用對外提供服務。而Netty就是基於Java NIO技術封裝的一套框架。爲何要封裝,由於原生的Java NIO使用起來沒那麼方便,並且還有臭名昭著的bug,Netty把它封裝以後,提供了一個易於操做的使用模式和接口,用戶使用起來也就便捷多了。
說NIO以前先說一下BIO(Blocking IO),如何理解這個Blocking呢?
客戶端監聽(Listen)時,Accept是阻塞的,只有新鏈接來了,Accept纔會返回,主線程才能繼
讀寫socket時,Read是阻塞的,只有請求消息來了,Read才能返回,子線程才能繼續處理
讀寫socket時,Write是阻塞的,只有客戶端把消息收了,Write才能返回,子線程才能繼續讀取下一個請求
傳統的BIO模式下,從頭至尾的全部線程都是阻塞的,這些線程就乾等着,佔用系統的資源,什麼事也不幹。
那麼NIO是怎麼作到非阻塞的呢。它用的是事件機制。它能夠用一個線程把Accept,讀寫操做,請求處理的邏輯全乾了。若是什麼事都沒得作,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續幹活,這樣的一個線程稱之爲NIO線程。