設計乙個分布式RPC框架

2021-09-12 16:53:34 字數 2242 閱讀 8244

提前先祝大家春節快樂!好了,先簡單聊聊。

我從事的是大資料開發相關的工作,主要負責的是大資料計算這塊的內容。最近hive集群跑任務總是會出現thrift連線hs2相關問題,研究了解了下內部原理,突然來了興趣,就想著自己也實現乙個rpc框架,這樣可以讓自己在設計與實現rpc框架過程中,也能從中了解和解決一些問題,進而讓自己能夠更好的發展(哈哈,會不會說我有些劍走偏鋒?不去解決問題,居然研究rpc。別急,這類問題已經解決了,後續我也會發文章詳述的)。

原理圖上我已經標出來流程序號,我們來走一遍:

由此可見,主要需要rpc負責的是2~9這些步驟,也就是說,rpc主要職責就是把這些步驟封裝起來,對使用者透明,讓使用者像呼叫本地服務一樣去使用。

rpc架構圖如下:

由架構圖,我們知道rpc是c/s結構的。

單機版的話比較簡單,不需要考慮負載均衡(也就沒有zookeeper),會簡單很多,但是只能用於本地測試使用。而rpc整體的思想是:為客戶端建立服務**類,然後構建客戶端和服務端的通訊通道以便於傳輸資料,服務端的話,就需要在接收到資料後,通過反射機制呼叫本地服務獲取結果,繼續通過通訊通道返回給客戶端,直到客戶端獲取到資料,這就是一次完整的rpc呼叫。

可以採用jdk原生的proxy.newproxyinstance和invocationhandler建立乙個**類。詳細細節網上部落格眾多,就不展開介紹了。當然,也可以採用cglib位元組碼技術實現。

客戶端通過socket和服務端建立通訊通道,保持連線。可以通過構建好的socket獲取objectinputstreamobjectoutputstream。但是有一點需要注意,如果client端先獲取objectoutputstream,那麼服務端只能先獲取objectinputstream,不然就會出現死鎖一直無法通訊的。

服務端根據請求各項資訊,獲取method,在service例項上反向呼叫該方法。

我們先從頂層架構來進行設計實現,也就是技術選型後的rpc架構圖。主要涉及了借助於,zookeeper實現的服務註冊於發現。

當server端啟動後,自動將當前server所提供的所有帶有@znsservice註解的service impl註冊到zookeeper中,在zookeeper中儲存資料結構為 ip:httpport:acceptorport

當client端啟動後,根據掃瞄到的帶有@znsclient註解的service inte***ce從zookeeper中拉去service提供者資訊並快取到本地,同時在zookeeper上新增這些服務的監聽事件,一旦有節點發生變動(上線/下線),就會立即更新本地快取。

client拉取到服務資訊列表後,每個service服務都對應乙個位址list,所以針對連哪個server去呼叫服務,就需要設計乙個負載均衡路由演算法。當然,負載均衡演算法的好壞,會關係到伺服器計算資源、併發量和運算能力。不過,目前開發的rpc框架zns中只內建了random演算法,後續會繼續補充完善。

當server端啟動後,將同時啟動乙個acceptor長連線線程,用於接收外部服務呼叫請求。內部包含了編譯碼以及反射呼叫本地服務機制。

當client端發起乙個遠端服務呼叫時,znsrequestmanager將會啟動乙個connectoracceptor進行連線,同時會儲存通道資訊channelholder到內部,直到請求完成,再進行通道資訊銷毀。

為了保證一定的請求併發,所以對服務呼叫請求進行了池化管理,這樣可以等到訊息返回再進行處理,不需要阻塞等待。

當client端接收到遠端服務呼叫返回的結果時,直接通知請求池進行處理,no care anything!

本次純屬是在解決thrift連線hs2問題時,突然來了興趣,就構思了幾天rpc大概架構設計情況,便開始每天晚上瘋狂敲**實現。我把這個rpc框架命名為zns,現在已經完成了1.0-snapshot版本,可以正常使用了。在開發過程中,也遇到了一些平時忽略的小問題,還有些是工作工程中沒有遇到或者遺漏的地方。因為是初期,所以會存在一些bug,如果你感興趣的話,歡迎提pr和issue,當然也歡迎把**clone到本地研究學習。雖然就目前來看,想要做成乙個真正穩定可投產使用的rpc框架還有短距離,但是我會堅持繼續下去,畢竟rpc真的涉及到了很多點,只有真正開始做了,才能切身體會和感受到。ya hoh!終於成功實現了v1.0,嘿嘿……

設計乙個分布式RPC框架

提前先祝大家春節快樂!好了,先簡單聊聊。我從事的是大資料開發相關的工作,主要負責的是大資料計算這塊的內容。最近hive集群跑任務總是會出現thrift連線hs2相關問題,研究了解了下內部原理,突然來了興趣,就想著自己也實現乙個rpc框架,這樣可以讓自己在設計與實現rpc框架過程中,也能從中了解和解決...

如何實現乙個高效能分布式 RPC 框架

rpc 框架是大型企業高頻使用的一種中介軟體框架,用於解決分布式系統中服務之間的呼叫問題。rpc 框架設計很多重要的知識點,如執行緒模型 通訊協議設計 同步 非同步呼叫 負載均衡等,對於提高我們的技術綜合能力有非常大的幫助。市面上有較多出名的 rpc 框架,例如 dubbo thrift grpc ...

cola 乙個分布式爬蟲框架

python爬蟲是用python程式語言實現的網路爬蟲,主要用於網路資料的抓取和處理,相比於其他語言,python是一門非常適合開發網路爬蟲的程式語言,大量內建包,可以輕鬆實現網路爬蟲功能。python爬蟲可以做的事情很多,如搜尋引擎 採集資料 廣告過濾等,python爬蟲還可以用於資料分析,在資料...