作者:張豐哲
jianshu.com/p/29d75a25eeaf
前言
在實際后臺服務開發中,比如訂單服務(開發者A負責)需要呼叫商品服務(開發者B負責),那么開發者B會和A約定呼叫API,以介面的形式提供給A,通常都是B把API上傳到Maven私服,然后B開始寫API的實作,A只需要引入API依賴進行開發即可,

訂單服務呼叫商品服務
上圖簡單的描述了RPC在實際場景中的應用,我們在開發中當然是利用現有的RPC框架來快速實作業務需求,比如百度開源了baidu-rpc,阿里的Dubbo早已聲名在外,騰訊自己玩TAF,一文告訴你 RMI 和 RPC 的區別!本篇博客將實作一個迷你版的RPC,探索下RPC底層實作的奧秘!在Java技術堆疊微信公眾號后臺回復關鍵字:分布式,可以獲取更多堆疊長整理的 Java 系列技術干貨,
動手實作RPC
商品服務工程

商品服務工程
注意,我將商品服務的API以及實作分為Maven的2個模塊來開發,這里,我們想給定一個商品ID,查詢得到商品物件資訊,
商品物件

商品API

Product
要注意的是,Product是可以被序列化的,Why?
很顯然,訂單系統呼叫商品系統的時候,需要商品系統回傳一個商品,必然涉及到發生網路傳輸,這就涉及物件的序列化和反序列化了,
商品查詢API介面

商品查詢API
訂單系統呼叫商品服務

訂單服務呼叫商品服務
在訂單系統工程中需要引入商品服務API依賴,
在上圖代碼中,最重要的就是rpc方法了!
rpc實作方法

rpc
第一,我們看到了Proxy.newProxyInstance
很顯然在進行動態代理,也即是說,在訂單服務呼叫商品服務的代碼中,我們先是通過動態代理回傳一個代理的IProductService型別物件,這意味著當代理物件呼叫queryById方法的時候,會自動呼叫invoke方法!
第二,我們看看invoke到底做了些什么?
它本質上就是進行Socket通信,那么它需要傳遞什么資訊給到商品服務呢?
我們知道訂單系統就是想呼叫商品服務的某個類的某個方法,然后把這個方法的回傳結果傳輸給訂單系統!
想一想,如何呼叫某個類的某個方法呢?
只要我們能確定這個類的全限定類名、確定方法名、確定方法的引數型別,給定方法需要的具體引數,通過反射就能實作,
商品服務呼叫后得到的結果,我們序列化寫入Socket流中,在訂單系統中反序列化得到物件即可,
第三,這里需要思考一個問題
在訂單系統中我們只知道商品服務的API,并不知道這背后的API到底是如何實作的,所以我們需要有一個映射,就是商品服務的API到商品服務的實作的一個映射關系,其實這就是所謂的服務的注冊!

商品服務

商品服務API實作
商品服務
商品服務
從這里,可以清晰的看到,商品服務讀取了訂單系統呼叫商品系統時發送的資料,利用反射機制,進行方法呼叫,并把呼叫結果寫入Socket輸出流,
運行結果

啟動商品服務后,通過訂單系統發起對商品服務的呼叫,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159477.html
標籤:Java
上一篇:Java筆記:多執行緒
