Netty 官方介紹#
Netty 是一個異步事件驅動的網絡應用框架,用於快速開發可維護的高性能協議伺服器和客戶端。
Netty 是一個 NIO 客戶伺服器框架,它能夠快速和容易地開發網絡應用,如協議伺服器和客戶端。它大大簡化和精簡了網絡編程,如 TCP 和 UDP 套接字伺服器。
"快速和簡單" 並不意味著最終的應用程式會出現可維護性或性能問題。Netty 的設計是經過精心設計的,其經驗來自於許多協議的實現,如 FTP、SMTP、HTTP 以及各種基於二進制和文本的遺留協議。因此,Netty 成功地找到了一種方法來實現開發的簡易性、性能、穩定性和靈活性,而沒有任何妥協。
為什麼要學習 Netty?#
- Netty 已經是行業內網絡通訊編程的標準,廣泛應用於通訊領域和許多其他中間件技術的底層。
- 應用非常廣泛
- 遊戲行業
- 許多框架的通訊底層,解決進程間通訊。
Spring WebFlux、storm、rocketMQ、dubbo 等,是分佈式系統,通訊的核心。
傳統 io 有何問題?#
1、多線程網絡編程
1.1 線程創建開銷
傳統 io 通訊使用多線程,每一個客戶端連接在伺服器程式中都會開啟一個線程,開啟一個線程和關閉一個線程都是有開銷的。
2.2 CPU 使用率高
假設 1000 個線程同時存在,每個線程的時間片用完後,上下文的切換 (上文切換可以理解為操作系統會保存時間片用完時所執行到的地方以便下次獲得時間片時可以繼續從這個地方開始執行),都會有開銷。
2.3 內存佔用率高,不可能無限創建線程
硬件資源是很珍貴的,一個線程在 java 中大約佔 1MB,大量的創建會導致內存不足。
2、線程池網絡編程
池化思想解決了無限創建線程的問題,且在程式碼中可以利用多核 cpu 的優勢。
但是有一個新的問題會出現,即 假設有 100 線程進來,但是線程池中只有 10 個可以處理請求,多餘的 90 個線程只能夠在隊列中排隊等待線程的處理,就造成了阻塞的問題。
上面的例子還只是比較理想的狀況,假設 進來的 10 個線程都因為某個原因一直阻塞在那裡,則線程池中的 10 個線程都必須等待處理完這個 10 個請求才能去處理剩下的 90 個請求,阻塞的問題就非常嚴重了,就造成了有限資源的浪費。
總結#
為什麼使用 Netty,因為 Netty 底層使用了 NIO ,解決了上述通訊的問題。
完!!!