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有专门的组件干这个。