分布式通信:遠程呼叫
分布式的本質是多行程協作,共同完成任務,我們需要關注行程之間如何通信,
什么是本地呼叫和遠程呼叫?
本地呼叫指的是行程內函式之間互相呼叫;遠程呼叫時行程間函式相互呼叫,是一種行程間的通信模式,
遠程呼叫分為兩類:
- 本地程序呼叫(Local Procedure Call,LPC),同一臺機器上運行的不同行程之間的互相通信,即在多行程作業系統中,運行在不同行程之間可以通過LPC進行函式呼叫,
- 遠程程序呼叫(Remote Procedure Call,RPC),不同機器上運行的行程之間的相互通信,某一機器上運行的行程在不知道底層通信細節的情況下,就像訪問本地服務一樣,去呼叫遠程機器上的服務,
遠程呼叫一般不會采用HTTP協議去傳輸資料,而是采用更底層的網路通信協議,例如TCP,
兩種常見的遠程呼叫機制:
- 遠程程序呼叫(Remote Procedure Call,RPC)
- 遠程方法呼叫(Remote Method Invocation,RMI)
RPC就是像呼叫本地機器上的函式或者方法一樣,去執行遠程機器上的函式或者方法,并回傳結果,整個程序中,不會感知到底層具體的通信細節,
RPC和本地呼叫有什么區別?
第一個區別是呼叫ID和函式的映射,本地呼叫是在行程內呼叫,程式可以直接通過函式名呼叫函式,而在RPC中,所有的函式必須要有一個呼叫ID來唯一標識,一個機器上運行的行程在做遠程程序呼叫時,必須附上這個呼叫ID,
第二個區別是序列化和反序列化,遠程呼叫時,需要在網路上傳輸資料,而這里的資料只能是二進制資料,這就需要呼叫方先把引數轉成二進制流,在傳到服務提供方后,提供方需要將二進制流轉換成可識別的物件,呼叫方將引數轉換成二進制流,稱為序列化,服務提供方將二進制流轉換成可識別的物件,稱為反序列化,
第三個區別是網路傳輸協議,遠程呼叫可以基于不同的網路協議來傳輸資料,例如TCP,UDP等,
Dubbo的主要架構
Dubbo的架構主要包括4部分:
- 服務提供方,它會向服務注冊中心注冊自己提供的服務,
- 服務注冊中心,負責存盤和管理服務提供方注冊的服務資訊和服務呼叫方訂閱的服務型別等,
- 服務呼叫方,根據服務注冊中心回傳的服務所在的地址串列,通過遠程呼叫方式訪問遠程服務,
- 監控中心,主要統計服務的呼叫次數和呼叫時間等資訊,以方便進行服務管理合作和服務失敗分析,
Dubbo的大致作業流程:
- 服務提供方將自身提供的服務注冊到服務注冊中心,
- 服務呼叫方需要向注冊中心預訂呼叫服務的提供方地址串列,
- 服務注冊中心將服務對應的提供方串列回傳給呼叫方,
- 服務呼叫方根據服務地址資訊進行遠程服務呼叫,
- 服務呼叫方和服務提供方定時向監控中心發送服務呼叫次數以及呼叫時間等資訊,
RMI原理和應用
RMI是一個用于實作RPC的Java API,能夠讓本地Java虛擬機上運行的物件呼叫遠程方法如同呼叫本地方法,隱藏通信細節,
RMI是RPC的一種具體形式,其原理和RPC基本一致,不同之處在于RMI是基于物件的,充分李永樂面向物件的思想去實作整個程序,其本質就是一種基于物件的RPC實作,
RMI和RPC最大的不同在于呼叫方式和回傳結果的形式,RMI通過物件作為遠程介面進行遠程方法呼叫,回傳的結果也是物件形式,比如Java物件型別,或者是基本資料型別,
RPC和RMI的詳細比較如下圖所示,

遠程呼叫也會存在同步呼叫和異步呼叫,通常來說:
- 如果呼叫方需要等待被呼叫方執行完成并回傳結果,這就是同步呼叫,
- 如果呼叫方在呼叫相關方法后,不需要等待執行結果,被呼叫方執行結束后,可以通過回呼通知等方式告知呼叫方,這就是異步呼叫,
同步呼叫適用于需要關注被呼叫方計算結果的場景;異步呼叫適用于對回應效率要求高,但是對結果正確性要求相對較低的場景,
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544396.html
標籤:Java
