Netty源碼分析(前言, 概述及目錄)


 

Netty源碼分析(完整版)

 

前言

 

        前段時間公司准備改造redis的客戶端, 原生的客戶端是阻塞式鏈接, 並且鏈接池初始化的鏈接數並不高, 高並發場景會有獲取不到連接的尷尬, 所以考慮了用netty長連接解決連接數和阻塞io問題

        為此詳細閱讀了netty源碼, 熟悉了netty的各個主要的特性以及疏通各個組件的關聯關系, 所以想把這段時間的學習內容, 學習經驗毫無保留的分享給大家, 自己提高的同時也幫助大家一起成長

        內容中我會把每個知識點通過每個章節去進行剖析, 每個章節也會盡可能的將關鍵的流程細化, 希望大家在學習的過程中能領會到源碼的關鍵步驟, 最好能自己能debug到源碼進行剖析

        此文檔會根據自己對netty的學習深入, 不斷地更新, 不斷的細化, 不斷的深入各個模塊的原理

        由於個人技術能力有限, 難免會有疏漏和錯誤的地方(個人學習過程中就發現了一些其他文檔中的錯誤), 發現問題, 也希望各位同學及時指正(輕噴.....)

 

 

下面概括一些要點:

 

1.  學習netty源碼需要什么知識?

        java基礎就不用說了.....

        由於本文檔只是netty源碼剖析並不是netty教程, 所以這里並不打算講nio和netty怎么用, 不了解的小伙伴可以首先熟悉下nio編程的基礎, 沒做過實戰項目沒關系, 能寫出helloworld, 並知道每一步是做什么的, 足矣

        其次要有netty基本使用的能力, 我們要知道netty完成鏈路之后在哪里執行我們自定義的業務邏輯, 收到服務端(或者客戶端)消息之后我們需要在什么地方處理, 如果這塊不熟悉, 可以網上找個demo學習, 或者學習下《netty實戰》, 對此會有一個清晰的認識

        再次我們熟悉多線程相關的知識, 最好是用過jdk的線程並發庫

        如果以上知識都沒問題, 那就開始愉快的學習吧

 

2.  這個文檔如何學習?

        文章會以章節的形式將每個模塊的關鍵部分進行剖析, 並且隨着自己研究的不斷深入進行補充和修改, 文章並不打算對每個細節進行細致入微的講解, 而是提煉關鍵代碼, 輔助大家串通整個netty的脈絡, 串通的脈絡之后, 我們會很容易理解各個模塊在框架中所承擔的責任和義務, 之后如果進行自學就會變得非常容易

        內容會盡量用簡單通俗的語言進行描述, 並且會附帶我曾經學習某一部分的思考邏輯, 這些思路有可能會和讀者產生共鳴, 從而能得心應手的解決學習當中的困惑

        每一個源碼, 我都會通過注釋去講解一些關鍵邏輯, 小伙伴們可以多關注下注釋

        在源碼剖析過程中, 同學們需要自己debug進源碼, 自己去疏通相關的邏輯關系, 只有課后自己動手, 才會真正掌握其原理, 否則, 是很難消化每一部分的精髓的

        在內容中我也會提示大家, 需要關注的哪些步驟, 初學者只需要將自己的精力放在需要關注的步驟就好. 如果對其他步驟感興趣也可以課后進行自行剖析

        由於文章中會經常跟源碼, 有的方法會跟的比較深, 所以跟蹤方法的步驟會用加粗標志, 方便讀者找到相應方法

        最好, 是一邊看着文檔另一邊看着源碼, 防止方法跟蹤太深自己找不到回來的路........

 

3.  這篇文檔學習完之后能達到什么水平?

        寫這篇文檔的目的就是通過帶同學們解析源碼的方式串通netty的整改脈絡, 學完之后之后不能保證你能精通netty, 但至少我們能串通起整個脈絡, 熟悉每一個組件, 每一個模塊在netty中所承擔的角色, 以及一個消息從發送到接受經歷了什么步驟, 從而使我們能更容易的理解到這個框架的精髓, 為以后的繼續深入打下堅實的根基......

         當然, 如果你學習的足夠認真, 真正理解了脈絡, 自己寫一個簡單的netty也不是不可能

用我最近的喜歡的雞湯激勵下小伙伴: 種樹最好的時間是十年前, 其次是現在....

 

        最后提醒下讀者, 本文基於Netty的版本是4.1.16.Final

        廢話了這么多, 正文開始.....

 

 

        目錄:

 

第一章: 服務端啟動流程

        第一節: 服務端初始化

        第二節: NioServerSocketChannel的創建

        第三節: 服務端Channel的初始化

        第四節: 注冊多路復用

        第五節: 綁定端口

 

第二章: NioEventLoop

        第一節: NioEventLoopGroup之創建線程執行器

        第二節: NioEventLoopGroup之NioEventLoop的創建

        第三節: 初始化線程選擇器

        第四節: NioEventLoop線程啟動

        第五節: 優化selector

        第六節: 執行select操作

        第七節: 處理IO事件

        第八節: 執行任務隊列

 

第三章: 客戶端接入流程

        第一節: 初始化NioSocketChannelConfig

        第二節: 處理接入事件之handle的創建

        第三節: NioSocketChannel的創建

        第四節: NioSocketChannel注冊到selector

        第五節: 監聽讀事件

 

第四章: pipeline

        第一節: pipeline的創建

        第二節: handler的添加

        第三節: handler的刪除

        第四節: 傳播inbound事件

        第五節: 傳播outbound事件

        第六節: 傳播異常事件

        第七節: 前章節內容回顧

 

第五章: ByteBuf

        第一節: AbstractByteBuf

        第二節: ByteBuf的分類

        第三節: 緩沖區分配器

        第四節: PooledByteBufAllocator簡述

        第五節: directArena分配緩沖區概述

        第六節: 命中緩存的分配

        第七節: page級別的內存分配

        第八節: Subpage級別的內存分配

        第九節: ByteBuf的回收

        第十節: SocketChannel讀取數據的過程

 

第六章: 解碼器

        第一節: ByteToMessageDecoder

        第二節: 固定長度解碼器

        第三節: 行解碼器

        第四節: 分隔符解碼器

 

第七章: 編碼器和寫數據

        第一節: writeAndFlush事件傳播

        第二節: MessageToByteEncoder

        第三節: 寫buffer隊列

        第四節: 刷新buffer隊列

        第五節: Future和Promise

 

第八章: 高性能工具類FastThreadLocal和Recycler

        第一節: FastThreadLocal的使用和創建

        第二節: FastThreadLocal的set方法

        第三節: recycler的使用和創建

        第四節: recycler中獲取對象

        第五節: 同線程回收對象

        第六節: 異線程回收對象

        第七節: 獲取異線程釋放的對象

 

下一節: 服務端初始化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM