1. 程式人生 > >我開始抄程式碼來學程式設計

我開始抄程式碼來學程式設計

之前研究 Hadoop 原始碼,把 hadoop-common 模組下的 RPC 模組原始碼通讀一遍,又花了 3 個月抄了一遍 Hadoop RPC 程式碼,學到很多東西。我覺得學習程式設計最有效的方式就是抄程式碼,我覺得這個過程對正在學程式設計的朋友很有幫助,所以想做成教程,以下是週末寫的一個開頭,後續教程的形式以及進展會發布在公眾號,有興趣的朋友歡迎文末關注。

1. 起源

故事得從19年上半年說起,那時候我正打算研究一下Hadoop原始碼。 現在大家都聽說過Hadoop,它是一個分散式儲存和計算的框架。作為分散式系統,節點之間的通訊、互動式必不可少的。Hadoop自己實現了RPC(Remote Procedure Call,遠端過程呼叫)模組來滿足這樣的需求。帶著好奇,我便閱讀了整個Hadoop RPC模組的原始碼,讀完後發現這個模組設計的非常好,與其他模組無耦合,完全可以獨立出來當成一個獨立的框架。為了能夠學習相關的程式設計知識,同時還可以看到Apache 頂級開源專案的程式碼如何編寫的,因此我便把Hadoop RPC模組做成教程。

雖然這個專案是實現RPC功能,但我覺得我們重點不應該過多關注RPC本身,而應該重點學習RPC所涉及的客戶端開發、服務端開發、網路程式設計、多執行緒、併發程式設計、設計模式等核心知識,尤其是對於剛學習Java沒有接觸線上實戰專案的朋友,掌握好了這些知識,寫其他專案也會更有思路。

2. 起名

為了能讓不熟悉Hadoop的朋友也能學習本教程,因此我們將Hadoop RPC賦予了新的業務含義。

假設我們有這樣一個場景,公司開發一個新的資料庫,這個資料庫的底層可能是Mysql,也可能是MongoDB,甚至可能是公司自研的資料庫技術,無論是什麼,資料庫都可以作為服務端。作為使用者來說,資料庫底層用了什麼技術並不關係,而是關心怎麼使用。資料庫需要提供了API方便使用者呼叫,因此就需要有客戶端。

實現連線客戶端請求和服務端響應的技術就是RPC。我給這個專案起了一個名字叫Manis,那麼,資料庫的名字便是ManisDb。工作中我們也比較鼓勵大家給自己的專案起個名字,有了名字,它就像自己的孩子一樣,我們會更有責任心把它做好。

3. 優勢

優勢都是相對的。Hadoop RPC 相比於一般的實戰專案來說,它是經過線上檢驗的,Hadoop叢集規模最大達到上萬臺,單一個RPC模組完全可以獨立出來用於實戰。同時,我們還可以積累頂級開源專案的開發經驗,大到架構設計,小到設計模式,程式碼規範。RPC在客戶端開發、服務端開發、網路程式設計三方面都有涉及,且都是重點內容。

Hadoop RPC相比於原始碼分析類的教程來說,優勢在於實戰意義比較強。我們會按照Hadoop RPC原始碼把我們的野生專案Manis從0到1完整的敲一遍,還原度為95%。解釋下為什麼不是100%,一方面為了突出重點,我會把不太重要、不是很核心的技術捨棄掉。另一方面為了符合新的業務定義,我會做一些改進,而不是照搬Hadoop RPC。比如:Hadoop RPC到了2.6版本只支援Protobuf序列化協議,但為了體現高擴充套件以及模組間的低耦合,Manis支援了多種序列化協議。

在寫教程之前,我花了大概3個月時間先對照Hadoop RPC原始碼把Manis敲出來了。學會了Manis後,你完全有能力閱讀Hadoop RPC的原始碼,這也算是面試的加分項吧。可能有些讀者覺得這種方式比較LOW,但我還是相信馬化騰說的“抄程式碼培養感覺”,寫程式碼好比學字畫,不臨摹好的作品怎麼學習別人的優點。真正要把看到的東西變成自己的,最終紮實的方式就是自己走一遍。至於Manis中被捨棄的部分我會在教程中說明,必要的時候會擷取Hadoop原始碼一起分析。

4. Manis架構圖

圖1-1是Manis的架構圖,基本上是一般的RPC架構圖。

圖1-1 Manis架構圖

5. Manis核心元件時序圖

 

圖1-2 Manis 核心元件時序圖

6. Manis核心元件概念

結合圖1-2對Manis中涉及的核心的元件概念進行說明。

