//保存引用,后续用于把真正的调用者保存到过滤器链的最后
Invoker last = invoker;
List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.gerUrl(),key,group);
if(!filters.isEmpty()){
for(int i = filters.size();i>=0;i--){
final Filter filter = filters.get(i);
final Invoker next = last;
last = new Invoker(){
...
@Override
public Result invoke() throws RpcException{
//设置过滤器的下一个节点,形成链
Result result = filter.invoke(next,invocation);
if(result instanceof AsyncRpcResult){
AsyncRpcResult asyncResult = (AsyncResult)result;
asyncResult.thenApplyWithContext(r->filter.onResponse(r,invoker,invocation));
return asyncResult;
}else{
return filter.onResponse(result,invoker,invocation);
}
}
...
}
}
}
return last;