这个地方非常重要,dubbo机制里面日志记录、超时等等功能都是在这一部分实现的。
如上一节在介绍扩展点加载时所述,在生成 Protocol 的 invoker 时,实际上使用了
装饰模式,第一个是 filter,第二个是 listener。这个类有 3 个特点,第一它有一个参数为 Protocol protocol 的构造函数;第二,它
实现了 Protocol 接口;第三,它使用职责链模式,对 export 和 refer 函数进行了封装; 对于函数封装,有点类似于 tomcat 的 filter 机制;我们来看 buildInvokerChain 函数:它读取所有的 filter 类,利用这些类封装 invoker; 我们先来看 filter,具体 ProtocolFilterWrapper 类:public class ProtocolFilterWrapper implements Protocol { private final Protocol protocol; public ProtocolFilterWrapper(Protocol protocol) { if (protocol == null) { throw new IllegalArgumentException("protocol == null"); } this.protocol = protocol; } private staticInvoker buildInvokerChain(final Invoker invoker, String key, String group) { Invoker last = invoker; // Filter.class = com.alibaba.dubbo.rpc.Filter // 读取dubbo-rpc-api工程中的com.alibaba.dubbo.rpc.Filter文件,获取文件中所有Filter的实例。size = 14 // 并根据isMatchGroup()方法过滤和group一致的Filter。size = 8。 group = consumer / provider List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group); if (filters.size() > 0) { for (int i = filters.size() - 1; i >= 0; i--) { final Filter filter = filters.get(i); final Invoker next = last; last = new Invoker (){...}; } } return last; }}
dubbo-rpc-api工程中的com.alibaba.dubbo.rpc.Filter
echo=com.alibaba.dubbo.rpc.filter.EchoFiltergeneric=com.alibaba.dubbo.rpc.filter.GenericFiltergenericimpl=com.alibaba.dubbo.rpc.filter.GenericImplFiltertoken=com.alibaba.dubbo.rpc.filter.TokenFilteraccesslog=com.alibaba.dubbo.rpc.filter.AccessLogFilteractivelimit=com.alibaba.dubbo.rpc.filter.ActiveLimitFilterclassloader=com.alibaba.dubbo.rpc.filter.ClassLoaderFiltercontext=com.alibaba.dubbo.rpc.filter.ContextFilterconsumercontext=com.alibaba.dubbo.rpc.filter.ConsumerContextFilterexception=com.alibaba.dubbo.rpc.filter.ExceptionFilterexecutelimit=com.alibaba.dubbo.rpc.filter.ExecuteLimitFilterdeprecated=com.alibaba.dubbo.rpc.filter.DeprecatedFiltercompatible=com.alibaba.dubbo.rpc.filter.CompatibleFiltertimeout=com.alibaba.dubbo.rpc.filter.TimeoutFilter