Hadoop源碼分析----RPC反射機制

有了Client 和Server,很天然就能RPC 啦。下面輪到RPC.java 啦。
通常來講,分佈式對象通常都會要求根據接口生成存根和框架。如CORBA,能夠經過IDL,生成存根和框架。可是,在
org.apache.hadoop.rpc,咱們就不須要這樣的步驟了。上類圖。
 

爲了分析Invoker,咱們須要介紹一些Java 反射實現Dynamic Proxy 的背景。
Dynamic Proxy 是由兩個class 實現的:java.lang.reflect.Proxy 和java.lang.reflect.InvocationHandler,後者是一個
接口。所謂Dynamic Proxy 是這樣一種class:它是在運行時生成的class,在生成它時你必須提供一組interface 給它,而後
該class 就宣稱它實現了這些interface。
這個Dynamic Proxy 其實就是一個典型的Proxy 模式,它不會替你做實質性的工做,在生成它的實例時你必須提供一個handler,
由它接管實際的工做。這個handler,在Hadoop 的RPC 中,就是Invoker 對象。
咱們能夠簡單地理解:就是你能夠經過一個接口來生成一個類,這個類上的全部方法調用,都會傳遞到你生成類時傳遞的
InvocationHandler 實現中。
在Hadoop 的RPC 中,Invoker 實現了InvocationHandler 的invoke 方法(invoke 方法也是InvocationHandler 的惟一方法)。
Invoker 會把全部跟此次調用相關的調用方法名,參數類型列表,參數列表打包,而後利用前面咱們分析過的Client,經過socket
傳遞到服務器端。就是說,你在proxy 類上的任何調用,都經過Client 發送到遠方的服務器上。
Invoker 使用Invocation。Invocation 封裝了一個遠程調用的全部相關信息,它的主要屬性有: methodName,調用方法名,
parameterClasses,調用方法參數的類型列表和parameters,調用方法參數。注意,它實現了Writable 接口,能夠串行化。
RPC.Server 實現了org.apache.hadoop.ipc.Server,你能夠把一個對象,經過RPC,升級成爲一個服務器。服務器接收到的請求(經過Invocation),
解串行化之後,就變成了方法名,方法參數列表和參數列表。利用Java 反射,咱們就能夠調用對應的對象的方法。調用的結果再經過socket,返
回給客戶端,客戶端把結果解包後,就能夠返回給Dynamic Proxy 的使用者了。java

更多分享請關注:http://bbs.superwu.cn web

關注超人學院微信二維碼:apache

相關文章
相關標籤/搜索