我是一段不羁的公告!
记得给艿艿这 3 个项目加油,添加一个 STAR 噢。
https://github.com/YunaiV/SpringBoot-Labs
https://github.com/YunaiV/onemall
https://github.com/YunaiV/ruoyi-vue-pro

精尽 Dubbo 源码分析 —— 过滤器(五)之 TimeoutFilter

本文基于 Dubbo 2.6.1 版本,望知悉。

1. 概述

本文分享过滤器 TimeoutFilter ,用于服务提供者中。

2. TimeoutFilter

com.alibaba.dubbo.rpc.filter.TimeoutFilter ,实现 Filter 接口,超时过滤器。如果服务调用超时,记录告警日志,不干涉服务的运行。代码如下:

 1: @Activate(group = Constants.PROVIDER)
2: public class TimeoutFilter implements Filter {
3:
4: private static final Logger logger = LoggerFactory.getLogger(TimeoutFilter.class);
5:
6: @Override
7: public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
8: long start = System.currentTimeMillis();
9: // 服务调用
10: Result result = invoker.invoke(invocation);
11: // 计算调用时长
12: long elapsed = System.currentTimeMillis() - start;
13: // 超过时长,打印告警日志
14: if (invoker.getUrl() != null
15: && elapsed > invoker.getUrl().getMethodParameter(invocation.getMethodName(), "timeout", Integer.MAX_VALUE)) {
16: if (logger.isWarnEnabled()) {
17: logger.warn("invoke time out. method: " + invocation.getMethodName()
18: + " arguments: " + Arrays.toString(invocation.getArguments()) + " , url is "
19: + invoker.getUrl() + ", invoke elapsed " + elapsed + " ms.");
20: }
21: }
22: return result;
23: }
24:
25: }
  • 第 10 行:调用 Invoker#invoke(invocation) 方法,服务调用。
  • 第 12 行:计算调用时长。
  • 第 13 至 21 行:超过时长,打印告警日志。注意,此处的 "timeout" 取得的是服务提供者的配置,不同于服务消费者的配置。
  • 第 22 行:返回调用结果。
  • 🙂 再注意,在服务提供者,执行服务调用时,即使超过了超时时间,也不会取消执行。虽然,服务消费者,已经结束调用,返回调用超时。

666. 彩蛋

水更一篇。

知识星球

总访客数 && 总访问量