如何去學習一個新伺服器項目的方法

如何去學習一個新伺服器項目的方法

2 人贊了文章

剛入行的時候,行業大佬都讓我去多讀源碼。我也去做了,可能是因為我太菜了,那些源碼根本看不懂,也不知道該看什麼。學習起來一頭霧水,看了半天都看不懂寫的是什麼。

隨著對多個項目的熟悉,工作套路的熟悉,自己也開始寫框架。到如今,也形成了一套自己學習一個新項目的經驗。

預先說明一點,我只有JAVA/C#/C++三種語言的項目開發經驗,熟練度先後排序,所以其他不熟悉的沒辦法評論。

拿到一款新項目(不分工作上拿到還是私下拿到),首先第一件事就是要把它跑起來。

一般來說,運氣都不會那麼好,很少見到導入項目就直接能成功運行的代碼。首先我們要確定項目的開發工具版本,IDE版本、軟體開發工具包版本(JDK這些玩意)。接著要確定框架和第三方庫的版本一致。在這裡我必須血淚哭訴實名指認任性又操蛋的python,不僅僅軟體開發工具包的版本不能做到向下兼容,就連它的第三方庫也是隔幾個版本就直接不能用了。網上搜到的問題解決方案版本混亂,如果沒有原項目提供具體的版本,那我真的就沒辦法跑起我接手的那個python項目。

儘可能的使用和項目一致的版本,就算你想升級,也得整個項目熟悉了之後再去做,否則你看著一堆報錯的情況下根本分不清是什麼原因造成的。

運氣好點的,各種庫的版本一致之後,項目就能正常啟動運行了。運氣差點的,別說啟動了,代碼都是一片紅。

下一步就是編譯鏈接了,很多項目會自己寫一個庫,比如網路層、工具類等。想要正常編譯項目,必須先把這些項目私有庫編譯好才行。具體的操作就是去看報錯的地方,一般就是include的時候會提示XXX找不到。根據提示,定位具體是哪個庫沒有import。這裡細碎的操作太多,如果是新手搞不定還是找自己的老大幫忙比較好。如果是老手,這一步是能夠通過報錯來解決這些問題的。

解決完編譯的問題後,代碼應該終於不是一片紅了。運氣好點,這裡就直接能啟動了,不好的還得折磨。

如果代碼不報錯,依舊不能啟動,最主要的可能性應該是配置文件沒有正確配置,也有少數可能性是少了什麼庫沒有導入(這個是因為有的項目導入的庫只有運行的時候才會使用,所以代碼不報錯,運行才報錯,少數情況)。代碼作風良好的會在啟動日誌里告訴你哪裡出了問題,日誌上面沒有的話,就得打斷點手動去查了。主要就是在main方法里打斷點,看是哪一步停止了伺服器的運行。

等伺服器正常運行起來了之後,我們就可以開始進入今天的正題,如何學習一個新項目的源碼。

拿到一個新項目,首先要看的是它的main方法。一般main方法會執行3種操作,讀取配置、初始化各種服務,啟動網路層監聽。

前面兩個很簡單,讀配置不用說,看看有啥就行了。初始化的服務,也不用細看,了解都有哪些服務就行。

關鍵是網路層。

我們首先要看這個網路層啟動(比較常見的是server.start())的時候都做了什麼,了解它的實現。知道它如何進行消息的接收、解包、消息分發、註冊處理函數、壓包、發送。

這裡要一點點讀,每個框架的實現都不太一樣,但是都大同小異。

消息的接收是能夠從網路層代碼里直接看到的,除非它封裝了網路層,不給你看具體的實現。我們看消息的接受,主要就是看這個伺服器接收到一個消息之後,是如何對這個消息進行處理的。我們會看到消息的解包,知道它如何把二進位流變成數據包。可以看到數據包的結構,了解它如何進行分發到具體的業務代碼。可能中間還有加密解密的操作。

每個消息必定會有一個messageId來用於分發到具體的業務,這個名稱未必一致,有的叫id,有的叫type,也有的叫cmd。但具體的使用只有兩種,數字id或者直接取類名。具體的messageid得從註冊網路協議處理函數那邊去看。

從start()那裡,如果代碼耦合度較高,我們可以直接在start函數里看到具體的業務處理函數的註冊。解耦過的有兩種方式,一種是網路層提供一個方法,讓其他的業務層自行去註冊。一種是通過註解和指定的包名類名來實現自動註冊。前者的註冊方法不寫在網路層里,需要你自己找到業務層才能看到它的註冊,註冊的時候也會附上messageid,有的複雜的框架會分主協議和子協議,其實就是大套小兩層分發罷了。後者比較容易看到,包名大多數和handler或者action相關,有的messageid寫在類的註解里,有的直接解析類名自動處理。同時,如果是後者,那麼肯定是在server.start()方法里執行到解析類名自動註冊的操作。

隨便找一個業務處理的hander/action,肯定能夠看到它的響應操作。如果沒有,就再找一個。找到網路回應請求的操作,就可以看到如何進行壓包和發送了。這一塊不是很重要,大致了解一下就行了,東西不複雜。

看完了整個網路層,整個伺服器的框架就可以說大致的有個了解了。接下來要看的是工具包,很多框架會提供自帶的工具包,來解決語言沒有提供的特性。為了保持代碼的一致,最好先看一遍工具包,不需要看具體的實現,要去了解有哪些工具,免得自己造輪子。

工具包看完了之後,就是去看各個服務的初始化了,想要了解哪塊功能,就看哪塊的服務,具體的方法也都是和上面一樣,看啟動方法,然後了解它都做哪些處理,可以啟動一個客戶端打斷點跟著跑。

看完具體的業務層之後,就需要看數據持久化了。有的伺服器框架封裝的比較徹底,DB層不需要維護,只需要在類里寫上各種註解就能自動持久化。有的需要手動寫sql,還得手動進行持久化。具體的操作就是去找到需要操作資料庫的業務(比如登錄註冊),然後看它如何進行存取資料庫。比較常見的是上線取數據,下線才保存數據。有些會在main方法里啟動定時器,每隔多久自動保存一次所有的數據防止崩潰丟失。

新手看完了這些,如果上級安排一個任務,就可以仿造著之前有的代碼,搬過來修修補補就能快速實現功能了。


推薦閱讀:

保護 Web 伺服器的安全
自己家裡搭建NAS伺服器有什麼好方案?(轉載)
九個可能危害雲伺服器安全的因素
浪潮伺服器銷量全球前三
伺服器為什麼託管到機房更好?

TAG:遊戲伺服器 | 伺服器 |