Terminators¶
功能¶
请求结束时的中间件,主要包括资源的回收和调用链信息上报等功能。
接口¶
interface RequestTerminator {
/**
* @param Request $request 请求实例
* @param Response $response 响应实例
* @param Context $context 请求上下文
* @return void
*/
public function terminate(Request $request, Response $response, Context $context);
}
- terminate方法的实现可以为协程或者纯函数。
配置请求与terminate对应关系的规则与Filter相同,类似为:
<?php
return [
'match' => [
// 可以单独针对 所有泛化调用 设置过滤器
[
"/com/Yourcompany/nova/framework/generic/service/GenericService/invoke", "genericServiceFilterGroup",
],
// 也可以直接 针对特定服务配置, 在过滤器内检测是否是泛化调用
[
"/Com/Yourcompany/Nova/Framework/Generic/Php/Service/GenericTestService/ThrowException", "genericServiceFilterGroup",
],
[
".*", "all"
]
],
'group' => [
"genericServiceFilterGroup" => [
TraceTerminator::class
],
"all" => [
TraceTerminator::class
],
]
];
示例¶
class TraceTerminator implements RequestTerminator
{
public function terminate(Request $request, Response $response, Context $context)
{
$trace = $context->get('trace');
if (method_exists($response, 'getException')) {
$exception = $response->getException();
if ($exception) {
$trace->commit($exception);
} else {
$trace->commit(Constant::SUCCESS);
}
} else {
$trace->commit(Constant::SUCCESS);
}
//send数据
yield $trace->send();
}
}
以TraceTerminator为例,其通过context获取trace实例之后,将监控信息进行上报。
自定义terminator会在框架terminator执行之前执行