专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Dubbo的Filter执行顺序

Dubbo的Filter执行顺序

更新时间:2022-05-26 10:20:35 来源:动力节点 浏览1442次

服务提供方的过滤器被调用顺序:app

EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->(这4个是在代码中指定的)ide

ExceptionFilter-> TimeoutFilter ->MonitorFilter-> TraceFilter.net

服务消费方的过滤器顺序:blog

ConsumerContextFilter->FutureFilter->MonitorFilter排序

负责加载过滤器的类文档

ProtocolFilterWrapperget

这个顺序和SPI配置文件的顺序并不一致。那么是什么决定了Filter的顺序呢?

经过查看源代码能够看到,在初始化Filter时,有一个对全部的过滤器排序的过程,其使用的比较类是ActivateComparator。在这个类中,能够看到,是使用Filter中的Activate类进行排序的。而Activate注解中,有一个order的属性,这个属性指定了Filter在chain中的顺序。代码以下:io

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Activate {
    String[] group() default {};
    String[] value() default {};
    String[] before() default {};
    String[] after() default {};
    int order() default 0;
}

经过查看EchoFilter的Activate属性,能够看到其order = -110000,而ClassLoaderFilter的order=-30000,所以能够判定,order值越小,其越位于调用端的最顶层。

以下:

@Activate(
    group = {"provider"},
    order = -110000
)
public class EchoFilter implements Filter {
    public EchoFilter() {
    }
    public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {
        return (Result)(inv.getMethodName().equals("$echo") && inv.getArguments() != null && inv.getArguments().length == 1 ? new RpcResult(inv.getArguments()[0]) : invoker.invoke(inv));
    }
}
@Activate(
    group = {"provider"},
    order = -30000
)
public class ClassLoaderFilter implements Filter {
    public ClassLoaderFilter() {
    }
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        ClassLoader ocl = Thread.currentThread().getContextClassLoader();
        Thread.currentThread().setContextClassLoader(invoker.getInterface().getClassLoader());
        Result var4;
        try {
            var4 = invoker.invoke(invocation);
        } finally {
            Thread.currentThread().setContextClassLoader(ocl);
        }
        return var4;
    }
}

从上面能够看出,若是须要规定自定义的Filter的执行顺序,能够经过设置自定义的Filter的@Active注解中order属性值,越小越先执行。

那么当order相同时(都没有设置时),又是根据什么排序的呢?

Collections.sort算法

从其说明文档能够看出,这个算法是一个稳定的排序算法,若是两个值相同,不会改变其先后顺序。而且从其文档能够看出,其所使用的是一个修改过的归并排序算法。

可是Activate的compare方法故意将两个相同的order类弄成了不一样,致使排序有些变化。形成了最终上述顺序。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>