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有专门的组件干这个。
dubbo rpc filter实现剖析(二)的更多相关文章
- dubbo rpc filter实现剖析(一)
2.6.3版本,之前读的是2.4.9版本 本篇主要阐述dubbo rpc的filter的实现,包括作用,用法,原理,与Spring Cloud在这些能力的对比. 共提供了多少个?是哪些?发布时默认装配 ...
- dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter
配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...
- Dubbo RPC源码解读
https://yq.aliyun.com/articles/272405#27 本文代码摘录的时候,将一些与本流程无关的内容去掉了,如有需要请看源码. 一.闲言碎语 使用rpc框架已经多年了,虽然之 ...
- Dubbo的Filter链梳理---分组可见和顺序调整
前言: 刚刚写了篇博文: Dubbo透传traceId/logid的一种思路, 对dubbo的filter机制有了一个直观的理解. 同时对filter也多了一些好奇心, 好奇filter链是如何组织的 ...
- dubbo 自定义 Filter
通过自定义 Filter,可以在 dubbo 调用链中加入特定的逻辑,比如埋点分析调用链. 1. 新建 Filter 类 // @Activate(group = {Constants.CONSUME ...
- dubbo 之filter使用
1.继承接口com.alibaba.dubbo.rpc.Filter实现public Result invoke(Invoker<?> invoker, Invocation invoca ...
- dubbo 使用 filter 报错解决
dubbo可以用filter实现类似tomcat filter过滤器. 实现1.接口请求时间监控. 2.打印输入输出日志(输出日志有应用自己决定) 配置时出现报错. No such extension ...
- Dubbo自定义Filter统一处理异常
Dubbo版本:2.7 使用自定义Filter注意事项 1.自定义名称不能和默认Filter相同,否则可能不生效 2.只用定义Filter类和META-INF下的文本文件,不用添加配置,@Activa ...
- 报错 500 - Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException的解决放案
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/loveliness_peri/artic ...
随机推荐
- springboot集成shiro实现身份认证
github地址:https://github.com/peterowang/shiro pom文件 <dependencies> <dependency> <group ...
- spring boot + spring data jpa
Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...
- 参考消息 Android 读报
<参考消息>是新华通讯社主办,参考消息报社编辑出版的日报,创刊于1931年,历史长达80年.<参考消息>每天及时选载世界各国(地区)通讯社.报刊及因特网上的最新消息.评论的精华 ...
- 手机屏幕材质详解(TFT,TPS,OLED,AMOLED等)
手机屏幕概括起来就是两种,一个是LCD,一个是OLED屏幕,这两个是屏幕显示技术的两大基础. 一 . LCD:Liquid Crystal Display,这是一种介于固态和液态之间的物质,称为液晶技 ...
- Mac OS X El Capitan系统完整性保护System Integrity Protection (SIP)
http://blog.csdn.net/yulimin/article/details/49992031 引言:前段时间经历了XCode编译器代码被注入的事件后,这次 Mac OS X El Cap ...
- 安装python3.6 pip3 flake8
apt-get install python3-pip # Python3 ➜ ~ pip3 -V pip 9 ...
- SC || Git 相关知识
发现大佬的博客:https://www.cnblogs.com/onetwo/p/4157610.html 注:图片来自小姐姐的笔记~ ┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉┉∞ ∞┉┉┉┉∞ ...
- SQLServer锁原理和锁的类型
1.锁的用途 为了避免同时争夺数据库资源,将数据库加锁,只有拿到钥匙的用户才能使用: 2.锁的粒度 行锁(Row)--->页锁(Page)--->区锁(Partition 8个页)---- ...
- 解决在matplotlib使用中文的问题
原生的matplotlib并不支持直接使用中文,而需要修改一下相应的文件,上网搜了下,找到一个最简洁的办法. NO.1 找到matplotlibrc文件 C:\Python26\Lib\site-pa ...
- Java字符串池(String Pool)深度解析(转)
出自 http://www.cnblogs.com/fangfuhai/p/5500065.html 在工作中,String类是我们使用频率非常高的一种对象类型.JVM为了提升性能和减少内存开销,避 ...