Dubbo扩展点应用之一filter及@Activate自激活使用
与很多框架一样,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自激活使用的更多相关文章
- Dubbo扩展点应用之二负载均衡
负载均衡其本质就是将请求分摊到多个操作单元上进行,从而共同完成工作任务.其策略主要用于客户端春常在多个提供者时根据算法选择某个提供者.在集群负载均衡时,Dubbo提供了多种均衡策略(包括随机.轮询.最 ...
- 从ExtensionLoader理解Dubbo扩展机制
Dubbo的扩展机制是怎么实现的?最简单的回答就是@SPI. Dubbo的插件化思路来源于Java SPI. JAVA SPI 机制 SPI的全名为Service Provider Int ...
- 关于dubbo扩展点的一点分析
扩展点能力 能load class,这个class除了顶层接口class(在ExtensionLoader中对应type字段),还能load各实现类的class. 能创建instance. 能指定这个 ...
- 从Spring容器的角度理解Dubbo扩展点的加载时机
对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool.那么这样的扩展点在程序运行的哪个节点调用的呢?跟踪之前性能监控扩展点 ...
- (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案
在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...
- dubbo扩展
dubbo源码版本:2.5.4 经统计,dubbo一共有31个扩展,如下: ------------------------------------------------------ META-IN ...
- (转)Dubbo扩展点实现细节
实现细节 (+) (#) 初始化过程细节 (+) (#) 解析服务 基于dubbo.jar内的META-INF/spring.handlers配置,Spring在遇到dubbo名称空间时,会回调Dub ...
- Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实 ...
- dubbo 提示No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter
配置时 <dubbo:provider filter="DubboExceptionFilter"></dubbo:provider> DubboExcep ...
随机推荐
- vue3.0+vite+ts项目搭建-axios封装(六)
封装方式一 import axios from 'axios' import qs from 'qs' import { Toast } from 'vant' import Lockr from ' ...
- [BZOJ2761] [JLOI2011] 不重复数字 (C++ STL - set)
不重复数字 题目: 给出N个数,要求把其中重复的去掉,只保留第一次出现的数.例如,给出的数 为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 1 ...
- Spring系列2:Spring容器基本概念和使用
本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗地但不严谨地讲,以前 ...
- 《剑指offer》面试题10- II. 青蛙跳台阶问题
问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...
- Solon Web 开发,十三、WebSocket
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- numpy中,从一片c_void_p指向的区域里获取数据
以前采用的数据拷贝的笨办法: 1 bitmap_size = (1080, 1920, 3) 2 buf = create_string_buffer(bitmap_size[0]*bitmap_si ...
- Zotero群组新建后无法显示
我们新建Zotero的群组后无法显示. 此时需要点击文献库,就刷新了. 修改Zotero的群组后无法显示修改后的名称 点击同步即可同步内容.
- deepin20搜狗输入法使用
放大打字框 打出中文语句符号
- golang中数组指针和指针数组当做函数参数如何修改数组中的值
先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...
- Go 命令行参数,JSON 序列化与反序列化
#### Go 命令行参数,JSON 序列,反序列化这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化; 命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , ...