RPC服务的相关服务控制器代码,统一存放在/app/rpc/
目录下。
服务控制器可以不继承任何框架基类。
但从v2.5.1
版本起,框架提供了专属RPC控制器的系统基类,继承\x\controller\Rpc
基类,可以更清晰的书写控制器代码。
RPC客户端的请求方式,类似于调用类的某个方法,例如下面的客户端调用代码:
<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
->func('run')
->param(['id' => 1, 'name' => 'sw-x'])
->send();
就是请求的\app\rpc\order\create
RPC服务类,里面的run()
操作方法。
1、创建RPC服务控制器时,每个允许被客户端访问的RPC操作方法,都必须是public
类型,同时不能声明static
静态属性。
2、不能定义名为$headers
、$param
、$msg
、$rpc_msg
、$rpc_error
这5个成员属性变量,因为该变量已被框架赋值占用。
3、RPC操作方法中return
的值,即为RPC客户端所获得的返回内容。
可以理解为:服务端返回,既客户端所得。
不继承系统基类,创建order/create -> run
服务代码:
文件地址:\app\rpc\order\create.php
namespace app\rpc\order;
class create {
/**
* 我是order/create->run()服务
*/
public function run() {
// 可以这样获取请求头
$headers = $this->headers;
// 可以这样获取请求参数
$param = $this->param;
// 可以这样设置返回值说明
$this->msg = '缺少某些请求参数啦!';
// 直接抛出返回值
return false;
}
}
继承系统基类,创建order/create -> run
服务代码:
文件地址:\app\rpc\order\create.php
当继承该基类时,控制器风格更偏向面向对象方式。
namespace app\rpc\order;
// 新版本都应该继承系统基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 可以这样获取请求头
$headers = $this->headers();
// 可以这样获取请求参数
$param = $this->param();
// 可以这样设置返回值说明
$this->msg('缺少某些请求参数啦!');
// 可以这样抛出返回值,并同时设置返回值说明
return $this->fetch(false, '缺少某些请求参数啦!');
// 当然,也支持这样获取请求头
$headers = $this->headers;
// 当然,也支持这样获取请求参数
$param = $this->param;
// 当然,也支持直接设置返回值说明
$this->msg = '缺少某些请求参数啦!';
// 当然,也支持直接抛出返回值
return false;
}
}
注意:服务创建完成后,此时客户端还不能调用,开发者还需要到Web服务中心注册相关服务,具体参考部署服务中心章节。
依赖类:\x\controller\Rpc
方法名:param()
版本:v2.5.1
版本起支持
参数:无
返回值:array
示例代码:
namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 可以这样获取请求参数
$param = $this->param();
// 当然,也支持这样获取请求参数
$param = $this->param;
}
}
依赖类:\x\controller\Rpc
方法名:headers()
版本:v2.5.1
版本起支持
参数:无
返回值:array
示例代码:
namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 可以这样获取请求头
$headers = $this->headers();
// 当然,也支持这样获取请求头
$headers = $this->headers;
}
}
依赖类:\x\controller\Rpc
方法名:fetch()
版本:v2.5.1
版本起支持
参数:
mixed $return
string $msg
SUCCESS
,非必填
返回值:$return
的内容
示例代码:
namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 可以这样抛出返回值,并同时设置返回值说明
return $this->fetch(false, '缺少某些请求参数啦!');
// 也可以只抛出返回值
return $this->fetch(false);
// 更简洁的,你还可以直接return
return false;
}
}
场景:虽然fetch()
方法可以在输出结果集的同时,设置msg
内容,但有些时候业务往往是最后才抛出结果集,但中途却要各种判断,提前设置好各种场景下的msg
说明。
依赖类:\x\controller\Rpc
方法名:msg()
版本:v2.5.1
版本起支持
参数:
string $msg
返回值:无
示例代码:
namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 可以这样设置
$this->msg('缺少某些请求参数啦!');
// 也可以这样设置
$this->msg = '缺少某些请求参数啦!'
// 可以这样抛出返回值,并同时设置返回值说明
return $this->fetch(false, '缺少某些请求参数啦!');
}
}
场景:往往在日常开发中,开发者会遇到在某种情况下逻辑处理不通过,例如第三方API调用失败等场景,按照习惯,这种请求需要记录到日志当中,便于排查。
而在这种场景下,标记请求处理异常,框架则会自动把当次请求的相关信息,记录到Web服务中心当中。
数据存储在Redis,单个服务节点异常最大记录上限,默认是20
条,超出则会把最早一条记录删除。
若要修改上限,可以在/config/rpc.php
文件中进行修改,参数名称是rpc_error_max
。
依赖类:\x\controller\Rpc
方法名:error()
版本:v2.5.1
版本起支持
参数:
string $msg
返回值:无
示例代码:
namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;
class create extends Rpc{
/**
* 我是\order\create->run()服务
*/
public function run() {
// 假设这个是第三方API服务
$res = new API();
if (!$res) {
// 记录该次请求为异常请求 并设置自定义错误内容
$this->error($res['msg']);
}
// 如果是发短信这种不应该核心业务的功能,代码还是得往下走的
// 最终不影响客户端的结果
return $this->fetch(true);
}
}