91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現一個迷你版的RPC

發布時間:2020-07-02 19:18:27 來源:網絡 閱讀:21046 作者:zfz_linux_boy 欄目:軟件技術

前言

在實際后臺服務開發中,比如訂單服務(開發者A負責)需要調用商品服務(開發者B負責),那么開發者B會和A約定調用API,以接口的形式提供給A。通常都是B把API上傳到Maven私服,然后B開始寫API的實現,A只需要引入API依賴進行開發即可。

實現一個迷你版的RPC

動手實現RPC

商品服務工程

實現一個迷你版的RPC

注意,我將商品服務的API以及實現分為Maven的2個模塊來開發。這里,我們想給定一個商品ID,查詢得到商品對象信息。

商品對象

實現一個迷你版的RPC

實現一個迷你版的RPC

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

很顯然,訂單系統調用商品系統的時候,需要商品系統返回一個商品,必然涉及到發生網絡傳輸,這就涉及對象的序列化和反序列化了。

商品查詢API接口

實現一個迷你版的RPC

訂單系統調用商品服務

實現一個迷你版的RPC

在訂單系統工程中需要引入商品服務API依賴。

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

rpc實現方法

實現一個迷你版的RPC

第一,我們看到了Proxy.newProxyInstance,很顯然在進行動態代理。也即是說,在訂單服務調用商品服務的代碼中,我們先是通過動態代理返回一個代理的IProductService類型對象,這意味著當代理對象調用queryById方法的時候,會自動調用invoke方法!

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

它本質上就是進行Socket通信,那么它需要傳遞什么信息給到商品服務呢?

我們知道訂單系統就是想調用商品服務的某個類的某個方法,然后把這個方法的返回結果傳輸給訂單系統!

想一想,如何調用某個類的某個方法呢?

只要我們能確定這個類的全限定類名、確定方法名、確定方法的參數類型,給定方法需要的具體參數,通過反射就能實現。

商品服務調用后得到的結果,我們序列化寫入Socket流中,在訂單系統中反序列化得到對象即可。

第三,這里需要思考一個問題:在訂單系統中我們只知道商品服務的API,并不知道這背后的API到底是如何實現的,所以我們需要有一個映射,就是商品服務的API到商品服務的實現的一個映射關系,其實這就是所謂的服務的注冊!

商品API的具體實現

實現一個迷你版的RPC
實現一個迷你版的RPC

商品服務

實現一個迷你版的RPC

從這里,可以清晰的看到,商品服務讀取了訂單系統調用商品系統時發送的數據,利用反射機制,進行方法調用,并把調用結果寫入Socket輸出流。

運行結果

實現一個迷你版的RPC

啟動商品服務后,通過訂單系統發起對商品服務的調用。

以前總認為RPC是遙不可及的,感覺是個很神奇的東西,實際上它的底層實現不就是這樣的么~

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扶沟县| 泰和县| 玉龙| 北辰区| 宜君县| 嘉义市| 出国| 子洲县| 德令哈市| 喀什市| 民权县| 牡丹江市| 西盟| 繁峙县| 惠东县| 海门市| 西昌市| 绍兴县| 德兴市| 武功县| 门头沟区| 仁布县| 宁蒗| 新竹县| 故城县| 绩溪县| 县级市| 黑龙江省| 西藏| 姚安县| 西畴县| 广南县| 定襄县| 永川市| 茌平县| 武陟县| 会昌县| 黄骅市| 广宗县| 永登县| 合川市|