實現一個迷你版的RPC
前言
在實際後臺服務開發中,比如訂單服務(開發者A負責)需要呼叫商品服務(開發者B負責),那麼開發者B會和A約定呼叫API,以介面的形式提供給A。通常都是B把API上傳到Maven私服,然後B開始寫API的實現,A只需要引入API依賴進行開發即可。
動手實現RPC
商品服務工程
注意,我將商品服務的API以及實現分為Maven的2個模組來開發。這裡,我們想給定一個商品ID,查詢得到商品物件資訊。
商品物件
要注意的是,Product是可以被序列化的,Why?
很顯然,訂單系統呼叫商品系統的時候,需要商品系統返回一個商品,必然涉及到發生網路傳輸,這就涉及物件的序列化和反序列化了。
商品查詢API介面
訂單系統呼叫商品服務
在訂單系統工程中需要引入商品服務API依賴。
在上圖程式碼中,最重要的就是rpc方法了!
rpc實現方法
第一,我們看到了Proxy.newProxyInstance,很顯然在進行動態代理。也即是說,在訂單服務呼叫商品服務的程式碼中,我們先是通過動態代理返回一個代理的IProductService型別物件,這意味著當代理物件呼叫queryById方法的時候,會自動呼叫invoke方法!
第二,我們看看invoke到底做了些什麼?
它本質上就是進行Socket通訊,那麼它需要傳遞什麼資訊給到商品服務呢?
我們知道訂單系統就是想呼叫商品服務的某個類的某個方法,然後把這個方法的返回結果傳輸給訂單系統!
想一想,如何呼叫某個類的某個方法呢?
只要我們能確定這個類的全限定類名、確定方法名、確定方法的引數型別,給定方法需要的具體引數,通過反射就能實現。
商品服務呼叫後得到的結果,我們序列化寫入Socket流中,在訂單系統中反序列化得到物件即可。
第三,這裡需要思考一個問題:在訂單系統中我們只知道商品服務的API,並不知道這背後的API到底是如何實現的,所以我們需要有一個對映,就是商品服務的API到商品服務的實現的一個對映關係,其實這就是所謂的服務的註冊!
商品API的具體實現
商品服務
從這裡,可以清晰的看到,商品服務讀取了訂單系統呼叫商品系統時傳送的資料,利用反射機制,進行方法呼叫,並把呼叫結果寫入Socket輸出流。
執行結果
啟動商品服務後,通過訂單系統發起對商品服務的呼叫。
以前總認為RPC是遙不可及的,感覺是個很神奇的東西,實際上它的底層實現不就是這樣的麼~
本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/2059194,如需轉載請自行聯絡原作者
相關文章
- Koa原始碼解析,帶你實現一個迷你版的Koa原始碼
- 一個輕量級RPC的實現RPC
- 如何實現一個分散式RPC框架分散式RPC框架
- 從零實現一個RPC框架系列文章(二):11個類實現簡單RPCRPC框架
- 從零開始實現一個RPC框架(一)RPC框架
- 自己用 Netty 實現一個簡單的 RPCNettyRPC
- 從零開始實現一個RPC框架(五)RPC框架
- 從零開始實現一個RPC框架(四)RPC框架
- 從零開始實現一個RPC框架(三)RPC框架
- 從零開始實現一個RPC框架(二)RPC框架
- 從零開始實現一個RPC框架(零)RPC框架
- Golang快速實現一個簡單RPC服務GolangRPC
- 從零開始實現一個分散式RPC框架分散式RPC框架
- 從零實現一個RPC框架系列文章(一):思路篇RPC框架
- 使用Netty和動態代理實現一個簡單的RPCNettyRPC
- 從零開始實現一個IDL+RPC框架RPC框架
- 基於akka與scala實現一個簡單rpc框架RPC框架
- 手寫一個迷你版 HashMap,面試隨便問!HashMap面試
- 一個RPC的demo(good)RPCGo
- 動手實現一個簡單的 rpc 框架到入門 grpc (上)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc (下)RPC框架
- 動手實現一個簡單的 rpc 框架到入門 grpc(上)RPC框架
- 一不小心實現了RPCRPC
- go語言實現自己的RPC:go rpc codecGoRPC
- Java講解RPC的基本實現JavaRPC
- 如何用一天時間實現自己的RPC框架RPC框架
- 帶你手把手實操一個RPC框架RPC框架
- Go語言實現RPCGoRPC
- 簡述RPC原理實現RPC
- 簡易RPC框架實現RPC框架
- 手把手教你基於Netty實現一個基礎的RPC框架(通俗易懂)NettyRPC框架
- 造個輪子之基於 Netty 實現自己的 RPC 框架NettyRPC框架
- 寫一個RPC服務RPC
- netty 實現簡單的rpc呼叫NettyRPC
- Java實現最簡單的RPC框架JavaRPC框架
- 徒手擼一個簡單的RPC框架RPC框架
- Go 實現簡易 RPC 框架GoRPC框架
- 你真的明白RPC 嗎?一起來探究 RPC 的實質RPC