1. 程式人生 > >嘗試模擬實現RMI(一)

嘗試模擬實現RMI(一)

關於RMI的基礎理解在我之前的文章中有所介紹。點我

這次是根據RMI的基礎理解從而想到嘗試模擬實現RMI。

大體思路:

  1. 我們的目標是建立RpcServer以及RpcClient後,從RpcClient中得到相應介面或類的代理物件,並且執行介面中的方法。
  2. 而這的執行是通過代理機制,把需要執行的方法和引數在通過RpcClientExecutor傳送到RpcServerExecutor中執行。
  3. 再將執行後的結果發回RpcClientExecutor,從而得到執行後的結果,即實現了遠端方法的呼叫。

問題:

應該採用哪種代理機制?

在產生代理前判斷引數是介面還是類,若是介面則採用JDK代理的方式,若是類則採用CGLib代理的方式。

伺服器端如何通過發過來的方法和引數執行該方法?

  1. 建立一個RpcBeanFactory,用來註冊Bean以及獲得Bean,其中提供一個Map,以唯一Id為鍵,以RpcBeanDefination為值。RpcBeanDefination由類、物件和方法組成。
  2. 註冊Bean當然可以提供多種方法,如掃描註解註冊、XML註冊、呼叫專門用來註冊的方法註冊等。
  3. 註冊之後,當RpcClientExecutor發過來引數和唯一標識Id時候,RpcServerExecutor通過發過來的Id定位相關類、物件方法並且結合發過來的引數反射執行該方法,再將結果返回。

為什麼要使用代理機制?

使用代理是為了在呼叫這個類的代理物件的方法時候攔截這個方法,將執行所需要的這個方法的引數、類、方法名傳輸給rpc伺服器端執行。

如何保證唯一Id?

可以通過方法的toString().hashCode()確定唯一rpcBeanId。