DubboFilter 使用


前言

项目中使用了dubbo,想实现拦截的功能,查看源码对dubbo-filter 做下了解

dubbo-filter-validation 源码查看

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
30
/**
* ValidationFilter
*/
@Activate(group = {Constants.CONSUMER, Constants.PROVIDER}, value = Constants.VALIDATION_KEY, order = 10000)
public class ValidationFilter implements Filter {

private Validation validation;

public void setValidation(Validation validation) {
this.validation = validation;
}

public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if (validation != null && !invocation.getMethodName().startsWith("$")
&& ConfigUtils.isNotEmpty(invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.VALIDATION_KEY))) {
try {
Validator validator = validation.getValidator(invoker.getUrl());
if (validator != null) {
validator.validate(invocation.getMethodName(), invocation.getParameterTypes(), invocation.getArguments());
}
} catch (RpcException e) {
throw e;
} catch (Throwable t) {
return new RpcResult(t);
}
}
return invoker.invoke(invocation);
}

}

ValidationFilter 类继承Filter接口, 重写 invoke方法对调用方法参数进行拦截,每个Filter都要加上@Activate注解用于激活,group当其中一个组匹配时,激活当前扩展,order为Filter排序,可选参数。

dubbo-filter-validation配置

配置在META-INF/dubbo/internal/com.alibaba.dubbo.rpc.filter 文件
文件内容
validation=com.alibaba.dubbo.validation.filter.ValidationFilter

dubbo-filter-exception 项目中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Activate(group = Constants.PROVIDER)
public class DubboFilter implements Filter {

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

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {
logger.info("#############DubboFilter start###############" );
Result result = invoker.invoke(invocation);
Throwable exception = result.getException();
if (exception != null) {
logger.error("dubbo " + invocation.getMethodName()+" error-->" , exception);
result = new RpcResult(Result.error("请求异常拦截", "-1"));
}
logger.info("#############DubboFilter end###############" );
return result;
}
}

dubbo-filter-exception 配置

配置在META-INF/dubbo/com.alibaba.dubbo.rpc.filter 文件
文件内容
dubboFilter=com.xx.xx.xx.filter.DubboFilter

运行结果

1
2
3
[10-11 13:37:31.031] [WARN] [cat] Cat is lazy initialized!
this app is start
{"message":"请求异常拦截","result":null,"status":false,"statusCode":"-1"}

总结

可以通过filter 对接口请求、返回、异常 全局进行拦截和过滤。