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...