1. 程式人生 > >分散式服務架構-RPC

分散式服務架構-RPC

 

目錄

 

1 架構演變

2 RPC(Remote Procedure Call Protocol,遠端過程呼叫):分散式服務架構的核心

2.1 RPC同步呼叫

2.2 RPC非同步呼叫

2.2.1 MOM(Message-oriented middleware)

2.2.2 JMS(Java Message Service)

2.2.3 常用的訊息佇列


1 架構演變

  • 單一應用架構
    • 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
    • 此時,用於簡化增刪改查工作量的 資料訪問框架(ORM)
       是關鍵。
  • 垂直應用架構
    • 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
    • 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
  • 分散式服務架構
    • 當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
    • 此時,用於提高業務複用及整合的 分散式服務框架(RPC) 是關鍵。
  • 流動計算架構
    • 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。
    • 此時,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵。

2 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社群基金組織。

2.1 RPC同步呼叫

簡單來說一個RPC架構裡包含如下4個元件:

1、 客戶端(Client):服務呼叫方

2、 客戶端存根(Client Stub):存放服務端地址資訊,將客戶端的請求引數打包成網路訊息,再通過網路傳送給服務方

3、 服務端存根(Server Stub):接受客戶端傳送過來的訊息並解包,再呼叫本地服務

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

這4個元件呼叫時序圖如下:

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。有興趣的同學可以對這兩個框架進行深入學習研究。

2.2 RPC非同步呼叫

2.2.1 MOM(Message-oriented middleware)

MOM 就是面向訊息中介軟體(Message-oriented middleware),是用於以分散式應用或系統中的非同步、鬆耦合、可靠、可擴充套件和安全通訊的一類軟體。MOM 的總體思想是它作為訊息傳送器和訊息接收器之間的訊息中介,這種中介提供了一個全新水平的鬆耦合,解決應用之間的訊息傳遞、解耦、非同步的問題。”

2.2.2 JMS(Java Message Service)

JMS 叫做 Java 訊息服務(Java Message Service),是 Java 平臺上有關面向 MOM 的技術規範,旨在通過提供標準的產生、傳送、接收和處理訊息的 API 簡化企業應用的開發,類似於 JDBC 和關係型資料庫通訊方式的抽象。”

  • JMS編碼介面 
    ConnectionFactory 用於建立連線到訊息中介軟體的連線工廠 
    Connection 代表了應用程式和訊息伺服器之間的通訊鏈路 
    Destination 指訊息釋出和接收的地點,包括佇列(點對點P2P)或主題(釋出/訂閱 Pub/Sub) 
    Session 表示一個單執行緒的上下文,用於傳送和接收訊息 
    MessageConsumer 由會話建立,用於接收發送到目標的訊息 
    MessageProducer 由會話建立,用於傳送訊息到目標 
    Message 是在消費者和生產者之間傳送的物件,訊息頭,一組訊息屬性,一個訊息體 è¿éåå¾çæè¿°

2.2.3 常用的訊息佇列

è¿éåå¾çæè¿°

參考文章列表:

            分散式架構核心RPC原理:https://blog.csdn.net/dongnaosenlu/article/details/76998419