好久沒有更新了哇
首先說RPC之前购岗,需要先了解RPC是什么,RPC的工作原理是什么门粪,這才能做到心中有數(shù)喊积。
RPC的全稱是Remote Procedure Call,遠程方法調用玄妈。它是發(fā)生于兩個進程之間乾吻,
一個服務端髓梅,一個客戶端。服務端提供服務溶弟,客戶端請求服務端女淑。簡單點理解呢瞭郑,像HTTP請求
一樣辜御,發(fā)起一個請求,然后就返回一個結果屈张。而RPC呢擒权,只不過是在本地調用遠程的一個方法,然后遠程
返回一個結果阁谆。照著自己的思路把這個過程寫下來碳抄。
- 服務端和客戶端之間要通信,那就不可避免的需要網(wǎng)絡通信场绿∑市В客戶端與服務端需要建立網(wǎng)絡連接
(可以用Netty作為網(wǎng)絡通訊的框架)
- 接下來,調用一個方法焰盗,服務端需要知道哪些數(shù)據(jù)璧尸。作為服務端需要知道你要調用哪個對象的哪個方法,有哪些參數(shù)熬拒,而這些數(shù)據(jù)則需要客戶端通過網(wǎng)絡傳輸給服務端爷光。這個過程就涉及到編解碼,需要定義自己的編碼器和解碼器(可以用阿里的fastjaon, google的protobuff等等)澎粟。
- 最后蛀序,客戶端的操作希望是在本地調用自己的方法一樣,但本地是沒有這些方法的實現(xiàn)的活烙,所以需要用代理對象去調用徐裸,當代理對象調用這個方法時,則對應向服務端發(fā)起一個請求啸盏,然后等待服務器的結果返回倦逐。這個過程就需要用到jdk或者cglib的動態(tài)代理。
總結一下上面的流程
客戶端調用方法 --> 代理對象封裝參數(shù)宫补,向服務端請求(等待結果返回) --> 服務端收到請求檬姥,調用對應方法,將結果返回給客戶端
當然粉怕,上面只是最簡單的流程健民,RPC的實現(xiàn)還有一些細節(jié)。
比如贫贝,客戶端怎么知道服務端的這些服務呢秉犹,可以采用Zookeeper等注冊中心將服務注冊蛉谜,讓客戶端可以自動發(fā)現(xiàn)。再比如崇堵,需要監(jiān)控這些服務的調用數(shù)據(jù)等型诚,可以增加監(jiān)控系統(tǒng)。很多細節(jié)都可以慢慢琢磨鸳劳。
如果錯誤的地方狰贯,請糾正,大家一起學習進步赏廓。