RPC客户端,调用RPC服务需要经过以下几个步骤:
依赖类:\x\RpcClient
方法名:route()
参数:
string $route
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create');
依赖类:\x\RpcClient
方法名:func()
参数:
string $func
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
用途:如果该服务是用于代替某些http
业务的,则可能会用到请求头接收,通常情况下RPC业务都用不到该方法。
依赖类:\x\RpcClient
方法名:header()
参数:
array $headers
[]
,非必填
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
依赖类:\x\RpcClient
方法名:param()
参数:
array $param
[]
,非必填
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
$Rpc->param([ // 设置请求参数
'name' => 'sw-x'
]);
用途:当服务通讯异常时,客户端会重复多次请求直至通讯响应正常。
依赖类:\x\RpcClient
方法名:max()
参数:
int $num
1
,非必填
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
$Rpc->param([ // 设置请求参数
'name' => 'sw-x'
]);
$Rpc->max(5); // 最大请求次数
用途:同步的请求会导致业务代码堵塞,例如一些短信发送,邮箱发送,队列添加等无需关心成功状态的服务,我们都可以统一投递到异步请求中。
依赖类:\x\RpcClient
方法名:task()
参数:无
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
$Rpc->param([ // 设置请求参数
'name' => 'sw-x'
]);
$Rpc->max(5); // 最大请求次数
$Rpc->task(); // 投递到异步请求处理
投递请求到异步任务成功后,RpcClient客户端将返回true
。
但当并不代表任务就会执行成功,任务的成功执行需要Rpc服务端业务层自行保证实现。
用途:当请求为异步任务投递时,想接收服务的处理结果,可以使用该方法进行HTTP通知。
依赖类:\x\RpcClient
方法名:callback()
参数:
string $domain
string $type
post
,非必填get
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
$Rpc->param([ // 设置请求参数
'name' => 'sw-x'
]);
$Rpc->max(5); // 最大请求次数
$Rpc->task(); // 投递到异步请求处理
$Rpc->callback('http://www.baidu.com', 'GET'); // 设置异步通知回调地址
异步通知数据格式如下:
array(3) {
["code"]=>
string(3) "200"
["msg"]=>
string(18) "rpc finish success"
["data"]=>
array(0) {
}
}
有时候当我们的RPC节点很多时,若多个节点均被攻击或请求过高,无法请求成功时,系统是会自动轮询下一个节点,直到其中一个节点请求成功时,再返回请求结果的。这样就会导致客户端可能被堵塞等待很长时间。
为了应对这种情况,SW-X的RPC服务支持配置每个RPC请求的最大超时时间,单位为(s)秒。
全局的配置参数在/config/rpc.php
配置文件中,默认为30
秒。
也可以在单个请求中,使用set('out_time', 超时秒数)
方法进行设置。
依赖类:\x\RpcClient
方法名:set()
参数:
string $key
out_time
int $outtime
返回值:this
对象本身
使用示例:
<?php
$Rpc = new \x\RpcClient();
$Rpc->route('order/create'); // 设置路由
$Rpc->func('run'); // 设置路由下的方法
$Rpc->header([]); // 设置请求头
$Rpc->param([ // 设置请求参数
'name' => 'sw-x'
]);
$Rpc->set('out_time', 10); // 设置最大10秒超时
依赖类:\x\RpcClient
方法名:send()
参数:无
返回值:
成功返回服务return
的结果集,失败则为false
。
如果,RPC的返回内容是bool
类型,那就有可能影响业务判断。
为了应对这种情况,可以使用isSuccess()
方法,判断是否真实请求成功。
使用示例:
<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
->func('run')
->header(['sign' => '123456'])
->param(['id' => 1, 'name' => 'sw-x'])
->max(5)
->send(); // 发送请求
依赖类:\x\RpcClient
方法名:isSuccess()
参数:无
返回值:bool
使用示例:
<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
->func('run')
->header(['sign' => '123456'])
->param(['id' => 1, 'name' => 'sw-x'])
->max(5)
->send(); // 发送请求
if ($Rpc->isSuccess()) {
var_dump($body);
} else {
var_dump('no~!');
}
用途:该方法用于获取RPC服务端,自定义msg
的内容,同时若服务发生错误,获取到的则是框架的错误描述内容。
依赖类:\x\RpcClient
方法名:getMsg()
参数:无
返回值:mixed
使用示例:
<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
->func('run')
->header(['sign' => '123456'])
->param(['id' => 1, 'name' => 'sw-x'])
->max(5)
->send(); // 发送请求
if ($Rpc->isSuccess()) {
var_dump($body);
} else {
// 获取错误日志
var_dump($Rpc->getMsg()));
}
用途:RPC客户端请求失败的原因有很多种,除了通过getMsg()
查看错误日志外,还可以通过getStatus()
方法查看错误状态码,若请求成功,状态码则为200
。
依赖类:\x\RpcClient
方法名:getStatus()
参数:无
返回值:int
使用示例:
<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
->func('run')
->header(['sign' => '123456'])
->param(['id' => 1, 'name' => 'sw-x'])
->max(5)
->send(); // 发送请求
if ($Rpc->isSuccess()) {
var_dump($body);
} else {
// 获取错误日志
var_dump($Rpc->getMsg()));
// 获取错误状态码
var_dump($Rpc->getStatus()));
}
为了应对 PHP-FPM 的项目接入 SW-X 的RPC服务,框架为此特提供了 PHP-FPM 服务下的RPC客户端封装。
下载地址如下: