經驗整理-1-源碼截圖篇-dubbo-zookeeper-RPC-100-@

先上原理圖

 

-----Dubbo中的RPC實現原理源碼分析----

一、註冊與訂閱過程---都是和zk交互

在每個zk客戶端(生產者和消費者)啓動時,會調用zk註冊類的構造函數,初始化就監聽連接事件:
分爲註冊與訂閱兩種連接事件。

1)註冊----provider如何註冊服務到zookeeper;

加上註解後,啓動會從ServiceBean進入,仔細跟代碼,最後會走到創建zk持久節點和臨時節點的方法。節點創建會被zk客戶端監聽到。
調用鏈爲RegistryProtocol#doRefer–>RegistryProtocol#doRefer–>FailbackRegistry#register–>FailbackRegistry#doRegister–>ZookeeperRegistry#doRegister–>zkClient#create
同時,會把服務放進暴露的服務列表中


2)訂閱----consumer如何從zookeeper拉取provider信息;

消費者一樣,需要去zk上註冊節點,此爲訂閱。
調用鏈爲RegistryProtocol#doRefer–>RegistryProtocol#doRefer–>FailbackRegistry#register–>FailbackRegistry#doRegister–>ZookeeperRegistry#doRegister–>zkClient#create
 

二、rpc請求過程---異步+Netty長連接

異步:每個RPC請求線程A都有一個唯一的id,封裝在future對象中。
RPC請求的時候,會將此id也發送給provider,然後線程A會lock等待;
provider處理完請求後會將此id和返回結果一同返回給consumer;
consumer收到返回信息以後解析出id,找到對應的請求線程A,激活線程A,返回結果。

單一Netty長連接:上面的異步過程是每一個調用業務線程A,它們只進行到調用提供者時,就進入lock了。真正去調用提供者的是一個多個線程A共享的一個單一Netty長連接。Netty本身是異步的,只是通過監聽回調實現了同步。


客戶端接收到服務端的RPC調用響應,從底層到頂層依次是NettyClient獲取NettyServer的響應,NettyClient將響應向上傳遞給HeaderExchangeHandler的received方法:


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章