ManisDb:圖中沒有表示,它代表資料庫,負責啟動服務端(即ipc.Server類),這裡需要說明一下我們的重點在於RPC開發,這裡的資料庫只是舉一個例子,不會涉及真正的資料庫開發。

ManisClient:提供給普通使用者的客戶端類,用於對ManisDb進行增刪改查,它使用Protobuf協議與ManisDb進行通訊。

Manager:提供給管理員的客戶端類,用於對ManisDb進行管理,它使用Serializable協議(Java原生的序列化方式)與ManisDb進行通訊

ProtoBufRpcEngine:支援Protobuf協議的RPC引擎,它定義了兩個內部類——Invoker類和ProtoBufRpcInvoker類。Invoker類用於封裝客戶端的呼叫請求,並使用Protobuf協議序列化。ProtoBufRpcInvoker類用於完成客戶端請求的方法呼叫(服務端調)。

SerializableRpcEngine:支援Serializable協議的RPC引擎,它定義兩個內部類——Invoker類和SerializableRpcInvoker類。Invoker類用於封裝客戶端的呼叫請求,並使用Serializable協議序列化。SerializableRpcInvoker類用於完成客戶端請求的方法呼叫(服務端調)。

Client:建立與服務端的socket連線,接收客戶端呼叫,併發送呼叫請求給服務端,等待服務端返回並將結果返回。

ipc.Server:該類定義在ipc包下面,通過Reactor模式接收並處理客戶端請求,最終呼叫ProtoBufRpcInvoker或SerializableRpcInvoker的方法獲得結果,並返回給客戶端。

 

公眾號「渡碼」,分享更多高質量內容

相關推薦

開始程式碼程式設計

之前研究 Hadoop 原始碼,把 hadoop-common 模組下的 RPC 模組原始碼通讀一遍,又花了 3 個月抄了一遍 Hadoop RPC 程式碼,學到很多東西。我覺得學習程式設計最有效的方式就是抄程式碼,我覺得這個過程對正在學程式設計的朋友很有幫助,所以想做成教程,以下是週末寫的一個開頭,後續教程

比爾·蓋茨都去講計算機課程了,還有什麼理由不程式設計

“計算機教育要從娃娃抓起”已然深入人心。全世界似乎都都這個共識,為了提起孩子們的興趣,大家都嘗試了各種方法。昨天,美國著名的非盈利機構 Code.org 通過官方 Twitter 釋出了一段小視訊,邀請了業界知名的人物來講課。新系列視訊的大咖主講們通過幾分鐘的短視訊,用淺顯易

這個從開始玩linux整理的常用的一些筆記,可能一些地方還不夠全,會慢慢更新的

clear 清屏   ll/ls 列出當前目錄下的所有檔案及目錄 pwd 檢視當前所在目錄 cd 切換目錄 eg:  cd /root 切換到根目錄下的root目錄下  cd ./abc/ 切換到當前目錄下的abc目錄  cd .. 切換到上一級目錄 touch 建

小明的爺爺108歲了,而30歲才開始程式設計

導語:“種一顆樹最好的時間是十年前,其次是現在”。去年,C君看我跟一堆程式碼較勁的時候,忍不住問我:你都30歲了,學程式設計來得及嗎?我想了半天,最後用了一句知乎上面看到的話來回答:種一顆樹最好的時間是十年前,其次是現在。前幾天看到一個很有趣的新聞:日本一位82歲老奶奶自學程

Spring船新版推出的WebFlux,是兄弟就

watermark stat ren 開啟 lan append 做的 result ror 初識SpringWebFlux Spring WebFlux是Spring Framework 5.0中引入的新的響應式Web框架。 與Spring MVC不同,它不需要Servl

如何程式設計的一些學習感悟

    入坑已經有一年之久,今天來談談自己的學習心得也希望能幫到更多的人,如果有講的不好或者不準確的地方還請各位大神指正,本文僅僅針對於想要入行的朋友說的。  廢話不說現在進入正題,對於如何學習有以下三點要說     第一 瞭解語言 &nb

HTML複習鞏固(1)——跟一起程式設計

一、HTML簡介  1、 先上一個簡單的HTML的小demo爽一下。 <!DOCTYPE html> <html> <head> <meta charset="gbk"> <title>W3Cschool</title> <

一個使用正則表示式治口吃的問題。將“....要要要...要...學學...編編編...程”抽取為“程式設計

