so-php / rpc
此软件包的最新版本(0.0.2-alpha)没有提供许可信息。
通过 php-amqplib 实现RPC模式
0.0.2-alpha
2014-06-16 06:14 UTC
Requires
- phpunit/phpunit: 3.7.*
- so-php/php-amqplib-extensions: ~0.0-alpha
- videlalvaro/php-amqplib: *
- zendframework/zend-code: 2.3.*@dev
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。