转:https://www.cnblogs.com/cdfive2018/p/10219730.html

dubbo框架提供了filter机制的扩展点(本文基于dubbo2.6.0版本)。

扩展接口

在dubbo-rpc模块下的dubbo-rpc-api模块下定义了Filter接口:org.apache.dubbo.rpc.Filter

dubbo自带的filter

dubbo框架自带了22个Filter。

在dubbo-rpc-api模块提供了15个filter:

AccessLogFilter
ActiveLimitFilter
ClassLoaderFilter
CompatibleFilter
ConsumerContextFilter
ContextFilter
DeprecatedFilter
EchoFilter
ExceptionFilter
ExecuteLimitFilter
GenericFilter
GenericImplFilter
TimeoutFilter
TokenFilter
TpsLimitFilter

dubbo-rpc-default模块提供了2个filter:

FutureFilter
TraceFilter

dubbo-filter模块有2个子模块,提供了2个filter:

dubbo-filter-cache提供了1个Filter:CacheFilter
dubbo-filter-validation提供了1个Filter:ValidationFilter

dubbo-test-examples提供了1个filter:

LogFilter

dubbo-spring-config提供了1个filter:

MockFilter

dubbo-monitor-api提供了1个filter:

MonitorFilter

Filter加载

dubbo应用启动时,通过ProtocolFilterWrapper#buildInvokerChain构建了filter的调用链。
启用demo应用,在buildInvokerChain方法的List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);下一行打个断点,
在调试窗口看观察List<Filter> filters的值,

provider端:

consumer端:

Filter加载顺序

系统自带的filter,上面的图可以可以看到,
provider端:EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->TraceFilter->TimeoutFilter->MonitorFilter->ExceptionFilter
consumer端:ConsumerContextFilter->FutureFilter->MonitorFilter

@Active注解定义了Filter的位置和顺序,其中group属性定义了该Filter用于Provider或Consumer端,order属性定义了Filter的绝对顺序(数值小的排在前面)。

EchoFilter为例

@Activate(group = Constants.PROVIDER, order = -110000)
public class EchoFilter implements Filter {
    ...
}

表示在Provder端使用,绝对顺序为-110000。

ClassLoaderFilter

@Activate(group = Constants.PROVIDER, order = -30000)
public class ClassLoaderFilter implements Filter {
...
}

表示在Provder端使用,绝对顺序为-30000,值比-110000大,因此在EchoFilter的后面调用。

Filter功能

  • EchoFilter

回声测试。

  • ExceptionFilter

异常处理。


参考:
http://dubbo.apache.org/zh-cn/docs/dev/impls/filter.html

12-23 20:58