首先,很久以前寫了:Netty 學習筆記(1)Netty 通訊原理,惋惜好久沒更新了,很多博客園的網友常常問,到底還寫不寫,後來連問都不問了,深表慚愧,從今天開始,從新開啓這個系列文章——Netty源碼學習筆記。程序員
其次,立意不一樣於一些零散的我的博客文章,打算從頭至尾,造成一個系列,也不想流於表面,只是複製黏貼註釋甚至源碼。。。也不想糊弄你們,糊弄本身,隨便看看怎麼寫的就簡單完事。。。但願能兼顧底層原理和一些外圍的相關技術總結和深刻「科普」,且最好是能說明人家爲何要這樣設計!算法
須要強調:而且本系列文章是綜合了大量輸入,從最開始的項目中的使用,到好比前期的各類市面上的Netty書籍,博客,一些大佬的源碼視頻教程等,我分別吸取並梳理了一些我認爲說的不明白,或者說的不清楚,不深刻,甚至是錯誤的地方,而且更多的找出爲何這樣設計的點。編程
在最後的結束部分,打算以Netty+zookeeper實現一個簡單的RPC框架,來鞏固Netty的各類使用和最佳實踐。數組
最後,期待這個系列,能全面總結和分析Netty,讓你們少走彎路。安全
主要介紹了使用Netty的場景和如何深刻掌握它的一些經驗。而且給出了下載,編譯源碼的方法。網絡
最後簡單介紹了Netty的基本組件。多線程
以前博客園裏寫過,主要是總結了一些操做系統層面的I/O系統調用,I/O多路複用機制和epoll機制的概念。框架
從一個Netty服務端的demo入手,分析了Netty設計實現的線程池角色,以及一些經常使用API的用法,並從宏觀上,解讀了Netty的消息收發流程。
從源碼角度,分析了Netty封裝的Channel以及重點Channel——Socket Channel的初始化的過程。而且回答了幾個常見問題:
一、爲什麼Netty建立服務端(客戶端也同樣)的channel用的是反射機制?
二、NettyI/O模型實例化的時候,都作了什麼?
三、Netty的pipeline是什麼時候建立的,都作了哪些事情?
更加細緻的從源碼角度,分析了Netty爲什麼給Channel在AbstractChannel設置id,unsafe,pipeline?
Netty服務端的Socket在哪裏初始化?
好的編程習慣學習
服務端Channel建立的設計總結
Netty服務端NIO channel初始化過程分析
理解Netty服務端的bossGroup與workerGroup的理解,好比服務器端初始化設置了兩個EventLoopGroup,一個bossGroup,另外一個是workerGroup.這兩個EventLoopGroup是幹什麼用的?
主要分析總結以下:
一、Netty的bossGroup和NioServerSocketChannel是如何關聯的?
I/O多路複用器——Selector介紹
Netty如何封裝的Selector?
二、服務器綁定端口並設置監聽事件的過程分析
Netty服務端在哪裏accept新鏈接?
從這一篇開始,分析總結Netty的線程模型:
一、NioEventLoop和NioEventLoopGroup是什麼關係?
二、Reactor模型介紹
三、Netty實現的是哪一種Reactor線程模型?
四、Netty如何消除客戶端鏈接上的線程同步問題?
從Netty的線程池實現入手:
一、深刻理解Netty線程池
建立流程分析
默認狀況建立一個Netty線程池會啓動多少線程?
二、線程執行器詳解
學習Netty如何安全高效的自定義有意義的線程(池)名?
NioEventLoop線程的命名規則
重點分析了Netty的線程池線程選擇器,而且附帶複習總結了volatile關鍵字意義以及正確使用的方式,接着對Netty線程池實例化NioEventLoop的過程進行了詳解,而且點出了Netty的一個優化技巧:求模運算和按位與運算互轉
仍是從Netty的線程池入手,分析了NioEventLoop線程的啓動過程:
一、NioEventLoop線程啓動的時機分別是在哪裏?
二、Netty如何判斷外部線程和NioEventLoop線程,爲何要這樣設計?
三、一個NioEventLoop線程對應多個channel,Netty怎麼保證A channel的數據和B channel的數據多線程執行不出錯呢?
四、爲何要把NioEventLoop和線程進行綁定呢,並且是設計成NioEventLoop的一個屬性?
五、NioEventLoop線程爲何不在建立的時候直接啓動?
六、NioEventLoop的線程啓動爲何要用CAS?
七、默認狀況Netty服務端(客戶端)會建立多少線程,又是在什麼時候啓動的?
介紹完了Netty的線程池和NIO線程,開始分析Netty的線程模型核心——事件循環機制:
一、初識NioEventLoop線程的事件循環機制
二、Netty是如何分配I/O處理和異步任務處理的執行時間的?
三、Netty的事件輪詢都作了哪些事情?
寫到這裏,以爲有一些前置的基礎須要鞏固,複習總結下,因此番外篇都是和Netty不相干的內容,卻又息息相關。
前置基礎總結
一、CPU上下文,以及上下文切換過程,和爲何切換會耗時的總結
二、回憶進程,線程的引入,以及它們切換的本質,和Linux源碼裏的CPU(進程)調度算法
三、區分同步、異步、阻塞與非阻塞的概念,到底該如何闡述?
四、Java線程和操做系統進程的狀態對應
五、Netty的定時任務調度概述
接上一篇文章,總結了一些進程,線程,併發,性能以及和Java,Netty的種種聯繫:
一、線程的底層切換過程
二、同步,異步,阻塞,非阻塞到底該怎麼闡述?
三、Java線程狀態和操做系統進程(線程)狀態對應關係
這一篇,總結複習了操做系統都有什麼I/O模型?
到底什麼是I/O多路複用?
瞭解Linux網絡編程中的系統調用函數
這一篇,算是比較深刻的分析了NIO的Selector——I/O多路複用器,即深刻理解NIO的Selector,以及epoll機制和常規API的用法:
一、先從select、poll系統調用提及
二、談談你對epoll機制的理解,以及Java NIO使用的是什麼觸發模式?
三、談談你對NIO的Selector的理解
四、Selector如何檢測Channel,如何被正確的喚醒,以及有什麼注意事項?
從這篇開始,回到了對Netty源碼的分析,從NIO線程的事件循環機制開始:
一、使用NIO的一些注意事項
二、Netty是如何使用的NIO的Selector,包括如何正確喚醒的?換個問題即:Netty檢測Channel的策略都有哪些?
三、Netty如何解決了臭名昭著的「epoll」空輪詢bug,以及該問題的爭議和前因後果?
分析完了NIO線程的事件循環機制的第一部分——對Channel的檢測策略,本篇就開始分析Netty處理I/O事件的過程:
一、hash表和擴容分析
二、Netty如何優化的JDK的Selector
三、學習對數組拷貝的正確用法
四、學習安全管理器的正確用法
五、清空數組的陷阱
六、NioEventLoop線程是如何處理I/O事件的?
主要是繼續上一篇的內容,在7中沒說完:
五、清空數組的陷阱
六、NioEventLoop線程是如何處理I/O事件的?主要是源碼分析:
一些NIO的坑,Netty如何解決的
填充數組的快速方法
。。。。
dashuai的博客是終身學習踐行者,大廠程序員,且專一於工做經驗、學習筆記的分享和平常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!