数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

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

    • 功能:最多请求N次
    • 值单位:数字
    • 默认值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客户端封装。
下载地址如下:

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录