日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【手写系列】纯手写实现一个高可用的RPC

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【手写系列】纯手写实现一个高可用的RPC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言


在實(shí)際后臺(tái)服務(wù)開發(fā)中,比如訂單服務(wù)(開發(fā)者A負(fù)責(zé))需要調(diào)用商品服務(wù)(開發(fā)者B負(fù)責(zé)),那么開發(fā)者B會(huì)和A約定調(diào)用API,以接口的形式提供給A。通常都是B把API上傳到Maven私服,然后B開始寫API的實(shí)現(xiàn),A只需要引入API依賴進(jìn)行開發(fā)即可。

訂單服務(wù)調(diào)用商品服務(wù)

上圖簡單的描述了RPC在實(shí)際場景中的應(yīng)用,我們在開發(fā)中當(dāng)然是利用現(xiàn)有的RPC框架來快速實(shí)現(xiàn)業(yè)務(wù)需求,比如百度開源了baidu-rpc,阿里的Dubbo早已聲名在外,騰訊自己玩TAF。本篇博客將實(shí)現(xiàn)一個(gè)迷你版的RPC,探索下RPC底層實(shí)現(xiàn)的奧秘!

?

動(dòng)手實(shí)現(xiàn)RPC商品服務(wù)工程


商品服務(wù)工程

商品服務(wù)工程

注意,我將商品服務(wù)的API以及實(shí)現(xiàn)分為Maven的2個(gè)模塊來開發(fā)。這里,我們想給定一個(gè)商品ID,查詢得到商品對象信息。

商品對象

商品API

?

Product

要注意的是,Product是可以被序列化的,Why?

很顯然,訂單系統(tǒng)調(diào)用商品系統(tǒng)的時(shí)候,需要商品系統(tǒng)返回一個(gè)商品,必然涉及到發(fā)生網(wǎng)絡(luò)傳輸,這就涉及對象的序列化和反序列化了。

商品查詢API接口

商品查詢API

?

訂單系統(tǒng)調(diào)用商品服務(wù)

訂單服務(wù)調(diào)用商品服務(wù)

在訂單系統(tǒng)工程中需要引入商品服務(wù)API依賴。

在上圖代碼中,最重要的就是rpc方法了!

rpc實(shí)現(xiàn)方法

rpc

第一,我們看到了Proxy.newProxyInstance,很顯然在進(jìn)行動(dòng)態(tài)代理。也即是說,在訂單服務(wù)調(diào)用商品服務(wù)的代碼中,我們先是通過動(dòng)態(tài)代理返回一個(gè)代理的IProductService類型對象,這意味著當(dāng)代理對象調(diào)用queryById方法的時(shí)候,會(huì)自動(dòng)調(diào)用invoke方法!

第二,我們看看invoke到底做了些什么?

它本質(zhì)上就是進(jìn)行Socket通信,那么它需要傳遞什么信息給到商品服務(wù)呢?

我們知道訂單系統(tǒng)就是想調(diào)用商品服務(wù)的某個(gè)類的某個(gè)方法,然后把這個(gè)方法的返回結(jié)果傳輸給訂單系統(tǒng)!

想一想,如何調(diào)用某個(gè)類的某個(gè)方法呢?

只要我們能確定這個(gè)類的全限定類名、確定方法名、確定方法的參數(shù)類型,給定方法需要的具體參數(shù),通過反射就能實(shí)現(xiàn)。

商品服務(wù)調(diào)用后得到的結(jié)果,我們序列化寫入Socket流中,在訂單系統(tǒng)中反序列化得到對象即可。

第三,這里需要思考一個(gè)問題:在訂單系統(tǒng)中我們只知道商品服務(wù)的API,并不知道這背后的API到底是如何實(shí)現(xiàn)的,所以我們需要有一個(gè)映射,就是商品服務(wù)的API到商品服務(wù)的實(shí)現(xiàn)的一個(gè)映射關(guān)系,其實(shí)這就是所謂的服務(wù)的注冊!

商品API的具體實(shí)現(xiàn)

商品服務(wù) 商品服務(wù)API實(shí)現(xiàn)

商品服務(wù)

商品服務(wù)

從這里,可以清晰的看到,商品服務(wù)讀取了訂單系統(tǒng)調(diào)用商品系統(tǒng)時(shí)發(fā)送的數(shù)據(jù),利用反射機(jī)制,進(jìn)行方法調(diào)用,并把調(diào)用結(jié)果寫入Socket輸出流。

運(yùn)行結(jié)果

運(yùn)行結(jié)果

啟動(dòng)商品服務(wù)后,通過訂單系統(tǒng)發(fā)起對商品服務(wù)的調(diào)用。

?

以前總認(rèn)為RPC是遙不可及的,感覺是個(gè)很神奇的東西,實(shí)際上它的底層實(shí)現(xiàn)不就是這樣的么~

晚安!

?

手寫系列相關(guān)爆文


【手寫系列】寫出我的第一個(gè)框架:迷你版Spring MVC

【手寫系列】透徹理解Spring事務(wù)設(shè)計(jì)思想之手寫實(shí)現(xiàn)

【手寫系列】透徹理解MyBatis設(shè)計(jì)思想之手寫實(shí)現(xiàn)

【手寫系列】理解數(shù)據(jù)庫連接池底層原理之手寫實(shí)現(xiàn)

【手寫系列】對HashMap的思考及手寫實(shí)現(xiàn)

【手寫系列】純手寫實(shí)現(xiàn)JDK動(dòng)態(tài)代理

【手寫系列】寫一個(gè)迷你版的Tomcat

總結(jié)

以上是生活随笔為你收集整理的【手写系列】纯手写实现一个高可用的RPC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。