与很多框架一样,Dubbo也存在拦截(过滤)机制,可以通过该机制在执行目标程序前后执行我们指定的代码。Dubbo中Filter只是Dubbo提供的可自定义扩展的扩展点之一。通过该扩展点地理解,可以触类旁通地理解其他类似自激活的扩展点。

  那么什么是自激活?如果一个扩展点有多个实现,那么最后究竟使用哪个实现呢?根据不同的条件参数来动态选择可以使用的扩展时(可能需要同时使用多个扩展),就会使用到自激活扩展了。这个就是自激活。

  Dubbo的Filter机制是专门为服务提供方和服务消费方调用过程进行拦截设计的,每次远程方法执行该拦截都会被执行。这样就为开发者提供了非常方便的扩展性,比如为dubbo接口实现监控功能、日志功能等。

  从Dubbo已实现的Filter中看具体如何实现:就用id为trace的filter

    

  该Filter的类图如下:

    

  对于@SPI之前注解前面已经阐述了,这里重点阐述@Activate和Filter接口中的invoke方法。

    

  首先看Filter接口:

    

    通过接口注释可以看到整个Filter中invoke方法的执行顺序:invoker.invoke(invocation)必须执行一个filter的实现类才会有效工作。

  再看@Activate注解:

    这个注解中仍有效的group等如何赋值是一个需要关注的问题。根据该注解中的注释:

      

    可知SPI的框架定义了有效的group值,value值由URL判断是否有效。即group和value代表激活的条件,group代表URL中的分组,value代表URL中的key。如果匹配条件,则会激活扩展;order指定了扩展使用的顺序,值越小越早。

  关于URL与注解中值的关系在SPI自适应中已经有体现(参考Dubbo SPI机制之三Adaptive自适应功能 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),那么group的值有哪些呢?在Dubbo的SPI框架中提供了哪些可选的group的值?

  通过TraceFilter上的注解,可以明确group的访问在接口CommonConstants中,那哪些是group的可选值?参考dubbo官方文档,可知  

    

  对于Filter与@Active具体使用范例,如下:

    

  下面自定义一个Filter,记录消费端每次调用耗时进行上述范例的具体实践。并利用该统计,计算调用方法的TP90和TP99。

  1、自定义一个Filter,仅被消费端使用:

    1)自定义一个TPMonitorFilter类implements Filter

      

   2)在 META-INF.dubbo 中新建 org.apache.dubbo.rpc.Filter 文件,并将当前类的全名写入timerFilter=包名.过滤器的名字

      

  2、消费端引用上述Filter所属依赖,并调用。

    1)引用该依赖

      

    2)调用

      

  3、主程序中执行打印TP90及TP99:

    

    结果:

    

  补充:之前阐述过自适应,那么自激活与自适应的区别在哪里,都是一个扩展点有多个实现?

    区别在于自激活具体使用哪些实现类体现在配置或代码中的;而自适应是在运行时,通过URL参数来动态确定运行某一个实现。即自激活可以同时加载一个扩展点的一个或多个实现(个人理解为类似AOP,不知道实现是否使用AOP,待验证),而自适应仅能加载一个实现。

    

    

  

Dubbo扩展点应用之一filter及@Activate自激活使用的更多相关文章

  1. Dubbo扩展点应用之二负载均衡

    负载均衡其本质就是将请求分摊到多个操作单元上进行,从而共同完成工作任务.其策略主要用于客户端春常在多个提供者时根据算法选择某个提供者.在集群负载均衡时,Dubbo提供了多种均衡策略(包括随机.轮询.最 ...

  2. 从ExtensionLoader理解Dubbo扩展机制

    Dubbo的扩展机制是怎么实现的?最简单的回答就是@SPI. Dubbo的插件化思路来源于Java SPI.   JAVA SPI 机制     SPI的全名为Service Provider Int ...

  3. 关于dubbo扩展点的一点分析

    扩展点能力 能load class,这个class除了顶层接口class(在ExtensionLoader中对应type字段),还能load各实现类的class. 能创建instance. 能指定这个 ...

  4. 从Spring容器的角度理解Dubbo扩展点的加载时机

    对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool.那么这样的扩展点在程序运行的哪个节点调用的呢?跟踪之前性能监控扩展点 ...

  5. (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案

    在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...

  6. dubbo扩展

    dubbo源码版本:2.5.4 经统计,dubbo一共有31个扩展,如下: ------------------------------------------------------ META-IN ...

  7. (转)Dubbo扩展点实现细节

    实现细节 (+) (#) 初始化过程细节 (+) (#) 解析服务 基于dubbo.jar内的META-INF/spring.handlers配置,Spring在遇到dubbo名称空间时,会回调Dub ...

  8. Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI

    SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实 ...

  9. dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter

    配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...

随机推荐

  1. python极简教程06:生成式和装饰器

    测试奇谭,BUG不见. 这一场,主讲python的生成式和装饰器. 目的:掌握四种生成式(列表.生成器.集合.字典),装饰器的原理和使用. 生成式 01 什么是生成式? 能够用一行代码,快速高效的生成 ...

  2. CTF-sql-宽字节注入

    本文章主要涉及sql宽字节注入注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.首先介绍一下本篇文章所用到的知识点: 常用到的url编码: 空格:%20 单引号:%27 在sql ...

  3. 《剑指offer》面试题32 - II. 从上到下打印二叉树 II

    问题描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 ...

  4. pytest文档4-fixture之conftest.py

    用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然这就无法用setup和teardown来实现了.fixture之conftest.py就是自定义测试用例的预置条件 1.firture相对于 ...

  5. 44.Prim算法

    public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E', ...

  6. golang中的sync

    1. Go语言中可以使用sync.WaitGroup来实现并发任务的同步 package main import ( "fmt" "sync" ) func h ...

  7. golang中值类型的嵌入式字段和指针类型的嵌入式字段

    总结: 1. 值类型的嵌入式字段,该类型拥有值类型的方法集,没有值指针类型的方法集 2. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的 ...

  8. 通过location.search来获取页面传来的参数

    获取页面传来的参数 <div> <script> function GetQueryString(name) { var reg = new RegExp("(^|& ...

  9. 使用 C# 开发 Kubernetes 组件,获取集群资源信息

    写什么呢 前段时间使用 C# 写了个项目,使用 Kubernetes API Server,获取信息以及监控 Kubernetes 资源,然后结合 Neting 做 API 网关. 体验地址 http ...

  10. 手把手教你丨小熊派移植华为 LiteOS-M

    摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...