2.6.3版本,之前讀的是2.4.9版本
本篇主要闡述dubbo rpc的filter的實現,包括作用,用法,原理,與Spring Cloud在這些能力的對比。
整個filter列表的獲取過程在
com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.buildInvokerChain(Invoker
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有專門的組件干這個。