与很多框架一样,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. STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. HDURomantic

    Problem - 1004 (hdu.edu.cn) 扩展欧几里得解决线性同余方程.先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解.另一个可以通过相减,或者一样的 ...

  3. MicroPython 8266 配置

    MicroPython 8266 配置 刷固件 下载固件 MicroPython - Python for microcontrollers 从以上网址下载固件,本文下载的是esp8266-20210 ...

  4. RHCSA 第七天

    1.创建文件,并赋予权限611(两种方式,一种guoa,一种nnn) 2.创建目录,并赋予权限755(两种方式,一种guoa,一种nnn) 3.创建文件,并将文件的属主和属组修改其他用户 4.设置su ...

  5. 【pwn】DASCTF Sept 九月赛

    [pwn]DASCTF Sept 月赛 1.hehepwn 先查看保护,栈可执行,想到shellcode 这题需要注意shellcode的写法 拖入ida中分析 一直以为iso scanf不能栈溢出, ...

  6. 『德不孤』Pytest框架 — 2、Pytest的基本使用

    目录 1.Pytest安装 2.Pytest常用插件 3.Pytest运行的第一个例子 4.Pytest框架的运行方式 5.在PyCharm中以Pytest的方式运行测试用例 1.Pytest安装 C ...

  7. 搭建服务器之文件共享cifs,nfs,samba

    cifs: 微软系统中用于网上邻居共享的一个机制,在linux下也可以通过命令mount -t cifs .....来挂载共享的文件目录等. nfs: linux之间的共享文件方式,基于rpc ser ...

  8. centos,fedora,ubuntu,opensuse感想

    最先接触的是ubuntu,貌似身边同学用的最多,出了什么问题,网上解决方法也很多,但是后来学鸟哥私房菜,就按照他说的在实验室电脑装了一个centos,果然为服务器而生,稳定得很,界面朴素,装日常软件比 ...

  9. 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求

    一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...

  10. Kubernetes的Pod进阶(十一)

    一.Lifecycle 官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ 通过前面的分享,关于pod是什么相信看 ...