RPC基礎認知

一、什麼是RPC

 RPC的全稱是Remote Process Call,即遠程過程調用,它應用廣泛,實現方式也很多,擁有RMI、WebService、Hessian等諸多成熟的方案,在業界得到了廣泛的使用。

RPC將原本的本地調用轉變爲調用遠端的服務器上的方法,給系統的處理能力和吞吐量帶來了極大的提升,也是實現分佈式計算的基礎。

RPC的實現包括客戶端和服務端,即服務的調用方和服務的提供方。服務調用方發送RPC請求到服務器提供方,服務提供方根據調用方提供的參數執行請求方法,將執行結果返回給調用方,一次RPC調用完成。

二、爲什麼需要rpc

基於未來微服務發展的趨勢,以及分佈式應用框架的考慮,微服務之間存在大量的業務交流和數據交換,如果需要採用http、tcp、io等方式來進行,接口業務之間的交換 無疑是非常麻煩且冗餘的,這個時候rpc框架就應運而生,可以向微服務提供就像調用基礎方法一樣調用遠程方法,大幅度的減輕了微服務之間業務交互的壓力及開發壓力

三、RPC需要考慮哪些問題?

1、 客戶端遠程調用

可以通過代理模式實現在客戶端創建一個遠端服務器上真正對象的代理對象;調用方法的時候,代理對象去找真正的對象來提供服務。代理模式又毫無疑問選用的是動態代理,可以在運行時創建代理。動態代理常用的方式有兩種,JDK動態代理和CGLIB動態代理

2、 服務端方法調用

目前常用的穩定機制有 javassist、methodHandle、reflection,三者相比較而言javassist的性能最爲卓越,基本可以與直接調用的性能相媲美

3、 序列化及反序列化

序列化與反序列化的成熟方案有很多,主要分爲二進制和文本傳輸兩種

a、文本傳輸類似於常見的json、xml等格式,像jackson、fastjson等,但是相較於2進制傳輸方式而言,性能相比之下較爲低下

b、二進制傳輸方案有hessian、proto buffers、kryo、fst等,其中hessian性能相比較弱,但是比起java內置序列化方案來說是較爲快速的

4、 網絡傳輸

Netty 是一個異步事件驅動的網絡應用框架,用於快速開發可維護的高性能服

務器和客戶端。封裝了JDK的NIO,簡化了nio複雜的代碼開發流程

5、 服務註冊

解決分佈式架構中,一個服務勢必會有多個實例,如何獲取實例的問題。

可以使用Zookeeper作爲註冊中心,在調用時,從Zookeeper獲取服務的實例列表,再從中選擇一個進行調用。

6、 緩存

Redis緩存,可以將服務與實例,實例與方法的映射關係存入到redis緩存中,加快相關函數及方法的調用,但是要注意redis中與服務註冊中心中的數據同步的問題,其次甚至可以使用redis來進行數據的緩存

7、 異步調用

如果面臨服務端處理數據緩慢,耗時長久的場景時,可以使用異步調用AIO

AIO作爲異步非阻塞io模型,AIO發起ip操作之後,通知服務器去完成函數操作,這個時間客戶端可以去做其他的事情。等到服務器完成操作是,就會調用客戶端接口,返回結果數據。

8、 線程池

針對高併發的客戶端請求,服務端可以維護一個線程池,針對每次的客戶端的請求,可以直接從線程池中拿出一個線程,直接去執行客戶端的任務,省去了每次創建線程的開銷,同時提高了服務端的響應速度。

四、手動編寫一個簡單的rpc框架

建議參考如下兩篇博客中 大佬針對幾種形式的rpc設計思路進行了 簡單rpc框架的搭建

https://blog.csdn.net/qq_31142553/article/details/86027031

https://blog.csdn.net/qq_31142553/article/details/86316654

學習自博客:

https://blog.csdn.net/qq_31142553/article/details/86027031

https://blog.csdn.net/weixin_41907511/article/details/102834674

https://blog.csdn.net/qq_39158142/article/details/90676669

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