前言:很多程序員都知道冲甘,通過學(xué)習(xí)優(yōu)秀的開源框架可以很大程度上解鎖更多編碼姿勢和花樣湾蔓。但是沒有目的,沒有方法的去閱讀開源項目壹甥,很容易就被龐大繁雜的代碼給迷暈了救巷!那么該如何以正確的姿勢去閱讀開源項目呢?請各位看官品鑒此文句柠,跟我一起庖丁解牛浦译,來閱讀gRPC框架吧!
閱讀此文你將收獲:
- 了解什么是RPC
- 了解該如何以正確的姿勢閱讀源碼
- 以gRPC為例來試驗該如何閱讀源碼
大綱
- 什么是RPC
- 為什么要閱讀源碼
- 如何閱讀源碼
- 從gRPC開始的源碼閱讀
一溯职、什么是RPC
第一次反思什么是RPC這個問題的時候精盅,還是在夜讀群里,有個哥們問怎么進行RPC調(diào)用缸榄,我說用gRPC渤弛,有個百度的老哥反問祝拯,如果沒有g(shù)RPC怎么辦甚带?
那么我們來看看什么是RPC呢鹰贵?Remote Procedure Call(遠程過程調(diào)用),說人話就是讓你調(diào)用遠程方法和調(diào)用本地(一個工程內(nèi))方法一樣康嘉!
如何做到呢碉输?
- 是不是擼碼的時候調(diào)用個遠程方法和本地調(diào)用方法一樣?
- 既然是遠程方法亭珍,那么調(diào)用的時候那些網(wǎng)絡(luò)細(xì)節(jié),與通信協(xié)議是否應(yīng)該屏蔽好肄梨,讓我們專注于業(yè)務(wù)開發(fā)阻荒?
這就是RPC!
其實RPC在我們?nèi)粘I钪蟹浅3R娭谙郏琈Q的客戶端向broker消費消息的通信過程是RPC侨赡,Redis客戶端向Redis請求操作的通信過程也是RPC。RPC就是整個系統(tǒng)架構(gòu)中的血管粱侣,網(wǎng)絡(luò)羊壹!
二、為什么要閱讀源碼
2.1 我的系統(tǒng)出問題了而我卻不知道系列
在業(yè)務(wù)開發(fā)中齐婴,我們常常會選擇各種開源軟件作為項目架構(gòu)的組成部分油猫,例如用于緩存的Redis,用于消息隊列的kafka或者Rocket MQ等等柠偶。
但很多開發(fā)同學(xué)長期停留在使用階段眨攘,用到了主慰,遇到了就去百度或者谷歌一下。這樣的操作方式鲫售,一旦遇上了“疑難雜癥”從哪里找一位老中醫(yī)來給系統(tǒng)診脈呢共螺?
所以請以正確的姿勢情竹,正確的態(tài)度來面對你所使用的開源項目藐不!那就是掌握其原理和實現(xiàn)細(xì)節(jié),知其然亦知其所以然秦效!當(dāng)你的系統(tǒng)出現(xiàn)問題的時候雏蛮,根據(jù)其一些表征現(xiàn)象,大概就能定位到問題阱州,然后解決掉他挑秉!
2.2 我們團隊沒有大牛,所以我菜的正常系列
最近新冠肺炎疫情鬧了一個笑話苔货,一哥們出門犀概,保安攔住他不讓他出去,說你不戴口罩不準(zhǔn)出去夜惭,那哥們說我出去就是為了買口罩姻灶!( ̄▽ ̄)"
很多時候像我一樣的普通程序員也面臨這樣的這樣的問題,沒有高手幫忙code review诈茧,代碼姿勢提升不上來产喉。沒有技術(shù)大牛領(lǐng)頭研究一些技術(shù),自己像無頭蒼蠅一樣?xùn)|搞搞西搞搞敢会,最后收效甚微曾沈!
如果你存在這些問題,那么就請你閱讀源碼鸥昏!
2.3 為什么閱讀源碼能讓你進步
因為通過正確的姿勢閱讀優(yōu)秀的開源項目互广,你會從這個項目里收獲正確寫代碼的姿勢敛腌,例如在路由方面的設(shè)計,gin和beego有什么不同惫皱?gin的context是怎么用的像樊?那么中間件呢?iris和gin還有beego有什么區(qū)別旅敷?這些問題一旦你弄明白后你在框架設(shè)計路由和中間件的意識就已經(jīng)直追行業(yè)大佬水平了生棍!
還有某些讓人頭疼的“學(xué)院派”知識,例如網(wǎng)絡(luò)媳谁,協(xié)議等等涂滴。通常沒經(jīng)歷過高并發(fā)項目的同學(xué)會認(rèn)為這些沒啥用友酱,因為平時用不上,隨便怎么玩機器資源也不會被耗盡柔纵。但是如果你的項目流量一旦過大缔杉,各種問題都會暴露,這些問題是有跡可循的搁料,但是如果你不甚了解這些基礎(chǔ)知識或详,就算把問題的一堆線索暴露在你面前,你也只能干瞪眼~
可別跟我說貴司用戶量小霸琴,學(xué)不學(xué)都一樣,反正用不上昭伸,我想套用一句裝逼的話:
業(yè)務(wù)開發(fā)工程師梧乘,你真的愿意做一輩子 CRUD boy 嗎?
三庐杨、如何閱讀源碼
不少人閱讀源碼的時候首先把項目給down下來选调,用IDE打開,然后找到main函數(shù)辑莫,從main函數(shù)開始一行行往下讀学歧,半天不到就不知道自己看到哪里去了罩引,好像是這么回事各吨,但又好像不是這樣。感覺自己看懂了點袁铐,可是懂了的這些有是干啥的揭蜒?
此之謂閱讀源碼從入main到放棄
正確的源碼閱讀姿勢為:
-
閱讀文檔了解項目:
- 軟件整體結(jié)構(gòu)
- 了解其功能特性
- 涉及關(guān)鍵技術(shù)
- 實現(xiàn)原理
- 周邊生態(tài)
-
有一定的認(rèn)知和感受
- 這個項目是干什么的?
- 能解決哪些問題剔桨?
- 適合在哪些場景使用屉更?
- 適合在哪些場景使用?
- 如何使用洒缀?
帶著問題讀源碼
-
執(zhí)行目標(biāo)
- 畫出主要流程的流程圖
- 畫出主要流程的時序圖
以問題為模塊的閱讀源碼方式瑰谜,花費少,收益高树绩,閱讀一部分就有一部分的收獲萨脑,有一部分的提高
四、從gRPC開始的源碼閱讀
再從第一節(jié)了解了RPC是什么之后饺饭,我們將以gRPC為目標(biāo)來實踐第三節(jié)源碼閱讀的方法論渤早!
A high-performance, open source universal RPC framework
--- gRPC官網(wǎng)
通過官方文檔我們可以了解到gRPC的使用說明和方法,下圖是一個典型的RPC調(diào)用圖瘫俊,內(nèi)容不多鹊杖,但是隱藏的信息可不少悴灵!
從上圖和文檔中我們可以了解到,用gRPC來進行遠程服務(wù)調(diào)用就僅僅需要gRPC Stub(Client)用Proto Request向遠方的gRPC Server發(fā)起服務(wù)調(diào)用骂蓖,然后遠方的gRPC Server通過Proto Response(s)將調(diào)用結(jié)果返回給gRPC Stub积瞒。
實際上真的這么簡單就能進行遠程服務(wù)調(diào)用了嗎?
當(dāng)然不是登下,之所以這么簡單的原因是gRPC這個RPC框架幫我們封裝好了一切赡鲜,讓我們真正的像調(diào)用本地方法一樣調(diào)用遠程服務(wù)!
這些被屏蔽的細(xì)節(jié)庐船,是我們后續(xù)系列文章將要探索和學(xué)習(xí)的內(nèi)容银酬。此前,我們不妨先分析分析筐钟,梳理一下揩瞪,gRPC究竟做了啥?
一個gRPC從開始發(fā)起請求到返回總共要經(jīng)歷過序列化篓冲,編解碼李破,以及網(wǎng)絡(luò)傳輸這些內(nèi)容。這些東西在我們使用gRPC框架做遠程服務(wù)調(diào)用的時候完全感知不到壹将!
至于gRPC的stub之間的連接管理嗤攻,健康檢查,負(fù)載均衡诽俯,異常重試妇菱,優(yōu)雅啟停機,熔斷限流等等更是我們可以從gRPC源碼中所能夠獲得的知識暴区!
上圖是我畫的gRPC源碼閱讀的知識樹闯团,我希望在接下來的gRPC源碼閱讀系列文章中,能夠和大家一起將其補全仙粱,成為自己的技能樹房交!
尾聲與說明
這幾千個文字遠遠不足以表達我內(nèi)心想說的話,像冰山一樣伐割,浮在水面上的永遠只有一小部分候味。在接下來的文章中,我會盡我所能隔心,將源碼閱讀以一種輕松愉快的方式表達出來白群。
說明:
第三節(jié)源碼閱讀的方法論來自李玥老師極客時間專欄《消息隊列高手課-09 | 學(xué)習(xí)開源代碼該如何入手?》
源碼學(xué)習(xí)的思維導(dǎo)圖在這里 https://github.com/first-giver/MindMapping.git
期待下期與各位讀者再見济炎!