目录
1. rpc相关知识准备
rpc的全称是remote procedure call,翻译过来就是远程过程调用
远程调用的意思就是程序调用的方法实现不是在程序所在的本地,而是在远程的某个地方。远程调用的好处就是解耦。【当server需要对方法内实现修改时,client完全感知不到,不用做任何变更;这种方式在跨部门,跨公司合作的时候经常用到,并且方法的提供者我们通常称为:服务的暴露】
1.1 远程调用原理
比如 A (client) 调用 B (server) 提供的remoteAdd方法:
- 首先A与B之间建立一个TCP连接;
- 然后A把需要调用的方法名(这里是remoteAdd)以及方法参数(10,20)序列化成字节流发送出去;
- B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;
- A接受远程调用结果,输出30。
RPC框架就是把我刚才说的这几点些细节给封装起来,给用户暴露简单友好的API使用。
1.2 远程调用和Socket Rest的区别
RPC、Socket、Rest都是是client/server模式的
- 跟Socket什么区别?socket是RPC经常采用的通信手段之一,RPC是在Socket的基础上实现的,它比socket需要更多的网络和系统资源。除了Socket,RPC还有其他的通信方法,比如:http、操作系统自带的管道等技术来实现对于远程程序的调用。
2.跟Rest什么区别?REST API 是基于 HTTP协议的,REST致力于通过http协议中的POST/GET/PUT/DELETE等方法和一个可读性强的URL来提供一个http请求。而 RPC 则可以不基于 HTTP协议
因此,如果是后端两种语言互相调用,用 RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西),应该也更容易配置。
2. 流行的rpc框架
phprpc,yar, thrift, gRPC, swoole, hprose
2.1 phprpc实例
先来个简单的例子,phprpc也是分为服务器端和客户端的。所以文件夹中对应的就是phprpc_server.php 和 phprpc_client.php
phprpc_client.php
<?php
include ("phprpc/phprpc_client.php");
$client = new PHPRPC_Client('http://127.0.0.1/server.php');
echo $client->HelloWorld();
phprpc_server.php
<?php
include ("phprpc/phprpc_server.php");
function HelloWorld() {
return 'Hello World!';
}
$server = new PHPRPC_Server();
$server->add('HelloWorld');
$server->start();
2.2 yar实例
先来个简单的例子,yar也是分为服务器端和客户端的。所以文件夹中对应的就是yar_server.php 和 yar_client.php
yar_client.php
<?php
$client = new Yar_Client("http://127.0.0.1/yar_server.php");
echo $client->api('helo word');
yar_server.php
<?php
class API {
public function api($parameter, $option = "foo") {
return $parameter;
}
protected function client_can_not_see() {
}
}
$service = new Yar_Server(new API());
$service->handle();