Dubbo过滤器 - TimeoutFilter

概述

服务提供端的超时过滤器,即如果服务调用超时,记录告警日志,不干涉服务的运行。

TimeoutFilter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Activate(group = Constants.PROVIDER)
public class TimeoutFilter implements Filter {

private static final Logger logger = LoggerFactory.getLogger(TimeoutFilter.class);

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 调用开始时间
long start = System.currentTimeMillis();
// 执行服务调用逻辑
Result result = invoker.invoke(invocation);
// 计算调用消耗时长
long elapsed = System.currentTimeMillis() - start;

/**
* 注意:
* 1 这里timeout 是服务提供者的配置,不同于服务消费者的配置。
* 2 服务提供者执行服务即使超时了也不会取消执行,而消费者已经结束了调用,返回调用超时
*/
if (invoker.getUrl() != null && elapsed > invoker.getUrl().getMethodParameter(invocation.getMethodName(), "timeout", Integer.MAX_VALUE)) {
if (logger.isWarnEnabled()) {
logger.warn("invoke time out. method: " + invocation.getMethodName()
+ " arguments: " + Arrays.toString(invocation.getArguments()) + " , url is "
+ invoker.getUrl() + ", invoke elapsed " + elapsed + " ms.");
}
}
return result;
}
}

小结

TimeoutFilter 用于记录服务端执行逻辑超时日志,是对 Dubbo 框架中所有服务的监控。