**前言:**很多程序員都知道,通過學習優秀的開源框架可以很大程度上解鎖更多編碼姿勢和花樣。但是沒有目的,沒有方法的去閱讀開源項目,很容易就被龐大繁雜的代碼給迷暈了!那麼該如何以正確的姿勢去閱讀開源項目呢?請各位看官品鑑此文,跟我一起庖丁解牛,來閱讀gRPC框架吧!
閱讀此文你將收穫:
- 瞭解什麼是RPC
- 瞭解該如何以正確的姿勢閱讀源碼
- 以gRPC爲例來試驗該如何閱讀源碼
大綱
- 什麼是RPC
- 爲什麼要閱讀源碼
- 如何閱讀源碼
- 從gRPC開始的源碼閱讀
一、什麼是RPC
第一次反思什麼是RPC這個問題的時候,還是在夜讀羣裏,有個哥們問怎麼進行RPC調用,我說用gRPC,有個百度的老哥反問,如果沒有gRPC怎麼辦?
那麼我們來看看什麼是RPC呢?Remote Procedure Call(遠程過程調用),說人話就是讓你調用遠程方法和調用本地(一個工程內)方法一樣!
如何做到呢?
- 是不是擼碼的時候調用個遠程方法和本地調用方法一樣?
- 既然是遠程方法,那麼調用的時候那些網絡細節,與通信協議是否應該屏蔽好,讓我們專注於業務開發?
這就是RPC!
其實RPC在我們日常生活中非常常見,MQ的客戶端向broker消費消息的通信過程是RPC,Redis客戶端向Redis請求操作的通信過程也是RPC。RPC就是整個系統架構中的血管,網絡!
二、爲什麼要閱讀源碼
2.1 我的系統出問題了而我卻不知道系列
在業務開發中,我們常常會選擇各種開源軟件作爲項目架構的組成部分,例如用於緩存的Redis,用於消息隊列的kafka或者Rocket MQ等等。
但很多開發同學長期停留在使用階段,用到了,遇到了就去百度或者谷歌一下。這樣的操作方式,一旦遇上了“疑難雜症”從哪裏找一位老中醫來給系統診脈呢?
所以請以正確的姿勢,正確的態度來面對你所使用的開源項目!那就是掌握其原理和實現細節,知其然亦知其所以然!當你的系統出現問題的時候,根據其一些表徵現象,大概就能定位到問題,然後解決掉他!
2.2 我們團隊沒有大牛,所以我菜的正常系列
最近新冠肺炎疫情鬧了一個笑話,一哥們出門,保安攔住他不讓他出去,說你不戴口罩不準出去,那哥們說我出去就是爲了買口罩!( ̄▽ ̄)"
很多時候像我一樣的普通程序員也面臨這樣的這樣的問題,沒有高手幫忙code review,代碼姿勢提升不上來。沒有技術大牛領頭研究一些技術,自己像無頭蒼蠅一樣東搞搞西搞搞,最後收效甚微!
如果你存在這些問題,那麼就請你閱讀源碼!
2.3 爲什麼閱讀源碼能讓你進步
因爲通過正確的姿勢閱讀優秀的開源項目,你會從這個項目裏收穫正確寫代碼的姿勢,例如在路由方面的設計,gin和beego有什麼不同?gin的context是怎麼用的?那麼中間件呢?iris和gin還有beego有什麼區別?這些問題一旦你弄明白後你在框架設計路由和中間件的意識就已經直追行業大佬水平了!
還有某些讓人頭疼的“學院派”知識,例如網絡,協議等等。通常沒經歷過高併發項目的同學會認爲這些沒啥用,因爲平時用不上,隨便怎麼玩機器資源也不會被耗盡。但是如果你的項目流量一旦過大,各種問題都會暴露,這些問題是有跡可循的,但是如果你不甚瞭解這些基礎知識,就算把問題的一堆線索暴露在你面前,你也只能乾瞪眼~
可別跟我說貴司用戶量小,學不學都一樣,反正用不上,我想套用一句裝逼的話:
業務開發工程師,你真的願意做一輩子 CRUD boy 嗎?
三、如何閱讀源碼
不少人閱讀源碼的時候首先把項目給down下來,用IDE打開,然後找到main函數,從main函數開始一行行往下讀,半天不到就不知道自己看到哪裏去了,好像是這麼回事,但又好像不是這樣。感覺自己看懂了點,可是懂了的這些有是幹啥的?
此之謂閱讀源碼從入main到放棄
正確的源碼閱讀姿勢爲:
-
閱讀文檔瞭解項目:
- 軟件整體結構
- 瞭解其功能特性
- 涉及關鍵技術
- 實現原理
- 周邊生態
-
有一定的認知和感受
- 這個項目是幹什麼的?
- 能解決哪些問題?
- 適合在哪些場景使用?
- 適合在哪些場景使用?
- 如何使用?
-
帶着問題讀源碼
-
執行目標
- 畫出主要流程的流程圖
- 畫出主要流程的時序圖
以問題爲模塊的閱讀源碼方式,花費少,收益高,閱讀一部分就有一部分的收穫,有一部分的提高
四、從gRPC開始的源碼閱讀
再從第一節瞭解了RPC是什麼之後,我們將以gRPC爲目標來實踐第三節源碼閱讀的方法論!
A high-performance, open source universal RPC framework
— gRPC官網
通過官方文檔我們可以瞭解到gRPC的使用說明和方法,下圖是一個典型的RPC調用圖,內容不多,但是隱藏的信息可不少!
從上圖和文檔中我們可以瞭解到,用gRPC來進行遠程服務調用就僅僅需要gRPC Stub(Client)用Proto Request向遠方的gRPC Server發起服務調用,然後遠方的gRPC Server通過Proto Response(s)將調用結果返回給gRPC Stub。
實際上真的這麼簡單就能進行遠程服務調用了嗎?
當然不是,之所以這麼簡單的原因是gRPC這個RPC框架幫我們封裝好了一切,讓我們真正的像調用本地方法一樣調用遠程服務!
這些被屏蔽的細節,是我們後續系列文章將要探索和學習的內容。此前,我們不妨先分析分析,梳理一下,gRPC究竟做了啥?
一個gRPC從開始發起請求到返回總共要經歷過序列化,編解碼,以及網絡傳輸這些內容。這些東西在我們使用gRPC框架做遠程服務調用的時候完全感知不到!
至於gRPC的stub之間的連接管理,健康檢查,負載均衡,異常重試,優雅啓停機,熔斷限流等等更是我們可以從gRPC源碼中所能夠獲得的知識!
上圖是我畫的gRPC源碼閱讀的知識樹,我希望在接下來的gRPC源碼閱讀系列文章中,能夠和大家一起將其補全,成爲自己的技能樹!
尾聲與說明
這幾千個文字遠遠不足以表達我內心想說的話,像冰山一樣,浮在水面上的永遠只有一小部分。在接下來的文章中,我會盡我所能,將源碼閱讀以一種輕鬆愉快的方式表達出來。
說明:
第三節源碼閱讀的方法論來自李玥老師極客時間專欄《消息隊列高手課-09 | 學習開源代碼該如何入手?》
源碼學習的思維導圖在這裏 https://github.com/first-giver/MindMapping.git
期待下期與各位讀者再見!