2.6.3版本,以前讀的是2.4.9版本
本篇主要闡述dubbo rpc的filter的實現,包括做用,用法,原理,與Spring Cloud在這些能力的對比。html
整個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。spring
在consumer端,進行一些參數設置,諸如本端地址,對端地址等。apache
無需配置,consumer側默認使用。
在dubbo中,對於這些filter若是在META-INF中配置了且filter類的註解@Activate上沒有配置value值,那麼就是默認使用。 能夠參見com.alibaba.dubbo.common.extension.ExtensionLoader.isActive(Activate, URL)方法實現。併發
參見代碼便可,比較簡單。app
N/A異步
在provider端,對調用異常進行選擇性進行包裝。
非受檢異常直接拋出,jdk的異常直接拋出,異常類與接口類在一個jar包內的直接拋出,是服務接口方法本身聲明的要throw的異常直接拋出。
其他包裝成受檢異常放到RpcResult中返回。ide
無需配置,provider側默認使用。源碼分析
參見代碼便可,比較簡單。ui
N/A
對於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貌似沒有這個能力。
兼容適配器,能對結果返回值作一些類型轉換,注入基本類型到裝箱類型的互轉,複合類型到序列化值的轉換(依賴你配置的序列化類型)等。
在consumer配置的filter上加上compatible便可。
參見CompatibleFilter代碼便可,比較簡單。
TODO
用在provider側,對超時的服務調用,打一個警告日誌。
無需配置,默認生效。
參見TimeoutFilter代碼便可,比較簡單。
TODO
用在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); }
TODO
用在consumer側。dubbo的事件機制支持oninvoke、onreturn、onreturn事件監聽,就是靠這個filter完成對接。
參見dubbo的事件機制。
比較簡單,參見FutureFilter代碼。或者參見Dubbo源碼分析----過濾器之FutureFilter
TODO
TODO
consumer,provider側均可用。 會將服務的耗時,併發數等送給監控服務。
filter默認啓用,可是須要配置後才能觸發監控。 配置dubbo:monitor。
比較簡單,參見MonitorFilter。 具體收集監控動做由MonitorService
接口實現完成。dubbo自帶了DubboMonitor
實現。收集的數據暫時同步擦歐洲放在一個ConcurrentHashMap中,再由ScheduledExecutorService定時異步發送。
Spring Cloud有專門的組件幹這個。