dubbo rpc filter實現剖析(二)

2.6.3版本,以前讀的是2.4.9版本
本篇主要闡述dubbo rpc的filter的實現,包括做用,用法,原理,與Spring Cloud在這些能力的對比。html

整個filter列表的獲取過程在
com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.buildInvokerChain(Invoker , String, String) java

List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);

getActivateExtension會根據filter的註解與url中配置參數結合,過濾出本次命中的filter。spring

ConsumerContextFilter

做用

在consumer端,進行一些參數設置,諸如本端地址,對端地址等。apache

使用方式

無需配置,consumer側默認使用。
在dubbo中,對於這些filter若是在META-INF中配置了且filter類的註解@Activate上沒有配置value值,那麼就是默認使用。 能夠參見com.alibaba.dubbo.common.extension.ExtensionLoader.isActive(Activate, URL)方法實現。併發

實現原理

參見代碼便可,比較簡單。app

與Spring Cloud對比

N/A異步

ExceptionFilter

做用

在provider端,對調用異常進行選擇性進行包裝。
非受檢異常直接拋出,jdk的異常直接拋出,異常類與接口類在一個jar包內的直接拋出,是服務接口方法本身聲明的要throw的異常直接拋出。
其他包裝成受檢異常放到RpcResult中返回。ide

使用方式

無需配置,provider側默認使用。源碼分析

實現原理

參見代碼便可,比較簡單。ui

與Spring Cloud對比

N/A

DeprecatedFilter

做用

對於DEPRECATED的方法打一行錯誤日誌。 是配置在consumer端,沒太明白他的實際做用,既然要在consumer端配置DEPRECATED,還要打日誌作啥呢?consumer端就知道了啊。 有點不解。 或許就是爲了標註,這是一個廢棄的調用吧。

使用方式

consumer端配置。

<dubbo:reference id="userService" interface="org.simonme.dubbo.demo.provider.service.UserService" filter="deprecated" >  
        <dubbo:method name="queryUser">
            <dubbo:parameter key="deprecated" value="true" />
        </dubbo:method>
    </dubbo:reference>

實現原理

參見代碼便可,比較簡單。

與Spring Cloud對比

Spring Cloud貌似沒有這個能力。

CompatibleFilter

做用

兼容適配器,能對結果返回值作一些類型轉換,注入基本類型到裝箱類型的互轉,複合類型到序列化值的轉換(依賴你配置的序列化類型)等。

使用方式

在consumer配置的filter上加上compatible便可。

實現原理

參見CompatibleFilter代碼便可,比較簡單。

與Spring Cloud對比

TODO

TimeoutFilter

做用

用在provider側,對超時的服務調用,打一個警告日誌。

使用方式

無需配置,默認生效。

實現原理

參見TimeoutFilter代碼便可,比較簡單。

與Spring Cloud對比

TODO

TraceFilter

做用

用在provider側。

使用方式

無需配置,默認啓用這個filter,可是要真正trace,須要telnet管理臺,給其發指令,才能真正trace。支持指定接口,指定方法,指定最大trace多少次。

實現原理

trace的內容以下:

if (count < max) {
    String prompt = channel.getUrl().getParameter(Constants.PROMPT_KEY, Constants.DEFAULT_PROMPT);
      channel.send("\r\n" + RpcContext.getContext().getRemoteAddress() + " -> "
                                        + invoker.getInterface().getName()
                                        + "." + invocation.getMethodName()
                                        + "(" + JSON.toJSONString(invocation.getArguments()) + ")" + " -> " + JSON.toJSONString(result.getValue())
                                        + "\r\nelapsed: " + (end - start) + " ms."
                                        + "\r\n\r\n" + prompt);
}

與Spring Cloud對比

TODO

FutureFilter

做用

用在consumer側。dubbo的事件機制支持oninvoke、onreturn、onreturn事件監聽,就是靠這個filter完成對接。

使用方式

參見dubbo的事件機制

實現原理

比較簡單,參見FutureFilter代碼。或者參見Dubbo源碼分析----過濾器之FutureFilter

與Spring Cloud對比

TODO

與Spring Cloud對比

TODO

MonitorFilter

做用

consumer,provider側均可用。 會將服務的耗時,併發數等送給監控服務。

使用方式

filter默認啓用,可是須要配置後才能觸發監控。 配置dubbo:monitor。

實現原理

比較簡單,參見MonitorFilter。 具體收集監控動做由MonitorService接口實現完成。dubbo自帶了DubboMonitor實現。收集的數據暫時同步擦歐洲放在一個ConcurrentHashMap中,再由ScheduledExecutorService定時異步發送。

與Spring Cloud對比

Spring Cloud有專門的組件幹這個。

相關文章
相關標籤/搜索