dubbo rpc filter實現剖析(二)


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

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

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

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

ConsumerContextFilter

作用

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

使用方式

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

實現原理

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

與Spring Cloud對比

N/A

ExceptionFilter

作用

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

使用方式

無需配置,provider側默認使用。

實現原理

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

與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有專門的組件干這個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM