filter概述
- dubbo filter与servlet filter 或 XXX filter ... 设计思路一样;在目标方法执行前, 后插入filter功能代码,实现类似AOP的能力
- 多个filter在排好序后组成调用链执行;责任链设计模式
- dubbo filter 通常分为 :provider 和 consumer两种,通过 @Activate(group = CONSUMER) 注解中group参数可进行区分,服务调用方 只会加载执行“group = CONSUMER”的filter,服务提供方“group = Provider”的filter
dubbo filter源码分析
相关接口概念
- Invocation,Invoker,Invoker 之间仅存在方法参数层面的依赖关系
- Invocation 可理解为java方法的元数据对象
- Invoker 可理解为java方法执行调用器(Invocation 作为方法参数)
- Invoker 执行invoke方法可理解为目标方法被执行
- Filter 中接口方法持有Invoker,Invocation,可理解为目标方法执行器与目标方法元数据
@SPI
public interface Filter {
/**
* filter 接口方法
* invoker 方法调用对象
* invocation 方法名/参数/返回值... 数据结构
*/
Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException;
interface Listener {
// 调用调用
void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation);
// 异常调用
void onError(Throwable t, Invoker<?> invoker, Invocation invocation);
}
}
// 方法调用对象
public interface Invoker<T> extends Node {
Class<T> getInterface();
// 方法调用
Result invoke(Invocation invocation) throws RpcException;
}
// 方法对象
public interface Invocation {
String getTargetServiceUniqueName();
String getMethodName();
String getServiceName();
...
}
filter的链式调用
ProtocolFilterWrapper#buildInvokerChain方法
- ExtensionLoader加载出本次调用需要的filter列表,并已排好序
- buildInvokerChain 方法参数中的invoker 可理解为最初的目标方法执行器
- for循环为每个filter创建一个invoker并在invoker#invoke 方法中调用filter#invoke方法;
- filter0对应invoker0... filter2对应invoker2,srcInvoker为ProtocolFilterWrapper#buildInvokerChain中Invoker<T>参数对象
- 具体的每个filter实现类会调用 invoker.invoke(invocation);
- for循环倒序创建invoker,循环结束形成的inv