so-php/rpc

此软件包的最新版本(0.0.2-alpha)没有提供许可信息。

通过 php-amqplib 实现RPC模式

0.0.2-alpha 2014-06-16 06:14 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:42:30 UTC


README

通过 php-amqplib 实现RPC模式

避免技术锁定

本实现的一个目标是为了防止像python、ruby和java这样的其他技术被锁定在生成或消费请求上。这不是一个特别困难的任务——它仅仅意味着我们需要使用一个非专有消息队列(php-amqplib + rabbitmq)和一个非语言特定的消息格式。因此,我们选择使用json序列化数据结构,而不是PHP序列化字符串。

话虽如此,对PRC参数的内容没有强制限制。开发者需要保持警惕,确保不要在RPC中放入PHP或平台特定的任何内容。

消息结构

如上所述,消息是一个纯Json字符串。结构是一个具有三个键(只有)的最高级对象。

  • method 方法名称
  • params 存放RPC参数的数组。除了技术可行性和合理性外,没有其他限制。即使为空,也应提供[]。参数是有序的,并将按接收到的顺序提供给RP。
{
    "name": "sayHelloTo",
    "params": [
        "bob"
    ]
}

用法

使用RPC相当直观。大写字母的单词是需要提供/配置的值。

服务器

首先,我们需要启动一个RPC服务器队列,并将其绑定到一个类/方法。

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$ch = $conn->channel();

$server = new Server($ch);
$server->serve(function($name){ return "Hello $name"; }, 'greet');
// or more commonly:
// $rpc->serve(new Greeter()); // where greeter has a greet method.

echo "listening for RPCs @ " . $server->getQueueName();
while(true){
    $server->wait();
}

输出可能如下所示

`Listening for RPCs @ amq.gen-v1ac3`

客户端

客户端看起来像这样

// need a channel to work with
$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$ch = $conn->channel();

// we have to tell the client what queue to use
$rpc = new Client($ch, 'amq.gen-v1ac3');

$greeting = $rpc->greet('bob');
echo $greeting;

输出可能如下所示

`Hello bob`

等等...

“你是说我要以某种方式编排配置我的RPC客户端以与服务器正确的队列相匹配?”你可能会问。坦白地说,是的。但你不应该这么做,你应该使用服务注册模式来做这件事。试试 so-php/service-registry