Dubbo 回撥用服務的處理邏輯
處理方式
以Netty為例,首先在初始化NettyClient或者NettyServer的時候,根據URL中的codec引數選擇具體的codec類,預設使用DubboCountCodec類。
在啟動Netty客戶端或者服務端的時候在Netty的pipeline中添加了編解碼器。
- decoder為解碼器,是一個SimpleChannelUpstreamHandler,從Socket到Netty中的時候,需要解碼,也就是接收訊息的時候,需要解碼。
- encoder為編碼器,是OneToOneEncoder,這個類實現了ChannelDownstreamHandler,從傳送訊息的時候,需要編碼。
- nettyHandler實現了ChannelUpstreamHandler、ChannelDownstreamHandler兩個,上下的時候都需要處理。
接收訊息的時候,會先執行decoder,然後執行nettyHandler.
傳送訊息的時候,會先執行nettyhandler,然後執行encoder。
客戶端傳送呼叫請求的邏輯
1.選擇NettyHandler,writeRequested方法,從而decodeHandler的sent方法,該handler未實現sent方法,因而呼叫父類的方法。
2.執行encoder,呼叫鏈為NettyCodecAdapter$InternalEncoder.encode->DubboCountCodec.encode->DubboCodec.encode->ExchangeCodec.encode->DubboCodec.encodeRequestData,在該呼叫鏈中,最終呼叫CallbackServiceCodec.encodeInvocationArgument方法,在該方法中檢查遠端方法的引數是否為回撥用函式,若是,則將客戶端中呼叫遠端方法時傳入的回撥用函式引數暴露出來提供服務端呼叫,大致邏輯:
(1)生成一個唯一的例項ID
(2)代理工廠建立Invoker代理
(3)呼叫Protocol.export方法。
服務端接受客戶端請求的處理邏輯
1.先執行decoder,呼叫鏈NettyCodecAdatper$InternalDecoder.messageReceived->DubboCountCodec.decode->DubboCodec.decode-->DubboCodec.decodeBody->DecodeableRpcInvocation.decode->...->CallbackServiceCodec.decodeInvocationArgument,在這個方法中判斷該呼叫的方法中引數是否為回撥用函式,若是則呼叫CallbackServiceCodec.referOrdestroyCallbackService方法完成對客戶端暴露的回撥函式 的引用,大致邏輯:
(1)初始化ChannelWrapperInvoker物件,其中將與客戶建立的通道Channel物件中引數之一,此Channel引數是回撥用函式訊息傳送的重要通道,在觸發回撥用工作時,利用此Channel建立HeaderExchanageClient物件,由該物件完成回撥用的請求工作,具體的邏輯與消費端發起的遠端呼叫的邏輯基本一致。
(2)建立服務類的本地代理,即為ChannelWrapperInvoker物件建立代理,將此代理作為服務端方法中回撥引數的請求值,從而在服務端的方法實現中就可以使用該代理完成遠端回撥用工作。
(3)將DecodeableRpcInvocation類中的hasDecoded變數設定為true,以免在Decodehandler中重複執行解碼工作。
最後歡迎大家訪問我的個人網站:1024s