亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么高效閱讀源碼

發布時間:2021-10-20 16:43:36 來源:億速云 閱讀:133 作者:iii 欄目:編程語言

本篇內容主要講解“怎么高效閱讀源碼”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么高效閱讀源碼”吧!

1、為什么要閱讀源碼?


1.1 在通用型基礎技術中提高技術能力

在 JAVA 領域中包含 JAVA 集合、Java并發(JUC)等, 它們是項目中使用的高頻技術,在各種復雜的場景中選用合適的數據結構、線程并發模型,合理控制鎖粒度等都能顯著提高應用程序的可用性、健壯性,非常容易凸顯出自己的技術實力,更容易受到領導的認可,助力職場。

當然通過閱讀源碼并不是知曉原理的唯一方法,但作為一個名程序員、直面代碼,親自感受代碼的魅力或許會顯得的更加直接。

1.2 在重點領域打造自己的亮點

我所在公司使用了 Dubbo、RocketMQ,我也有幸參與到這些技術棧的運用與運維,積累了豐富的使用經驗,為了突出在這兩個領域的優勢,我詳細閱讀了它們的源碼,在CSDN和公眾號等知識分享平臺發布了大量的技術文章,成體系的剖析其實現原理、架構設計理念,理論與實戰相結合,讓我成為在Dubbo、RocketMQ領域當仁不讓的技術專家,團隊中的核心骨干。

同時由于文章是成體系的,被出版社相中,邀請出書,《RocketMQ技術內幕》一書應運而生,從而成為我職業技能列表中非常亮眼的名片,形成公認的技術影響力,具備一定的“品牌溢價”能力。

當然, 也可以等到出了問題再看源碼,“投入產出比”更高,但這是個被動過程,如果生產環境由于并發不高,那可能一年、兩年你都遇不到真正的問題,經驗積累非常慢, 工作了4、5年,有可能還比不過工作2、3年的人。

所以如果是你想快速打造亮點的話,還是需要主動閱讀源碼,成體系掌握其設計理念、實現原理。

1.3 從優秀的源碼中學習設計和編碼

學習編程的過程其實就是一個模仿的過程, 優秀的源碼都是大師級作品,極具營養,可以看到大師們是如何抽象接口的,如何應用SOLID原則的,還有很多非常有用的編程技巧。

例如JUnit是從模式開始構建系統, 其中你可以看到大量的設計模式的應用,這些都是活生生的案例,比干巴巴地看那些設計模式理論,或者簡單的例子不知道好到哪里去了。

2、如何閱讀源碼

我根據多年的閱讀經驗,整理了這么一套方法:

  1. 了解這款軟件的使用場景、以及架構設計中將承擔的責任。

  2. 尋找官方文檔,從整體上把握這款軟件的設計理念。

  3. 搭建自己的開發調試環境,運行官方提供Demo示例,為后續深入研究打下基礎。

  4. 先主干流程再分支流程,注意切割,逐個擊破。

接下來分享一下我在閱讀 RocketMQ 源碼時的一些經歷,盡量讓上述理論具有畫面感。

2.1 了解 RocketMQ的應用場景

MQ的使用場景是比較清晰的,它的兩大基本職責是解耦與削峰填谷。

舉一個最簡單的場景:新用戶注冊送積分、送優惠券場景,其原始架構設計通常如下:

怎么高效閱讀源碼

可以看出用戶注冊和發優惠券,送積分是緊耦合的, 隨著業務不斷發展,活動部門提出在春節期間用戶注冊不送積分,發優惠券,而是贈送一個新春禮包,如果基于上述架構的話,需要去改動用戶注冊的主流程,違背了設計模式中的對修改關閉、對擴展開放的設計理念。

MQ的出現,可以很好地解決上面的問題:

怎么高效閱讀源碼

通過通讀官方文檔,不僅可以得出MQ的整體脈絡(例如NameServer路由發現、消息發送、消息存儲、消息消費、消息過濾),也能對順序消費,零拷貝、同步刷盤、異步刷盤等“高端大氣上檔次”的高級特性產生興趣與好奇,驅動我們去閱讀其源碼,探究其實現細節,使得我們在閱讀源碼中進行一定的自我思考成為了可能。

2.3 搭建開發調試環境

不同的系統搭建方式也不同,我這里有一篇手把手教你安裝RocketMQ與IDEA Debug環境搭建。

