RPC全稱爲Remote Procedure Call,翻譯過來爲「遠程過程調用」。php
目前,主流的平臺中都支持各類遠程調用技術,以知足分佈式系統架構中不一樣的系統之間的遠程通訊和相互調用。遠程調用的應用場景極其普遍,實現的方式也各式各樣。前端
基於HTTP協議的(例如基於文本的SOAP(XML)、Rest(JSON),基於二進制Hessian(Binary))git
基於TCP協議的(一般會藉助Mina、Netty等高性能網絡框架)程序員
二者都是調用遠程的方法,都是client/server模式。github
RPC(遠程過程調用)採用客戶機/服務器模式實現兩個進程之間相互通訊。socket是RPC常常採用的通訊手段之一,RPC是在Socket的基礎上實現的,它比socket須要更多的網絡和系統資源。除了Socket,RPC還有其餘的通訊方法,好比:http、操做系統自帶的管道等技術來實現對於遠程程序的調用。微軟的Windows系統中,RPC就是採用命名管道進行通訊。編程
經過了解RPC後,咱們知道是RPC是client/server模式的,調用遠程的方法,REST也是咱們熟悉的一套API調用協議方法,它也是基於client/server模式的,調用遠程的方法的,那他倆又有啥區別呢?後端
REST API 和 RPC 都是在 Server端 把一個個函數封裝成接口暴露出去,以供 Client端 調用,不過 REST API 是基於HTTP協議的,REST致力於經過http協議中的POST/GET/PUT/DELETE等方法和一個可讀性強的URL來提供一個http請求。而 RPC 則能夠不基於 HTTP協議跨域
所以,若是是後端兩種語言互相調用,用 RPC 能夠得到更好的性能(省去了 HTTP 報頭等一系列東西),應該也更容易配置。若是是前端經過 AJAX 調用後端,那麼用 REST API 的形式比較好(由於不管如何也避不開 HTTP 這道坎)。瀏覽器
一、HTTP和RPC同一級別,仍是被RPC包含?緩存
二、Restful也屬於RPC麼?
上圖是一個比較完整的關係圖,這時咱們發現HTTP(圖中藍色框)出現了兩次。其中一個是和RPC並列的,都是跨應用調用方法的解決方案;另外一個則是被RPC包含的,是RPC通訊過程的可選協議之一。
所以,第一個問題的答案是都對。看指的是哪個藍色框。從題主的提問看,既然題主在糾結這二者,應該是指與RPC並列的藍色框。
第二個問題是在問遠程過程調用(紅色框)是否是包含了Restful(黃色框),這種理解的關鍵在於對RPC的理解。
RPC字面理解是遠程過程調用,即在一個應用中調用另外一個應用的方法。那Restful是知足的,經過它能夠實如今一個應用中調用另外一個應用的方法。
可是,上述理解使得RPC的定義過於寬泛。RPC一般特指在一個應用中調用另外一個應用的接口而實現的遠程調用,即紅色框所指的範圍。這樣,RPC是不包含Restful的。
所以,第二個問題的答案是Restful不屬於RPC,除非對RPC有着很是規的寬泛理解。
RPC的英文全稱是Remote Procedure Call,翻譯爲中文叫「遠程過程調用」。其中稍顯晦澀的其實就是「過程」,過程其實就是方法。因此,能夠把RPC理解爲「遠程方法調用」。
要了解遠程過程調用,那先理解過程調用。很是簡單,以下圖,就是調用一個方法。這太常見了,很少解釋。
而在分佈式系統中,由於每一個服務的邊界都很小,頗有可能調用別的服務提供的方法。這就出現了服務A調用服務B中方法的需求,即遠程過程調用。
要想讓服務A調用服務B中的方法,最早想到的就是經過HTTP請求實現。是的,這是很常見的,例如服務B暴露Restful接口,而後讓服務A調用它的接口。基於Restful的調用方式由於可讀性好(服務B暴露出的是Restful接口,可讀性固然好)並且HTTP請求能夠經過各類防火牆,所以很是不錯。
然而,如前面所述,基於Restful的遠程過程調用有着明顯的缺點,主要是效率低、封裝調用複雜。當存在大量的服務間調用時,這些缺點變得更爲突出。
服務A調用服務B的過程是應用間的內部過程,犧牲可讀性提高效率、易用性是可取的。基於這種思路,RPC產生了。
HPROSE 是 High Performance Remote Object Service Engine 的縮寫,翻譯成中文就是「高性能遠程對象服務引擎」。
它是一個先進的輕量級的跨語言跨平臺面向對象的高性能遠程動態通信中間件。它不只簡單易用,並且功能強大。你只須要稍許的時間去學習,就能用它輕鬆構建跨語言跨平臺的分佈式應用系統了。
Hprose 支持衆多流行的編程語言,例如:
經過 Hprose,你就能夠在這些語言之間方便高效的實現互通了。
在同一個文件夾下,執行一下操做,分別是拉取組建的命令,建立兩個文件和執行php文件。
拉取hprose組件
composer require hprose/hprose
創建server.php
<?php
require_once "./vendor/autoload.php";
use HproseSocketServer;
function hello($name) {
return "Hello $name!";
}
$server = new Server("tcp://0.0.0.0:1314");
$server->setErrorTypes(E_ALL);
$server->setDebugEnabled();
$server->addFunction('hello');
$server->start();
創建client.php
<?php
require_once "./vendor/autoload.php";
use HproseFuture;
use HproseSocketClient;
$test = new Client("tcp://127.0.0.1:1314");
$test->fullDuplex = true;
Futureco(function() use ($test) {
try {
var_dump((yield $test->hello("yield world1")));
var_dump((yield $test->hello("yield world2")));
var_dump((yield $test->hello("yield world3")));
var_dump((yield $test->hello("yield world4")));
var_dump((yield $test->hello("yield world5")));
var_dump((yield $test->hello("yield world6")));
}
catch (Exception $e) {
echo ($e);
}
});
執行
php server.php
php client.php
結果
string(19) "Hello yield world1!"
string(19) "Hello yield world2!"
string(19) "Hello yield world3!"
string(19) "Hello yield world4!"
string(19) "Hello yield world5!"
string(19) "Hello yield world6!"
可繼續學習:
本文摘自:
https://www.kancloud.cn/marti...