转:https://www.cnblogs.com/cdfive2018/p/10219730.html

dubbo框架提供了filter机制的扩展点(本文基于dubbo2.6.0版本)。

扩展接口

在dubbo-rpc模块下的dubbo-rpc-api模块下定义了Filter接口:org.apache.dubbo.rpc.Filter

dubbo自带的filter

dubbo框架自带了22个Filter。

在dubbo-rpc-api模块提供了15个filter:

AccessLogFilter
ActiveLimitFilter
ClassLoaderFilter
CompatibleFilter
ConsumerContextFilter
ContextFilter
DeprecatedFilter
EchoFilter
ExceptionFilter
ExecuteLimitFilter
GenericFilter
GenericImplFilter
TimeoutFilter
TokenFilter
TpsLimitFilter

dubbo-rpc-default模块提供了2个filter:

FutureFilter
TraceFilter

dubbo-filter模块有2个子模块,提供了2个filter:

dubbo-filter-cache提供了1个Filter:CacheFilter
dubbo-filter-validation提供了1个Filter:ValidationFilter

dubbo-test-examples提供了1个filter:

LogFilter

dubbo-spring-config提供了1个filter:

MockFilter

dubbo-monitor-api提供了1个filter:

MonitorFilter

Filter加载

dubbo应用启动时,通过ProtocolFilterWrapper#buildInvokerChain构建了filter的调用链。
启用demo应用,在buildInvokerChain方法的List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);下一行打个断点,
在调试窗口看观察List<Filter> filters的值,

provider端:

consumer端:

Filter加载顺序

系统自带的filter,上面的图可以可以看到,
provider端:EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->TraceFilter->TimeoutFilter->MonitorFilter->ExceptionFilter
consumer端:ConsumerContextFilter->FutureFilter->MonitorFilter

@Active注解定义了Filter的位置和顺序,其中group属性定义了该Filter用于Provider或Consumer端,order属性定义了Filter的绝对顺序(数值小的排在前面)。

EchoFilter为例

@Activate(group = Constants.PROVIDER, order = -110000)
public class EchoFilter implements Filter {
...
}

表示在Provder端使用,绝对顺序为-110000。

ClassLoaderFilter

@Activate(group = Constants.PROVIDER, order = -30000)
public class ClassLoaderFilter implements Filter {
...
}

表示在Provder端使用,绝对顺序为-30000,值比-110000大,因此在EchoFilter的后面调用。

Filter功能

  • EchoFilter

回声测试。

  • ExceptionFilter

异常处理。


参考:
http://dubbo.apache.org/zh-cn/docs/dev/impls/filter.html

dubbo学习笔记(二)dubbo中的filter的更多相关文章

  1. Dubbo学习笔记(二) Dubbo的基本配置

    Check启动检查 根据之前的学习,我们简单理解的Dubbo远程调用的基本流程,服务提供者注册到注册中心,然后服务消费者通过监听注册中心达到远程调用的目的,那么如果注册中心中没有消费者对应的接口会怎么 ...

  2. dubbo学习笔记二(服务调用)

    项目结构 代码示例 由于之前的IEchoService 的一个方法只是在服务端控制台打印,不便在浏览器测试,所以新添加的方法 api和服务端代码变更 public interface IEchoSer ...

  3. jQuery学习笔记(二)jQuery中DOM操作

    目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...

  4. redis学习笔记(二)——java中jedis的简单使用

    redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...

  5. 鸟书shell 学习笔记(二) shell中正則表達式相关

    通配符与正則表達式的差别 通配符是bash原生支持的语法,正則表達式是处理字符串的一种表示方式, 正則表達式须要支持的工具支持才干够 语系设置 : export LANG=C grep alias 设 ...

  6. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  7. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  8. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  9. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

随机推荐

  1. Springboot自动化部署到docker以及logback按天生成日志

    Dockerfile FROM java:8 VOLUME /tmp ADD maven/sms-0.0.1-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.ja ...

  2. DataPipeline丨「自定义」数据源,解决复杂请求逻辑外部数据获取难题

    A公司专注为各种规模和复杂程度的金融投资机构提供一体化投资管理系统,系统主要由投资组合管理.交易执行管理.实时监控管理.风险管理等功能模块构成.随着企业管理产品数量的不断增多,大量数据分散在各券商系统 ...

  3. android ListView中含有按钮事件实时更新ListView数据案例

    1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...

  4. swift - 开心一刻

    let array = ["one", "two", "three", "four", "five" ...

  5. RxJS——主题(Subject)

    主题(Subjects) 什么是主题?RxJS 主题就是一个特性类型的 Observable 对象,它允许值多路广播给观察者(Observers).当一个简单的 Observable 是单播的(每个订 ...

  6. 消息队列的作用以及kafka和activemq的对比

    背景分析 消息队列这个类型的组件一直是非常重要的组件,当经过两家企业后我就很坚信这个结论了.队列这种东西,最广泛的作用还是在于解耦,宽泛一点的说,它可以将不同部门的工作内容进行有效的整合,基于一个约定 ...

  7. SpringCloud2.0 Eureka Client 服务注册 基础教程(三)

    1.创建[服务提供者],即 Eureka Client 1.1.新建 Spring Boot 工程,工程名称:springcloud-eureka-client 1.2.工程 pom.xml 文件添加 ...

  8. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

  9. python测试开发django-67.templates模板变量取值

    前言 django 的模板里面变量取值是通过句点语法来取值,就是一个点(.)符号.取值的对象也可以是字符串,int类型,list列表,字典键值对,也可以是一个类的实例对象. views视图 比如我在 ...

  10. spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...