2.4 先主干,再分支

在搭建好本地開發環境后,切忌直接用Debug去跟蹤消息發送的整體流程,因為這個流程實在是太長了,從比較粗粒度來看其流程如下圖所示:

怎么高效閱讀源碼

經過這樣一分解,就能專注理解其某一塊的設計原理,所需要的連續時間也能大大減少,一口一口“吃”,最終完成整個體系的理解。

這還帶來了一個額外的好處:分批次輸出多篇文章,提高了文章產出,提高了成就感。

3、閱讀源碼很容易放棄,怎么辦?


閱讀源碼是枯燥的,一個人孤軍奮戰很容易放棄,尤其是遇到問題的時候,  如何才能堅持下去,把它讀完呢?

我的答案是堅持,但允許短暫的休整、停留,然后反復發起沖刺,拼搶,直到攻克這個“山頭”。

因為一旦放棄就將前功盡棄,一旦突破,自身能力能得到一個質的飛躍。

我在閱讀Netty源碼時就遇到了難題,當時剛剛寫完Netty的內存泄露檢測,準備開始研究內存分配機制, 這一塊兒非常抽象,涉及的數據結構復雜,需要掌握二叉樹與數組之間如何映射、牽扯到大量的位運算等等,讓我在探究其原理時寸步難行,怎么辦呢?放棄?

當一周、兩周都無法取得突破時,人很容易想到:這樣持續投入時間,又沒有回報, 是不是在浪費時間?

其實我想過放棄,但轉念一想:放棄后,我會做什么呢?玩游戲?看電視?

既然是玩游戲、看電視,不更是浪費時間嗎?想清楚這一層后,繼續攻關,繼續突破就成了唯一的選擇。

當然,遇到難題了,偶爾放松一兩天,重新調整狀態也是非常必要的。短暫的休整可以讓我們變得不那么焦躁,有利于我們重新整理思路,重新發起沖刺。

當時遇到難題時,采取哪些措施有利于我們攻克難題呢?

1、向“度娘”求救

在閱讀源碼時可以將看不懂的代碼直接COPY一小段到百度上去搜索,可能會有大牛已經對這些代碼做過解讀,能起到指點作用。

當時經過我的搜索,發現Netty的內存分配算法并不是首創,而是對 jemalloc 算法的實現,通過查閱相關的技術文檔,可以從整體上理解Netty的內存分配算法。

2、Debug
Netty追求極致的性能,采用了大量的位運算,由于平時工作中很少會使用位運算,看起來比較吃力,為了彌補這方面的不足,使用DEBUG模式,結合運行時數據,去理解位運算,更容易開竅。

經過上面的努力,花了10天時間,Netty的內存分配機制慢慢被我解開,經過分解,我寫了一系列文章來描述Netty內存分配:

怎么高效閱讀源碼

其中192.168.1.3這個機器有一段時間負載過高,響應時間過長,發往它的請求有30%都失敗了。

而30%恰恰是Sentinel設置的熔斷錯誤率, 于是Sentinel認為整個“用戶信息查找”服務不可用了,熔斷了。

這明顯是不合理的,因為192.168.1.4和192.168.1.5這兩個機器還活著呢!

本質上這是因為熔斷錯誤率被定義到了服務級別 :服務 -> 熔斷錯誤率

在對這個問題進行思考的時候,我認為在配置熔斷規則的時候,需要細化,應該把熔斷錯誤率定義到資源組級別:[服務 , 機器] ->  熔斷錯誤率

這樣,當一個機器上的服務提供者被熔斷后,不影響其他機器,保證了真正的高可用。

通過與官方聯系,我這個想法得到了其作者的肯定,反向促進了社區的發展。

到此,相信大家對“怎么高效閱讀源碼”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通渭县| 成都市| 同德县| 日照市| 渝北区| 托里县| 吴川市| 峡江县| 南投县| 德阳市| 富裕县| 拉孜县| 金湖县| 凤庆县| 江山市| 怀集县| 商洛市| 体育| 休宁县| 华蓥市| 平凉市| 穆棱市| 武冈市| 灵川县| 武城县| 永城市| 岳阳市| 项城市| 龙江县| 泽普县| 蒙自县| 大丰市| 河北区| 广安市| 宁德市| 天祝| 盘锦市| 拉萨市| 怀远县| 栾城县| 清丰县|