提前先祝大家春節快樂!好了,先簡單聊聊。
我從事的是大資料開發相關的工作,主要負責的是大資料計算這塊的內容。最近hive集群跑任務總是會出現thrift連線hs2相關問題,研究了解了下內部原理,突然來了興趣,就想著自己也實現乙個rpc框架,這樣可以讓自己在設計與實現rpc框架過程中,也能從中了解和解決一些問題,進而讓自己能夠更好的發展(哈哈,會不會說我有些劍走偏鋒?不去解決問題,居然研究rpc。別急,這類問題已經解決了,後續我也會發文章詳述的)。
原理圖上我已經標出來流程序號,我們來走一遍:
由此可見,主要需要rpc負責的是2~9這些步驟,也就是說,rpc主要職責就是把這些步驟封裝起來,對使用者透明,讓使用者像呼叫本地服務一樣去使用。
rpc架構圖如下:
由架構圖,我們知道rpc是c/s結構的。
單機版的話比較簡單,不需要考慮負載均衡(也就沒有zookeeper),會簡單很多,但是只能用於本地測試使用。而rpc整體的思想是:為客戶端建立服務**類,然後構建客戶端和服務端的通訊通道以便於傳輸資料,服務端的話,就需要在接收到資料後,通過反射機制呼叫本地服務獲取結果,繼續通過通訊通道返回給客戶端,直到客戶端獲取到資料,這就是一次完整的rpc呼叫。
可以採用jdk原生的proxy.newproxyinstance和invocationhandler建立乙個**類。詳細細節網上部落格眾多,就不展開介紹了。當然,也可以採用cglib位元組碼技術實現。
客戶端通過socket和服務端建立通訊通道,保持連線。可以通過構建好的socket獲取objectinputstream
和objectoutputstream
。但是有一點需要注意,如果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
將會啟動乙個connector
與acceptor
進行連線,同時會儲存通道資訊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爬蟲還可以用於資料分析,在資料...