'分佈式架構:淺談分佈式架構核心RPC原理'

Java Apache Facebook BigDataKer 2019-07-15
"

在應用的迭代演進過程中,隨著系統訪問量提高,業務複雜度提高,代碼複雜度提高,應用逐漸從單體式架構向面向服務的分佈式架構轉變。RPC(Remote Procedure Call Protocol遠程過程調用)是分佈式架構的核心,按響應方式分如下兩種:

同步調用:客戶端調用服務方方法,等待直到服務方返回結果或者超時,再繼續自己的操作

異步調用:客戶端把消息發送給中間件,不再等待服務端返回,直接繼續自己的操作。

同步調用的實現方式有WebService和RMI。Web Service提供的服務是基於web容器的,底層使用http協議,因而適合不同語言異構系統間的調用。RMI實際上是Java語言的RPC實現,允許方法返回 Java 對象以及基本數據類型,適合用於JAVA語言構建的不同系統間的調用。

異步調用的JAVA實現版就是JMS(Java Message Service),目前開源的的JMS中間件有Apache社區的ActiveMQ和Kafka,另外有阿里的RocketMQ,昨天(2016年11月28日)看到的新聞阿里已經將此組件捐獻給Apache社區基金組織。

下面重點對RPC同步調用的原理進行探討。簡單來說一個RPC架構裡包含如下4個組件:

1、 客戶端(Client):服務調用方

2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方

3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務

4、 服務端(Server):真正的服務提供者。

"

在應用的迭代演進過程中,隨著系統訪問量提高,業務複雜度提高,代碼複雜度提高,應用逐漸從單體式架構向面向服務的分佈式架構轉變。RPC(Remote Procedure Call Protocol遠程過程調用)是分佈式架構的核心,按響應方式分如下兩種:

同步調用:客戶端調用服務方方法,等待直到服務方返回結果或者超時,再繼續自己的操作

異步調用:客戶端把消息發送給中間件,不再等待服務端返回,直接繼續自己的操作。

同步調用的實現方式有WebService和RMI。Web Service提供的服務是基於web容器的,底層使用http協議,因而適合不同語言異構系統間的調用。RMI實際上是Java語言的RPC實現,允許方法返回 Java 對象以及基本數據類型,適合用於JAVA語言構建的不同系統間的調用。

異步調用的JAVA實現版就是JMS(Java Message Service),目前開源的的JMS中間件有Apache社區的ActiveMQ和Kafka,另外有阿里的RocketMQ,昨天(2016年11月28日)看到的新聞阿里已經將此組件捐獻給Apache社區基金組織。

下面重點對RPC同步調用的原理進行探討。簡單來說一個RPC架構裡包含如下4個組件:

1、 客戶端(Client):服務調用方

2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方

3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務

4、 服務端(Server):真正的服務提供者。

分佈式架構:淺談分佈式架構核心RPC原理

這4個組件調用時序圖如下:

"

在應用的迭代演進過程中,隨著系統訪問量提高,業務複雜度提高,代碼複雜度提高,應用逐漸從單體式架構向面向服務的分佈式架構轉變。RPC(Remote Procedure Call Protocol遠程過程調用)是分佈式架構的核心,按響應方式分如下兩種:

同步調用:客戶端調用服務方方法,等待直到服務方返回結果或者超時,再繼續自己的操作

異步調用:客戶端把消息發送給中間件,不再等待服務端返回,直接繼續自己的操作。

同步調用的實現方式有WebService和RMI。Web Service提供的服務是基於web容器的,底層使用http協議,因而適合不同語言異構系統間的調用。RMI實際上是Java語言的RPC實現,允許方法返回 Java 對象以及基本數據類型,適合用於JAVA語言構建的不同系統間的調用。

異步調用的JAVA實現版就是JMS(Java Message Service),目前開源的的JMS中間件有Apache社區的ActiveMQ和Kafka,另外有阿里的RocketMQ,昨天(2016年11月28日)看到的新聞阿里已經將此組件捐獻給Apache社區基金組織。

下面重點對RPC同步調用的原理進行探討。簡單來說一個RPC架構裡包含如下4個組件:

1、 客戶端(Client):服務調用方

2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方

3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務

4、 服務端(Server):真正的服務提供者。

分佈式架構:淺談分佈式架構核心RPC原理

這4個組件調用時序圖如下:

分佈式架構:淺談分佈式架構核心RPC原理

1、 服務調用方(client)調用以本地調用方式調用服務;

2、 client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;在Java裡就是序列化的過程

3、 client stub找到服務地址,並將消息通過網絡發送到服務端;

4、 server stub收到消息後進行解碼,在Java裡就是反序列化的過程;

5、 server stub根據解碼結果調用本地的服務;

6、 本地服務執行處理邏輯;

7、 本地服務將結果返回給server stub;

8、 server stub將返回結果打包成消息,Java裡的序列化;

9、 server stub將打包後的消息通過網絡併發送至消費方

10、 client stub接收到消息,並進行解碼, Java裡的反序列化;

11、 服務調用方(client)得到最終結果。

RPC框架的目標就是把2-10步封裝起來,把調用、編碼/解碼的過程封裝起來,讓用戶像調用本地服務一樣的調用遠程服務。要做到對客戶端(調用方)透明化服務, RPC框架需要考慮解決如下問題:

1、 服務端提供的服務如何發佈,客戶端如何發現服務;

2、 如何對請求對象和返回結果進行序列化和反序列化;

3、 如何更高效進行網絡通信。

以上問題在一些開源的RPC框架裡都有比較好的解決,如阿里的Dubbo,Facebook的Thrift。有興趣的同學可以對這兩個框架進行深入學習研究。

本文轉自博客園aspirant的博客.如有侵權,請聯繫刪除

原文地址:https://www.cnblogs.com/aspirant/p/8631195.html

"

相關推薦

推薦中...