嘗試模擬實現RMI(一)
阿新 • • 發佈:2018-12-23
關於RMI的基礎理解在我之前的文章中有所介紹。點我
這次是根據RMI的基礎理解從而想到嘗試模擬實現RMI。
大體思路:
- 我們的目標是建立RpcServer以及RpcClient後,從RpcClient中得到相應介面或類的代理物件,並且執行介面中的方法。
- 而這的執行是通過代理機制,把需要執行的方法和引數在通過RpcClientExecutor傳送到RpcServerExecutor中執行。
- 再將執行後的結果發回RpcClientExecutor,從而得到執行後的結果,即實現了遠端方法的呼叫。
問題:
應該採用哪種代理機制?
在產生代理前判斷引數是介面還是類,若是介面則採用JDK代理的方式,若是類則採用CGLib代理的方式。
伺服器端如何通過發過來的方法和引數執行該方法?
- 建立一個RpcBeanFactory,用來註冊Bean以及獲得Bean,其中提供一個Map,以唯一Id為鍵,以RpcBeanDefination為值。RpcBeanDefination由類、物件和方法組成。
- 註冊Bean當然可以提供多種方法,如掃描註解註冊、XML註冊、呼叫專門用來註冊的方法註冊等。
- 註冊之後,當RpcClientExecutor發過來引數和唯一標識Id時候,RpcServerExecutor通過發過來的Id定位相關類、物件方法並且結合發過來的引數反射執行該方法,再將結果返回。
為什麼要使用代理機制?
使用代理是為了在呼叫這個類的代理物件的方法時候攔截這個方法,將執行所需要的這個方法的引數、類、方法名傳輸給rpc伺服器端執行。
如何保證唯一Id?
可以通過方法的toString().hashCode()確定唯一rpcBeanId。