dubbo源码解析(三)

这个地方非常重要,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 static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
    Invoker<T> 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<Filter> 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<T> next = last;
        last = new Invoker<T>(){...};
			}
		}
		return last;
	}
}

dubbo-rpc-api工程中的com.alibaba.dubbo.rpc.Filter

echo=com.alibaba.dubbo.rpc.filter.EchoFilter
generic=com.alibaba.dubbo.rpc.filter.GenericFilter
genericimpl=com.alibaba.dubbo.rpc.filter.GenericImplFilter
token=com.alibaba.dubbo.rpc.filter.TokenFilter
accesslog=com.alibaba.dubbo.rpc.filter.AccessLogFilter
activelimit=com.alibaba.dubbo.rpc.filter.ActiveLimitFilter
classloader=com.alibaba.dubbo.rpc.filter.ClassLoaderFilter
context=com.alibaba.dubbo.rpc.filter.ContextFilter
consumercontext=com.alibaba.dubbo.rpc.filter.ConsumerContextFilter
exception=com.alibaba.dubbo.rpc.filter.ExceptionFilter
executelimit=com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter
deprecated=com.alibaba.dubbo.rpc.filter.DeprecatedFilter
compatible=com.alibaba.dubbo.rpc.filter.CompatibleFilter
timeout=com.alibaba.dubbo.rpc.filter.TimeoutFilter

转载于:https://my.oschina.net/u/3135467/blog/806429

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值