1. 程式人生 > >hbase之RPC呼叫流程簡介

hbase之RPC呼叫流程簡介

首先分析hbase中對於master協議的呼叫: 在ConnectionImplementation的方法getKeepAliveMasterService被呼叫時,會通過MasterServiceStubMaker.makeStub()方法構建成員變數masterServiceState.stub。 在MasterServiceStubMaker.makeStub()方法中,通過間接呼叫rpcClient.createBlockingRpcChannel來構建protobuf的中BlockingStub所需要的channel。該channel的實際型別是BlockingRpcChannelImplementation,他實現了BlockingRpcChannel介面的callBlockingMethod。在具體方法中的呼叫是通過rpcClient.callBlockingMethod來實現的。 AbstractRpcClient.callMethod 該方法由AbstractRpcClient.callBlockingMethod間接呼叫。 在其內部,首先構造了一個Call物件,實現對傳送資料的封裝以及返回時對回撥函式的呼叫。 然後構建ConnectionId。 通過getConnection獲取一個已存在的或新構建的NettyRpcConnection(預設實現)。 最後呼叫NettyRpcConnection中的sendRequest。 通過呼叫HBaseRpcController中的notifyOnCancel實現對內部構建的CancellationCallback.run的呼叫。如果channel為null,會對netty客戶端的重新構建。 然後呼叫wirte方法實現對資訊的傳送。 hbase中對於Admin,Client協議的呼叫方式也都與此類似。 接下來,我們來介紹hbase服務端對於客戶端請求的接受: 在NettyRpcServer的初始化過程中,實現了對netty服務端的構建。其中,會將NettyRpcServerRequestDecoder加入到pipeline。 而NettyRpcServerRequestDecoder正是實現對客戶端請求的處理。 在NettyRpcServerRequestDecoder的channelRead方法,依次呼叫了NettyServerRpcConnection.process,ServerRpcConnection.processOneRpc,ServerRpcConnection.processRequest。 在ServerRpcConnection.processRequest方法中,主要構建了一個ServerCall,用於接下來對遠端方法的服務端呼叫。 接下來呼叫SimpleRpcScheduler.dispatch,將CallRunner.callTask放入相應的佇列中。 然後,在RpcExecutor中一開始建立的一批Handler中,會不斷地從佇列中取值。也就是呼叫Handler.run。接著回撥CallRunner.run,最後呼叫RpcServer.call實現對 遠端方法的本地呼叫Message result = call.getService().callBlockingMethod(md, controller, param)。  相比hadoop RPC的呼叫,hbase融入了netty的呼叫,實現上比hadoop的稍微複雜一點。 本人原創,使用請標明源連結。 小編以後每週會更新hbase的原始碼資訊,大家可以把需要的方向私信我的郵箱[email protected]。