前言和目標
首先,好久之前寫了:Netty 學習筆記(1)Netty 通信原理,可惜很久沒更新了,不少博客園的網友經常問,到底還寫不寫,后來連問都不問了,深表慚愧,從今天開始,重新開啟這個系列文章——Netty源碼學習筆記。
其次,立意不同於一些零散的個人博客文章,打算從頭到尾,形成一個系列,也不想流於表面,只是復制黏貼注釋甚至源碼。。。也不想糊弄大家,糊弄自己,隨便看看怎么寫的就簡單完事。。。希望能兼顧底層原理和一些外圍的相關技術總結和深入“科普”,且最好是能說明人家為什么要這樣設計!
需要強調:並且本系列文章是綜合了大量輸入,從最開始的項目中的使用,到比如前期的各種市面上的Netty書籍,博客,一些大佬的源碼視頻教程等,我分別吸收並梳理了一些我認為說的不明白,或者說的不清楚,不深入,甚至是錯誤的地方,並且更多的找出為什么這樣設計的點。
在最后的結束部分,打算以Netty+zookeeper實現一個簡單的RPC框架,來鞏固Netty的各種使用和最佳實踐。
最后,期待這個系列,能全面總結和分析Netty,讓大家少走彎路。
文章集合
開篇:Netty源碼學習系列
主要介紹了使用Netty的場景和如何深入掌握它的一些經驗。並且給出了下載,編譯源碼的方法。
最后簡單介紹了Netty的基本組件。

Netty 學習筆記(1)Netty 通信原理
之前博客園里寫過,主要是總結了一些操作系統層面的I/O系統調用,I/O多路復用機制和epoll機制的概念。

Netty服務端與客戶端初始化流程(1)
從一個Netty服務端的demo入手,分析了Netty設計實現的線程池角色,以及一些常用API的用法,並從宏觀上,解讀了Netty的消息收發流程。

Netty服務端與客戶端初始化流程(2)
從源碼角度,分析了Netty封裝的Channel以及重點Channel——Socket Channel的初始化的過程。並且回答了幾個常見問題:
1、為何Netty創建服務端(客戶端也一樣)的channel用的是反射機制?
2、NettyI/O模型實例化的時候,都做了什么?
3、Netty的pipeline是何時創建的,都做了哪些事情?

Netty服務端與客戶端初始化流程(3)
更加細致的從源碼角度,分析了Netty為何給Channel在AbstractChannel設置id,unsafe,pipeline?
Netty服務端的Socket在哪里初始化?
好的編程習慣學習
服務端Channel創建的設計總結
Netty服務端NIO channel初始化過程分析
理解Netty服務端的bossGroup與workerGroup的理解,比如服務器端初始化設置了兩個EventLoopGroup,一個bossGroup,另一個是workerGroup.這兩個EventLoopGroup是干什么用的?

Netty服務端與客戶端初始化流程(4)
主要分析總結如下:
1、Netty的bossGroup和NioServerSocketChannel是如何關聯的?
-
I/O多路復用器——Selector介紹
-
Netty如何封裝的Selector?
2、服務器綁定端口並設置監聽事件的過程分析
-
Netty服務端在哪里accept新連接?
Netty的線程調度模型分析(1)
從這一篇開始,分析總結Netty的線程模型:
1、NioEventLoop和NioEventLoopGroup是什么關系?
2、Reactor模型介紹
3、Netty實現的是哪種Reactor線程模型?
4、Netty如何消除客戶端連接上的線程同步問題?

Netty的線程調度模型分析(2)
從Netty的線程池實現入手:
1、深入理解Netty線程池
創建流程分析
默認情況創建一個Netty線程池會啟動多少線程?
2、線程執行器詳解
學習Netty如何安全高效的自定義有意義的線程(池)名?
NioEventLoop線程的命名規則

Netty的線程調度模型分析(3)
重點分析了Netty的線程池線程選擇器,並且附帶復習總結了volatile關鍵字意義以及正確使用的方式,接着對Netty線程池實例化NioEventLoop的過程進行了詳解,並且點出了Netty的一個優化技巧:求模運算和按位與運算互轉

Netty的線程調度模型分析(4)
還是從Netty的線程池入手,分析了NioEventLoop線程的啟動過程:
1、NioEventLoop線程啟動的時機分別是在哪里?
2、Netty如何判斷外部線程和NioEventLoop線程,為什么要這樣設計?
3、一個NioEventLoop線程對應多個channel,Netty怎么保證A channel的數據和B channel的數據多線程執行不出錯呢?
4、為什么要把NioEventLoop和線程進行綁定呢,而且是設計成NioEventLoop的一個屬性?
5、NioEventLoop線程為什么不在創建的時候直接啟動?
6、NioEventLoop的線程啟動為什么要用CAS?
7、默認情況Netty服務端(客戶端)會創建多少線程,又是在何時啟動的?

