hadoop rpc使用java nio編寫,達到高性能,輕量級,可控性。 主要分為四層:序列化層,函數調用層,網絡傳輸層,伺服器端處理架構
序列化層:實作writable接口
函數調用層:java反射機制和動态代理實作函數調用
網絡傳輸層:使用socket機制
伺服器端處理架構:基于reactor設計模式的事件驅動i/o模型
1.定義一個協定,實作versionedprotocol接口,
2.實作rpc協定
3.服務端開啟服務
1.根據接口,遠端調用
我們來逐行分析代碼
getproxy方法,通過動态代理,将testprotocol的調用交由rpc.invoker管理,所有對testprotocol的方法調用,都将交由rpc.invoker的invoke()方法處理。
rpc.invoker将函數調用資訊(函數名、函數參數清單等)打包成可序列化的rpc.invocation對象,由ipc.client發起連結
用connectionid辨別一個連結,同一個inetsocketaddress将共享同一個連結
連結被封住成connection,每個方法調用都被封裝成一個call,connection維護一個call的hashmap
hadoop采用master/slave結構,ipc.server采用了線程池、事件驅動和reactor設計模式來提高并發性。
ipc.server是一個虛類
1.單線程listener監聽用戶端請求,從reader線程池中取出reader線程處理請求,reader讀取用戶端的調用請求并放入callqueue隊列
2.handler從callqueue隊列中取出call,執行函數調用,傳回結果
3.如果函數調用傳回的結果過大或者網絡異常,,由單線程respondeer使用異步方式繼續發送未發送完成的結果 詳細分析代碼:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gDN2UTOyETM1ITMwQTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
ipc.server.listener類
ipc.server.listener.reader類
ipc.server.handler類,調用ipc.rpc.server.call()來執行遠端調用,将結果傳回給用戶端、