import java.util.TreeSet; public class RegexTest { public static void main(String[] args) { Method1();//1.治口吃 } //1.治口吃 private static voi

公司不請保潔安排員工打掃衛生,程式設計師:是敲程式碼不是掃地的

公司提供平臺與好的辦公環境,員工依託平臺為公司創造利益的同時也收穫自己的勞動所得和個人價值的實現,這就是公司與員工的契約關係。對於公司而言無權要求員工做與工作無關的事,作為員工則有權拒絕合同之外要求。 就有一名程式設計師發帖吐槽自己現在公司老闆要求員工充當“保潔員”的無

網路——網路中的A類、B類、C類地址的劃分

IP地址有三種基本型別,由網路號的第一組數字來表示。 A類地址的第一組數字為1~126。注意,數字0和 127不作為A類地址,數字127保留給內部回送函式,而數字0則表示該地址是本地宿主機,不能傳送。 B類地址的第一組數字為128~191。 C類地址的第一組數字為192~223。 例

網路——網路管理的五大基礎功能

五大基礎功能 在實際網路管理過程中,網路管理具有的功能非常廣泛,包括了很多方面。 網路管理的五大功能是: 故障管理(Fault Management) 故障管理是網路管理中最基本的功能之一。當網路中某個組成失效時,網路管理器必須迅速查詢到故障並及時排除。 網路故障管理包括故

網路——C/S與B/S詳解

1.C/S結構,即Client/Server(客戶機/伺服器)結構,是大家熟知的軟體系統體系結構,通過將任務合理分配到Client端和Server端,降低了系統的通訊開銷,可以充分利用兩端硬體環境的優勢。 2.B/S結構,即Browser/Server(瀏覽器/伺服器)結構,是隨著Interne

網路——資料鏈路層的兩個子層

1.LLC子層(logical link control):;邏輯鏈路控制為上層協議提供SAP服務訪問點,併為資料加上控制資訊,其協議為802.2,為乙太網和令牌環網提供了通用功能 2.MAC子層(media access control):介質訪問控制負責MAC定址和定義介質訪問控制方法

網路——三種資料通訊方式

對於點對點之間的通訊,按照訊息傳送的方向與時間關係,通訊方式可分為單工通訊、半雙工通訊及全雙工通訊三種。 單工通訊只支援資料在一個方向上傳輸,又稱為單向通訊。如無線電廣播和電視廣播都是單工通訊。 半雙工通訊允許資料在兩個方向上傳輸,但在同一時刻,只允許資料在一個方向上傳輸,它實際上是一種可切

網路——6個通用頂級域

6個通用頂級域 .com- 供商業機構使用,但無限制最常用,被大部分人熟悉和使用 .net- 1985年1月,原供網路服務供應商使用,現無限制 .org- 1985年1月,原供不屬於其他通用頂級域類別的組織使用,現無限制 .edu / .gov / .mil- 1985年

網路——哪些網路資源可以共享

資源共享是現代計算機網路的最主要的作用,它包括軟體共享、硬體共享及資料共享。 軟體共享是指計算機網路內的使用者可以共享計算機網路中的軟體資源,包括各種語言處理程式、應用程式和服務程式。 硬體共享是指可在網路範圍內提供對處理資源、儲存資源、輸入輸出資源等硬體資源的共享,特別是對一些高階和昂貴的裝置,如

從Python開始程式設計(高清版)PDF

從Python開始學程式設計(高清版)PDF百度網盤連結:https://pan.baidu.com/s/1BjpyjYmCcwKvgXjW7j9S6w 提取碼:gzgi 複製這段內容後開啟百度網盤手機App,操作更方便哦內容簡介 · · · · · · 改編自Vamei部落格的《Python快速教程》。本書

30歲開始程式設計什麼語言比較好?

以下是2018年最大的開發者調查/總結的程式語言。想必對你選擇程式語言會有很大的參考價值!   1. JavaScript   它是幹什麼用的?雖然JavaScript起源於一種網路指令碼語言,但今天它通過Node-RED用於從node.js後端伺服器到物聯網裝置的所有內容。也就是

有獎徵文 | 《在51CTO微職位軟考...》徵文大賽開始

恭喜各位同學了!此時此刻,你已經走出了2018年下半年軟考的考場,完成了人生又一階段的努力和目標。這幾個月、或半年、或一年,有過汗水、也有過淚水,有過攻克一個難點或難題的喜悅,也有過想要放棄的逃避時刻。但是,堅持到走進考場考完試,你已經是個英雄了~ 你們的努力我們都看在眼裡,此刻的你,也一

從零開始的typescript1 字串 預設引數與任意引數 後端希望用ts 好吧 吧 順便學學oop思想

首先要安裝typescript  cnpm install typescript -g // 執行方法 tsc index.ts 這樣太麻煩了 所以用webstome  比較好 https://blog.csdn.net/voke_/article/de