本篇內(nèi)容主要講解“怎么高效閱讀源碼”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“怎么高效閱讀源碼”吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、平鄉(xiāng)網(wǎng)站維護、網(wǎng)站推廣。
在 JAVA 領(lǐng)域中包含 JAVA 集合、Java并發(fā)(JUC)等, 它們是項目中使用的高頻技術(shù),在各種復(fù)雜的場景中選用合適的數(shù)據(jù)結(jié)構(gòu)、線程并發(fā)模型,合理控制鎖粒度等都能顯著提高應(yīng)用程序的可用性、健壯性,非常容易凸顯出自己的技術(shù)實力,更容易受到領(lǐng)導(dǎo)的認(rèn)可,助力職場。
當(dāng)然通過閱讀源碼并不是知曉原理的唯一方法,但作為一個名程序員、直面代碼,親自感受代碼的魅力或許會顯得的更加直接。
我所在公司使用了 Dubbo、RocketMQ,我也有幸參與到這些技術(shù)棧的運用與運維,積累了豐富的使用經(jīng)驗,為了突出在這兩個領(lǐng)域的優(yōu)勢,我詳細(xì)閱讀了它們的源碼,在CSDN和公眾號等知識分享平臺發(fā)布了大量的技術(shù)文章,成體系的剖析其實現(xiàn)原理、架構(gòu)設(shè)計理念,理論與實戰(zhàn)相結(jié)合,讓我成為在Dubbo、RocketMQ領(lǐng)域當(dāng)仁不讓的技術(shù)專家,團隊中的核心骨干。
同時由于文章是成體系的,被出版社相中,邀請出書,《RocketMQ技術(shù)內(nèi)幕》一書應(yīng)運而生,從而成為我職業(yè)技能列表中非常亮眼的名片,形成公認(rèn)的技術(shù)影響力,具備一定的“品牌溢價”能力。
當(dāng)然, 也可以等到出了問題再看源碼,“投入產(chǎn)出比”更高,但這是個被動過程,如果生產(chǎn)環(huán)境由于并發(fā)不高,那可能一年、兩年你都遇不到真正的問題,經(jīng)驗積累非常慢, 工作了4、5年,有可能還比不過工作2、3年的人。
所以如果是你想快速打造亮點的話,還是需要主動閱讀源碼,成體系掌握其設(shè)計理念、實現(xiàn)原理。
學(xué)習(xí)編程的過程其實就是一個模仿的過程, 優(yōu)秀的源碼都是大師級作品,極具營養(yǎng),可以看到大師們是如何抽象接口的,如何應(yīng)用SOLID原則的,還有很多非常有用的編程技巧。
例如JUnit是從模式開始構(gòu)建系統(tǒng), 其中你可以看到大量的設(shè)計模式的應(yīng)用,這些都是活生生的案例,比干巴巴地看那些設(shè)計模式理論,或者簡單的例子不知道好到哪里去了。
2、如何閱讀源碼
我根據(jù)多年的閱讀經(jīng)驗,整理了這么一套方法:
了解這款軟件的使用場景、以及架構(gòu)設(shè)計中將承擔(dān)的責(zé)任。
尋找官方文檔,從整體上把握這款軟件的設(shè)計理念。
搭建自己的開發(fā)調(diào)試環(huán)境,運行官方提供Demo示例,為后續(xù)深入研究打下基礎(chǔ)。
先主干流程再分支流程,注意切割,逐個擊破。
接下來分享一下我在閱讀 RocketMQ 源碼時的一些經(jīng)歷,盡量讓上述理論具有畫面感。
MQ的使用場景是比較清晰的,它的兩大基本職責(zé)是解耦與削峰填谷。
舉一個最簡單的場景:新用戶注冊送積分、送優(yōu)惠券場景,其原始架構(gòu)設(shè)計通常如下:
可以看出用戶注冊和發(fā)優(yōu)惠券,送積分是緊耦合的, 隨著業(yè)務(wù)不斷發(fā)展,活動部門提出在春節(jié)期間用戶注冊不送積分,發(fā)優(yōu)惠券,而是贈送一個新春禮包,如果基于上述架構(gòu)的話,需要去改動用戶注冊的主流程,違背了設(shè)計模式中的對修改關(guān)閉、對擴展開放的設(shè)計理念。
MQ的出現(xiàn),可以很好地解決上面的問題:
通過通讀官方文檔,不僅可以得出MQ的整體脈絡(luò)(例如NameServer路由發(fā)現(xiàn)、消息發(fā)送、消息存儲、消息消費、消息過濾),也能對順序消費,零拷貝、同步刷盤、異步刷盤等“高端大氣上檔次”的高級特性產(chǎn)生興趣與好奇,驅(qū)動我們?nèi)ラ喿x其源碼,探究其實現(xiàn)細(xì)節(jié),使得我們在閱讀源碼中進行一定的自我思考成為了可能。
不同的系統(tǒng)搭建方式也不同,我這里有一篇手把手教你安裝RocketMQ與IDEA Debug環(huán)境搭建。
在搭建好本地開發(fā)環(huán)境后,切忌直接用Debug去跟蹤消息發(fā)送的整體流程,因為這個流程實在是太長了,從比較粗粒度來看其流程如下圖所示:
經(jīng)過這樣一分解,就能專注理解其某一塊的設(shè)計原理,所需要的連續(xù)時間也能大大減少,一口一口“吃”,最終完成整個體系的理解。
這還帶來了一個額外的好處:分批次輸出多篇文章,提高了文章產(chǎn)出,提高了成就感。
閱讀源碼是枯燥的,一個人孤軍奮戰(zhàn)很容易放棄,尤其是遇到問題的時候, 如何才能堅持下去,把它讀完呢?
我的答案是堅持,但允許短暫的休整、停留,然后反復(fù)發(fā)起沖刺,拼搶,直到攻克這個“山頭”。
因為一旦放棄就將前功盡棄,一旦突破,自身能力能得到一個質(zhì)的飛躍。
我在閱讀Netty源碼時就遇到了難題,當(dāng)時剛剛寫完Netty的內(nèi)存泄露檢測,準(zhǔn)備開始研究內(nèi)存分配機制, 這一塊兒非常抽象,涉及的數(shù)據(jù)結(jié)構(gòu)復(fù)雜,需要掌握二叉樹與數(shù)組之間如何映射、牽扯到大量的位運算等等,讓我在探究其原理時寸步難行,怎么辦呢?放棄?
當(dāng)一周、兩周都無法取得突破時,人很容易想到:這樣持續(xù)投入時間,又沒有回報, 是不是在浪費時間?
其實我想過放棄,但轉(zhuǎn)念一想:放棄后,我會做什么呢?玩游戲?看電視?
既然是玩游戲、看電視,不更是浪費時間嗎?想清楚這一層后,繼續(xù)攻關(guān),繼續(xù)突破就成了唯一的選擇。
當(dāng)然,遇到難題了,偶爾放松一兩天,重新調(diào)整狀態(tài)也是非常必要的。短暫的休整可以讓我們變得不那么焦躁,有利于我們重新整理思路,重新發(fā)起沖刺。
當(dāng)時遇到難題時,采取哪些措施有利于我們攻克難題呢?
1、向“度娘”求救
在閱讀源碼時可以將看不懂的代碼直接COPY一小段到百度上去搜索,可能會有大牛已經(jīng)對這些代碼做過解讀,能起到指點作用。
當(dāng)時經(jīng)過我的搜索,發(fā)現(xiàn)Netty的內(nèi)存分配算法并不是首創(chuàng),而是對 jemalloc 算法的實現(xiàn),通過查閱相關(guān)的技術(shù)文檔,可以從整體上理解Netty的內(nèi)存分配算法。
2、Debug
Netty追求極致的性能,采用了大量的位運算,由于平時工作中很少會使用位運算,看起來比較吃力,為了彌補這方面的不足,使用DEBUG模式,結(jié)合運行時數(shù)據(jù),去理解位運算,更容易開竅。
經(jīng)過上面的努力,花了10天時間,Netty的內(nèi)存分配機制慢慢被我解開,經(jīng)過分解,我寫了一系列文章來描述Netty內(nèi)存分配:
其中192.168.1.3這個機器有一段時間負(fù)載過高,響應(yīng)時間過長,發(fā)往它的請求有30%都失敗了。
而30%恰恰是Sentinel設(shè)置的熔斷錯誤率, 于是Sentinel認(rèn)為整個“用戶信息查找”服務(wù)不可用了,熔斷了。
這明顯是不合理的,因為192.168.1.4和192.168.1.5這兩個機器還活著呢!
本質(zhì)上這是因為熔斷錯誤率被定義到了服務(wù)級別 :服務(wù) -> 熔斷錯誤率
在對這個問題進行思考的時候,我認(rèn)為在配置熔斷規(guī)則的時候,需要細(xì)化,應(yīng)該把熔斷錯誤率定義到資源組級別:[服務(wù) , 機器] -> 熔斷錯誤率
這樣,當(dāng)一個機器上的服務(wù)提供者被熔斷后,不影響其他機器,保證了真正的高可用。
通過與官方聯(lián)系,我這個想法得到了其作者的肯定,反向促進了社區(qū)的發(fā)展。
到此,相信大家對“怎么高效閱讀源碼”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!