https://www.b5b6.com如何設計一個rpc框架?
RPC框架全稱叫“Remote Procedure Call”-遠程過程調用。
在分布式應用大放異彩的今天,軟件研發工作(微服務、中臺)是一定離不開分布式,既然說到分布式就一定離不開RPC,所以RPC框架也是廣大https://www.b5b6.com進階路上必須跨過去的一道坎,也是工作中經常會用到的。因此,了解并掌握RPC框架的底層原理和其設計思想也是每一個https://www.b5b6.com的必備技能之一。
業界知名RPC各大互聯網公司都或多或少實現了自己的RPC框架,其中比較出名且常用的有:
阿里巴巴的dubbo:這個大家應該都用到過吧?GitHub地址:https://github.com/apache/dubbo
基于阿里巴巴fork的當當版dubbox:這個貌似也都用到過?在dubbo不死不活的那幾年。GitHub地址:https://github.com/dangdangdotcom/dubbox
谷歌grpc:谷歌版本的rpc,GitHub地址(Java版):https://github.com/grpc/grpc-java
大家可以自己去GitHub上去搜索這三大框架并進行學習。
自己簡單實現一個最基本的RPC框架如果我們自己去實現一個簡單的RPC框架要怎么做?這個時候我們應該意識到我們是在寫一個框架,寫一個框架意味著我們無法再隨意的使用第三方依賴包,也就是除了一些工具類包可以使用,其他的都需要我們用Java一行一行的寫出來。
下面提供一下如何用Java實現一個簡單的RPC功能(談不上框架):
先定義一個RPC接口類,代碼如下圖:
寫Rpc接口類的實現類實現這兩個方法,export方法如下圖:
refer方法:
框架定義完成后,我們開始使用這個框架,先簡單定義一個測試用的服務接口:
實現類:
我們需要寫一個provider把這個服務提供出去,運行這個main方法即可:
寫一個cosumer遠程消費這個服務:
運行這個main方法會輸出:
這樣一個簡單的RPC遠程過程調用就實現了,是不是很簡單?采用Java Socket套接字https://www.52fb.cn和Java自帶的序列化。
設計一個RPC框架需要我們掌握哪些知識?上面簡單實現了一個RPC框架,這個只是實驗性質的編碼,實際上是無法使用的,因為在實際業務中,我們面對的是高并發、多請求。上面的套接字https://www.52fb.cn也是阻塞的,另外序列化也是用的Java自帶的序列化方法。
而了解主流rpc實現原理的同學都知道,每一個rpc框架在性能的考慮上都做到了自己框架的極致,框架本身既要考慮高可擴展的同時又得考慮高性能。
比如在dubbo中,默認使用hessian序列化的方式傳輸網絡數據,同時也實現了主流的集中序列化方式,比如Java自帶的序列化、Kryo序列化、fastJson序列化等方式。底層采用netty去做網絡通信使用非阻塞NIO。注冊中心既有zookeepeer,也支持redis。動態代理采用Javassist等等技術。
所以我們在設計一個rpc框架的時候,首先必須掌握上面說的那些知識,還得要求我們能夠很好的結合每一個技術,做到融匯貫通。
網上也有很多關于RPC相關知識的文章,也有dubbo、dubbox、grpc等rpc框架的源碼解析文章,建議大家可以深耕這一塊,徹底摸透掌握這塊的實現原理。
以上就是我個人關于“如何設計一個RPC框架”的回答,歡迎大家批評指正,交流補充。
我是【java架構設計】,關注我,持續為您提供Java優質內容!