開篇:Netty源碼學習總結系列(持續更新)

前言和目標

首先,很久以前寫了:Netty 學習筆記(1)Netty 通訊原理,惋惜好久沒更新了,很多博客園的網友常常問,到底還寫不寫,後來連問都不問了,深表慚愧,從今天開始,從新開啓這個系列文章——Netty源碼學習筆記。程序員

其次,立意不一樣於一些零散的我的博客文章,打算從頭至尾,造成一個系列,也不想流於表面,只是複製黏貼註釋甚至源碼。。。也不想糊弄你們,糊弄本身,隨便看看怎麼寫的就簡單完事。。。但願能兼顧底層原理和一些外圍的相關技術總結和深刻「科普」,且最好是能說明人家爲何要這樣設計!算法

須要強調:而且本系列文章是綜合了大量輸入,從最開始的項目中的使用,到好比前期的各類市面上的Netty書籍,博客,一些大佬的源碼視頻教程等,我分別吸取並梳理了一些我認爲說的不明白,或者說的不清楚,不深刻,甚至是錯誤的地方,而且更多的找出爲何這樣設計的點。編程

在最後的結束部分,打算以Netty+zookeeper實現一個簡單的RPC框架,來鞏固Netty的各類使用和最佳實踐。數組

最後,期待這個系列,能全面總結和分析Netty,讓你們少走彎路。安全

文章集合

開篇:Netty源碼學習系列

開篇:Netty源碼學習系列服務器

主要介紹了使用Netty的場景和如何深刻掌握它的一些經驗。而且給出了下載,編譯源碼的方法。網絡

最後簡單介紹了Netty的基本組件。多線程

Netty 學習筆記(1)Netty 通訊原理

Netty 學習筆記(1)Netty 通訊原理併發

以前博客園裏寫過,主要是總結了一些操做系統層面的I/O系統調用,I/O多路複用機制和epoll機制的概念。框架

Netty服務端與客戶端初始化流程(1)

Netty服務端與客戶端初始化流程(1)

從一個Netty服務端的demo入手,分析了Netty設計實現的線程池角色,以及一些經常使用API的用法,並從宏觀上,解讀了Netty的消息收發流程。

Netty服務端與客戶端初始化流程(2)

Netty服務端與客戶端初始化流程(2)

從源碼角度,分析了Netty封裝的Channel以及重點Channel——Socket Channel的初始化的過程。而且回答了幾個常見問題:

一、爲什麼Netty建立服務端(客戶端也同樣)的channel用的是反射機制?

二、NettyI/O模型實例化的時候,都作了什麼?

三、Netty的pipeline是什麼時候建立的,都作了哪些事情?

Netty服務端與客戶端初始化流程(3)

Netty服務端與客戶端初始化流程(3)

更加細緻的從源碼角度,分析了Netty爲什麼給Channel在AbstractChannel設置id,unsafe,pipeline?

Netty服務端的Socket在哪裏初始化?

好的編程習慣學習

服務端Channel建立的設計總結

Netty服務端NIO channel初始化過程分析

理解Netty服務端的bossGroup與workerGroup的理解,好比服務器端初始化設置了兩個EventLoopGroup,一個bossGroup,另外一個是workerGroup.這兩個EventLoopGroup是幹什麼用的?

Netty服務端與客戶端初始化流程(4)

Netty服務端與客戶端初始化流程(4)

主要分析總結以下:

一、Netty的bossGroup和NioServerSocketChannel是如何關聯的?

  • I/O多路複用器——Selector介紹

  • Netty如何封裝的Selector?

二、服務器綁定端口並設置監聽事件的過程分析

  • Netty服務端在哪裏accept新鏈接?

 

Netty的線程調度模型分析(1)

Netty的線程調度模型分析(1)

從這一篇開始,分析總結Netty的線程模型:

一、NioEventLoop和NioEventLoopGroup是什麼關係?

二、Reactor模型介紹

三、Netty實現的是哪一種Reactor線程模型?

四、Netty如何消除客戶端鏈接上的線程同步問題?

Netty的線程調度模型分析(2)

Netty的線程調度模型分析(2)

從Netty的線程池實現入手:

一、深刻理解Netty線程池

建立流程分析

默認狀況建立一個Netty線程池會啓動多少線程?

二、線程執行器詳解

學習Netty如何安全高效的自定義有意義的線程(池)名?

NioEventLoop線程的命名規則

Netty的線程調度模型分析(3)

Netty的線程調度模型分析(3)

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

