由OpenStack引發的RPC深入剖析(未完成)

2021-10-05 08:11:29 字數 1041 閱讀 2543

簡單的理解是乙個節點請求另乙個節點提供的服務。

如果需要將本地student物件的age+1,可以實現乙個addage()方法,將student物件傳入,對年齡進行更新之後返回即可,本地方法呼叫的函式體通過函式指標來指定。

上述操作的過程中,如果addage()這個方法在服務端,執行函式的函式體在遠端機器上,如何告訴機器需要呼叫這個方法呢?

1.首先客戶端需要告訴伺服器,需要呼叫的函式,這裡函式和程序id存在乙個對映,客戶端遠端呼叫時,需要查一下函式,找到對應的id,然後執行函式的**。

2.客戶端需要把本地引數傳給遠端函式,本地呼叫的過程中,直接壓棧即可,但是在遠端呼叫過程中不再同乙個記憶體裡,無法直接傳遞函式的引數,因此需要客戶端把引數轉換成位元組流,傳給服務端,然後服務端將位元組流轉換成自身能讀取的格式,是乙個序列化和反序列化的過程。

3.資料準備好了之後,如何進行傳輸?網路傳輸層需要把呼叫的id和序列化後的引數傳給服務端,然後把計算好的結果序列化傳給客戶端,因此tcp層即可完成上述過程,grpc中採用的是http2協議。

// student student = call(serveraddr, addage, student)

1. 將這個呼叫對映為call id。

2. 將call id,student(params)序列化,以二進位制形式打包

3. 把2中得到的資料報傳送給serveraddr,這需要使用網路傳輸層

4. 等待伺服器返回結果

5. 如果伺服器呼叫成功,那麼就將結果反序列化,並賦給student,年齡更新。

1. 在本地維護乙個call id到函式指標的對映call_id_map,可以用mapcallidmap

2. 等待服務端請求

3. 得到乙個請求後,將其資料報反序列化,得到call id

4. 通過在callidmap中查詢,得到相應的函式指標

5. 將student(params)反序列化後,在本地呼叫addage()函式,得到結果

6. 將student結果序列化後通過網路返回給client

由 引發的思考

前陣子在乙個移動專案中,通過 的方式 繫結click 事件來提交乙個表單,由於表單資訊比較敏感,於是採用的post 同步提交的方式,原本到也沒有什麼。後來萬惡的pm說 你這個按鈕呀,要固定在底部比較好 於是乎就通過 position fixed 固定到底部了。那麼,問題來了 在ios 下,虛擬鍵盤是...

由Typedef引發的問題

由typedef 引發的問題 自 用來宣告乙個別名,typedef 後面的語法,是乙個宣告。本來筆者以為這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹 typedef 的時候通常會寫出如下形式 typedef int para 這種形式跟...

由mmap引發的SIGBUS

一直以來都覺得使用mmap讀檔案是非常高效 非常優雅的做法 參見 從 read 看系統呼叫的耗時 mmap之後,就可以通過記憶體訪問的方式訪問到檔案裡的內容,省去了read這樣的系統呼叫。卻不曾想過,mmap以後,如果讀檔案出錯會發生什麼 今晚看到一篇介紹apache bug的文章,裡面說到,apa...