Netty的線程調度模型分析(5)
介紹完了Netty的線程池和NIO線程,開始分析Netty的線程模型核心——事件循環機制:
1、初識NioEventLoop線程的事件循環機制
2、Netty是如何分配I/O處理和異步任務處理的執行時間的?
3、Netty的事件輪詢都做了哪些事情?

Netty的線程調度模型分析-番外篇(1)
寫到這里,覺得有一些前置的基礎需要鞏固,復習總結下,所以番外篇都是和Netty不相干的內容,卻又息息相關。
前置基礎總結
1、CPU上下文,以及上下文切換過程,和為什么切換會耗時的總結
2、回憶進程,線程的引入,以及它們切換的本質,和Linux源碼里的CPU(進程)調度算法
3、區分同步、異步、阻塞與非阻塞的概念,到底該如何闡述?
4、Java線程和操作系統進程的狀態對應
5、Netty的定時任務調度概述

Netty的線程調度模型分析-番外篇(2)
接上一篇文章,總結了一些進程,線程,並發,性能以及和Java,Netty的種種聯系:
1、線程的底層切換過程
2、同步,異步,阻塞,非阻塞到底該怎么闡述?
3、Java線程狀態和操作系統進程(線程)狀態對應關系

Netty的線程調度模型分析-番外篇(3)
這一篇,總結復習了操作系統都有什么I/O模型?
到底什么是I/O多路復用?
了解Linux網絡編程中的系統調用函數
Netty的線程調度模型分析-番外篇(4)
這一篇,算是比較深入的分析了NIO的Selector——I/O多路復用器,即深入理解NIO的Selector,以及epoll機制和常規API的用法:
1、先從select、poll系統調用說起
2、談談你對epoll機制的理解,以及Java NIO使用的是什么觸發模式?
3、談談你對NIO的Selector的理解
4、Selector如何檢測Channel,如何被正確的喚醒,以及有什么注意事項?

Netty的線程調度模型分析(6)
從這篇開始,回到了對Netty源碼的分析,從NIO線程的事件循環機制開始:
1、使用NIO的一些注意事項
2、Netty是如何使用的NIO的Selector,包括如何正確喚醒的?換個問題即:Netty檢測Channel的策略都有哪些?
3、Netty如何解決了臭名昭著的“epoll”空輪詢bug,以及該問題的爭議和來龍去脈?
Netty的線程調度模型分析(7)
分析完了NIO線程的事件循環機制的第一部分——對Channel的檢測策略,本篇就開始分析Netty處理I/O事件的過程:
1、hash表和擴容分析
2、Netty如何優化的JDK的Selector
3、學習對數組拷貝的正確用法
4、學習安全管理器的正確用法
5、清空數組的陷阱
6、NioEventLoop線程是如何處理I/O事件的?

Netty的線程調度模型分析(8)
主要是繼續上一篇的內容,在7中沒說完:
5、清空數組的陷阱
6、NioEventLoop線程是如何處理I/O事件的?主要是源碼分析:
一些NIO的坑,Netty如何解決的
填充數組的快速方法
Netty的線程調度模型分析(9)
主要分析了Netty線程調度模型的第三件事——Netty對異步任務的處理過程和實現機制:
NioEventLoop線程是如何處理異步任務的?
掌握JDK的阻塞隊列用法
Netty異步任務分類都有什么?
異步任務的添加過程和執行時機與策略
定時任務的添加過程和執行時機與策略
定時任務的分類
掌握JDK的優先級隊列用法

Netty的線程調度模型分析(10)
Netty的線程模型總結暨常見面試題分解
1、學習Netty多線程數據處理和定時任務聚合的處理邏輯
2、多線程環境下,實例變量轉為局部變量的程序設計技巧
3、Netty里有幾類線程池,有什么區別,和JDK線程池又有什么區別?
4、Netty的任務有幾類,為何要把定時任務聚合到普通任務隊列里執行?
5、為什么Netty一定堅持用一個NioEventLoop線程串行執行注冊在其上的task和channel里的I/O事件,並行不是更好么?
6、什么是CPU(線程)上下文切換?
7、為什么有人說CPU(線程,進程)上下文切換會影響系統性能?
8、Netty執行異步任務隊列總結
9、NioEventLoop線程模型總結
10、Netty如何保證異步串行無鎖化?
11、默認情況下Netty線程池起多少線程,何時啟動?
12、Netty到底實現的哪種reactor模型?
13、Runtime.getRuntime().availableProcessors()的真正含義?
14、Netty的boss線程池和worker線程池能不能合在一起?
15、Netty是如何解決epoll空輪詢bug的?
16、Netty多線程開發的最佳實踐有哪些?
歡迎關注
dashuai的博客是終身學習踐行者,大廠程序員,且專注於工作經驗、學習筆記的分享和日常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!

