dubbo源碼解析(三)

這個地方很是重要,dubbo機制裏面日誌記錄、超時等等功能都是在這一部分實現的。java

如上一節在介紹擴展點加載時所述,在生成 Protocol 的 invoker 時,實際上使用了
裝飾模式,第一個是 filter,第二個是 listener。api

這個類有 3 個特色,第一它有一個參數爲 Protocol protocol 的構造函數;第二,它
實現了 Protocol 接口;第三,它使用職責鏈模式,對 export 和 refer 函數進行了封裝;
對於函數封裝,有點相似於 tomcat 的 filter 機制;咱們來看 buildInvokerChain
函數:它讀取全部的 filter 類,利用這些類封裝 invoker;
咱們先來看 filter,具體 ProtocolFilterWrapper 類:tomcat

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.Filterapp

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
相關文章
相關標籤/搜索