RPC框架利用的Java的反射能力,該RPC框架要求調用的參數和返回結果必須是Java的基本類型,String和Writable接口的實現類,以及元素為以上類型的數組。同時,接口方法應該只拋出IOException異常。
選擇了java,為什麼不用現成的rmi?
答案就是:使用rpc可以對連接進行精細控制、超時、緩沖區處理等進行精確處理,rmi在這方面難以提供。
Dynamic Proxy其實就是一個典型的Proxy模式,它不會替你作實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。這個handler,在Hadoop的RPC中,就是Invoker對象。
動態代理例子:http://www.linuxidc.com/Linux/2013-02/80114.htm
Client和Server之間的控制信息是通過RPC機制完成的。DataNode端是通過獲得NameNode的代理,通過該代理和NameNode進行通信的。Client通過RPC機制、動態代理機制調用Server端的方法,Server端將方法調用結果返回給Client。
RPC.Invocation是一個方法調用類。包含以下變量:
繼承了Writeable,所以可以用於序列化傳輸。readFields和write方法分別借助ObjectWriteable類對上述三種變量的序列化和反序列化。
RPC.ClientCache是客戶端的緩存,用於維護客戶端集合,定義如下:
private Map<SocketFactory, Client> clients = new HashMap<SocketFactory, Client>();
在getClient中,如果SocketFactory對應的client不存在,就new一個,並將其加入clients中。
VersionMismatch是一個異常類,當Client的協議版本與Server的協議版本不匹配時會拋出此異常。
InvocationHandler 是代理實例的調用處理程序實現的接口。