更新時(shí)間:2022-05-26 10:20:35 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2123次
服務(wù)提供方的過(guò)濾器被調(diào)用順序:app
EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->(這4個(gè)是在代碼中指定的)ide
ExceptionFilter-> TimeoutFilter ->MonitorFilter-> TraceFilter.net
服務(wù)消費(fèi)方的過(guò)濾器順序:blog
ConsumerContextFilter->FutureFilter->MonitorFilter排序
負(fù)責(zé)加載過(guò)濾器的類文檔
ProtocolFilterWrapperget
這個(gè)順序和SPI配置文件的順序并不一致。那么是什么決定了Filter的順序呢?
經(jīng)過(guò)查看源代碼能夠看到,在初始化Filter時(shí),有一個(gè)對(duì)全部的過(guò)濾器排序的過(guò)程,其使用的比較類是ActivateComparator。在這個(gè)類中,能夠看到,是使用Filter中的Activate類進(jìn)行排序的。而Activate注解中,有一個(gè)order的屬性,這個(gè)屬性指定了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;
}
經(jīng)過(guò)查看EchoFilter的Activate屬性,能夠看到其order = -110000,而ClassLoaderFilter的order=-30000,所以能夠判定,order值越小,其越位于調(diào)用端的最頂層。
以下:
@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;
}
}
從上面能夠看出,若是須要規(guī)定自定義的Filter的執(zhí)行順序,能夠經(jīng)過(guò)設(shè)置自定義的Filter的@Active注解中order屬性值,越小越先執(zhí)行。
那么當(dāng)order相同時(shí)(都沒(méi)有設(shè)置時(shí)),又是根據(jù)什么排序的呢?
Collections.sort算法
從其說(shuō)明文檔能夠看出,這個(gè)算法是一個(gè)穩(wěn)定的排序算法,若是兩個(gè)值相同,不會(huì)改變其先后順序。而且從其文檔能夠看出,其所使用的是一個(gè)修改過(guò)的歸并排序算法。
可是Activate的compare方法故意將兩個(gè)相同的order類弄成了不一樣,致使排序有些變化。形成了最終上述順序。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)