Netty的線程調度模型分析(4)

Netty的線程調度模型分析(4)

仍是從Netty的線程池入手,分析了NioEventLoop線程的啓動過程:

一、NioEventLoop線程啓動的時機分別是在哪裏?

二、Netty如何判斷外部線程和NioEventLoop線程,爲何要這樣設計?

三、一個NioEventLoop線程對應多個channel,Netty怎麼保證A channel的數據和B channel的數據多線程執行不出錯呢?

四、爲何要把NioEventLoop和線程進行綁定呢,並且是設計成NioEventLoop的一個屬性?

五、NioEventLoop線程爲何不在建立的時候直接啓動?

六、NioEventLoop的線程啓動爲何要用CAS?

七、默認狀況Netty服務端(客戶端)會建立多少線程,又是在什麼時候啓動的?

Netty的線程調度模型分析(5)

Netty的線程調度模型分析(5)

介紹完了Netty的線程池和NIO線程,開始分析Netty的線程模型核心——事件循環機制:

一、初識NioEventLoop線程的事件循環機制

二、Netty是如何分配I/O處理和異步任務處理的執行時間的?

三、Netty的事件輪詢都作了哪些事情?

Netty的線程調度模型分析-番外篇(1)

Netty的線程調度模型分析-番外篇(1)

寫到這裏,以爲有一些前置的基礎須要鞏固,複習總結下,因此番外篇都是和Netty不相干的內容,卻又息息相關。

前置基礎總結

一、CPU上下文,以及上下文切換過程,和爲何切換會耗時的總結

二、回憶進程,線程的引入,以及它們切換的本質,和Linux源碼裏的CPU(進程)調度算法

三、區分同步、異步、阻塞與非阻塞的概念,到底該如何闡述?

四、Java線程和操做系統進程的狀態對應

五、Netty的定時任務調度概述

Netty的線程調度模型分析-番外篇(2)

Netty的線程調度模型分析-番外篇(2)

接上一篇文章,總結了一些進程,線程,併發,性能以及和Java,Netty的種種聯繫:

一、線程的底層切換過程

二、同步,異步,阻塞,非阻塞到底該怎麼闡述?

三、Java線程狀態和操做系統進程(線程)狀態對應關係

Netty的線程調度模型分析-番外篇(3)

Netty的線程調度模型分析-番外篇(3)

這一篇,總結複習了操做系統都有什麼I/O模型?

到底什麼是I/O多路複用?

瞭解Linux網絡編程中的系統調用函數

 

Netty的線程調度模型分析-番外篇(4)

Netty的線程調度模型分析-番外篇(4)

這一篇,算是比較深刻的分析了NIO的Selector——I/O多路複用器,即深刻理解NIO的Selector,以及epoll機制和常規API的用法:

一、先從select、poll系統調用提及

二、談談你對epoll機制的理解,以及Java NIO使用的是什麼觸發模式?

三、談談你對NIO的Selector的理解

四、Selector如何檢測Channel,如何被正確的喚醒,以及有什麼注意事項?

​Netty的線程調度模型分析(6)

Netty的線程調度模型分析(6)

從這篇開始,回到了對Netty源碼的分析,從NIO線程的事件循環機制開始:

一、使用NIO的一些注意事項

二、Netty是如何使用的NIO的Selector,包括如何正確喚醒的?換個問題即:Netty檢測Channel的策略都有哪些?

三、Netty如何解決了臭名昭著的「epoll」空輪詢bug,以及該問題的爭議和前因後果?

 

Netty的線程調度模型分析(7)

Netty的線程調度模型分析(7)

分析完了NIO線程的事件循環機制的第一部分——對Channel的檢測策略,本篇就開始分析Netty處理I/O事件的過程:

一、hash表和擴容分析

二、Netty如何優化的JDK的Selector

三、學習對數組拷貝的正確用法

四、學習安全管理器的正確用法

五、清空數組的陷阱

六、NioEventLoop線程是如何處理I/O事件的?

Netty的線程調度模型分析(8)

Netty的線程調度模型分析(8)

主要是繼續上一篇的內容,在7中沒說完:

五、清空數組的陷阱

六、NioEventLoop線程是如何處理I/O事件的?主要是源碼分析:

一些NIO的坑,Netty如何解決的

填充數組的快速方法

  

​。。。。

 

歡迎關注

dashuai的博客是終身學習踐行者,大廠程序員,且專一於工做經驗、學習筆記的分享和平常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!

 

相關文章
相關標籤/搜索