RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。
例如服务器代码:
class UserService
{
public function getUserInfo($uid)
{
// 假设以下内容从数据库取出
return [
'id' => $uid,
'username' => 'han',
];
}
}
客户端能大概这样实现:
$userService = new UserService;
$userService->getUserInfo(10);
客户端如同调用本地代码函数一样调用远程服务,而不需要了解底层网络技术的协议,这就是RPC。
今天就以最通用的HTTP为传输协议,JSON为数据格式协议来在PHP实现RPC调用。
server.php代码:
client.php代码:
这样就简单实现了PHP的RPC调用,现在的问题来了,如果获取到了json数据,如果快速对应到PHP Model上,难道要手工一个个的映射?
这里我们使用一个第三方库:
JsonMapper - map nested JSON structures onto PHP classes
地址:https://github.com/cweiske/jsonmapper
解析如下json示例:
{
"name": "Sheldon Cooper",
"address": {
"street": "2311 N. Los Robles Avenue",
"city": "Pasadena",
"user": {
"name": "3333"
}
}
}
打印结果:
Contact Object
(
[name] => Sheldon Cooper
[address] => Address Object
(
[street] => 2311 N. Los Robles Avenue
[city] => Pasadena
[user] => User Object
(
[name] => 3333
)
)
)
Json映射Model很方便,这样的RPC客户端解析方式,也可以完美兼容Java,Java客户端代码可参照: https://gitee.com/zhoumengkang/soa-01-java-client
还有一个不完美的地方就是服务器Model,对应的PHP或Java客户端还要手工一个一个建对应的Model,能不能实现像Thrift、Protobuf自动生成对应的各个语言的Model?
思路是写个PHP脚本,按照服务器的Model格式生成对应的各个语言的Model文件,再把RPC封装成SDK,放在各个语言的第三方管理器中,比如PHP的Composer,Java的Maven,客户端导入对应的扩展库就可实现RPC调用。
具体到公司应用,可以遵守JSON-RPC轻量级RPC协议。
json-rpc: https://github.com/fguillot/JsonRPC
php-json-rpc: https://github.com/datto/php-json-rpc
参考资料: