PHP中ORM在RPC中的用法

什么是RPC?

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代码:
PHP中ORM在RPC中的用法


client.php代码:
PHP中ORM在RPC中的用法

这样就简单实现了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"
        }
    }
}

PHP中ORM在RPC中的用法

打印结果:

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 2.0规范


json-rpc: https://github.com/fguillot/JsonRPC
php-json-rpc: https://github.com/datto/php-json-rpc



参考资料:

PHP 进阶之路 - 零基础构建自己的服务治理框架(上)
PHP 进阶之路 - 零基础构建自己的服务治理框架(下)