美文网首页互联网科技
给Dubbo添砖加瓦:自定义Filter扩展点实现!

给Dubbo添砖加瓦:自定义Filter扩展点实现!

作者: java菲菲 | 来源:发表于2019-10-09 12:01 被阅读0次

    最近一个小伙伴在开发一款小而美的应用程序性能监控框架(Pepper-Metrics)。

    其中一个需求,需要收集Dubbo在Provider端和Consumer端的接口响应性能数据,以便存储到DataSource中或提供给Printer使用。

    在此背景下,我们需要对Provider端和Consumer端的每一次请求和响应进行监控。在Dubbo中,可以通过扩展org.apache.dubbo.rpc.Filter接口实现。

    01 org.apache.dubbo.rpc.Filter介绍

    Filter可以理解为调用过程拦截,每次方法调用该拦截器都会生效,扩展时需要注意对性能的影响。

    用户定义的Filter默认在已有的Filter之后被执行。

    02 Pepper-Metrics-Dubbo的Filter实现

    在我们的项目中,这个子模块被命名为Pepper-Metrics-Dubbo,此模块的结构如下:

    image

    在Pepper-Metrics-Dubbo中,DubboProfilerFilterTemplate类实现了org.apache.dubbo.rpc.Filter接口。

    这是一个模板类,定义了Filter.invoke()方法的通用实现,由于具体收集profile时,针对Provider和Consumer需要不同的收集器,这里通过其子类DubboProviderProfilerFilter和DubboConsumerProfilerFilter分别实现。

    上述的类关系可通过下图描述:

    image

    DubboProfilerFilterTemplate大致实现如下:

    image

    两个实现类如下:

    image image

    写完实现类后,需要在项目的resources目录下配置Dubbo的扩展文件。

    在resources下创建META-INF/dubbo/org.apache.dubbo.rpc.Filter文件,内容如下:

    image

    这样Dubbo就可以扫描到自定义的扩展点。

    03 自定义Filter的使用

    接下来需要将自定义的扩展点配置到Dubbo中,告诉Dubbo我要使用这个Filter,分别在Provider和Consumer中配置:

    首先看一下Provider:

    image

    说明:default代表已有的扩展点,dubboProviderProfiler是我们自定义的扩展点,这样配置表示我们自定义的扩展点在已有的扩展点之后执行。

    同样,在Consumer端配置自定义扩展点:

    image

    04 自定义扩展点的自动激活

    从上文得知,我们自定义的扩展点必须要修改配置才能生效,这样一来,是有代码侵入的。那么,能不能引入pepper-metrics-dubbo的jar包后,不用修改配置,就直接生效呢?

    答案是:当然可以!

    pepper-metrics-dubbo使用了Dubbo提供的@Activate机制。这个注解可用于类或方法上。其作用是可以让Dubbo自动激活此扩展,从而简化配置。

    以Provider为案例,看一下这个东西在pepper-metrics-dubbo里是咋用的。

    image

    首先,如果只配置@Activate注解,不自定义其属性的话,会无条件自动激活所有扩展点。在我们的项目中,就是会同时激活DubboConsumerProfilerFilter和DubboProviderProfilerFilter。

    但在我们的需求中是不能同时激活两个扩展点的。如果同时激活,服务提供方和调用方都会同时调用两个扩展点。而我们需要的是提供方调用Provider,调用方调用Consumer。

    这可以通过group来实现。定义了group之后,就只对特定的group激活了。

    在Filter中,有两个group:

    image

    定义为PROVIDER就只对提供方生效,定义为CONSUMER就只对调用方生效,也可以同时定义,那就同时生效。

    这样一来,只需要依赖pepper-metrics-dubbo包即可激活扩展点了。

    相关文章

      网友评论

        本文标题:给Dubbo添砖加瓦:自定义Filter扩展点实现!

        本文链接:https://www.haomeiwen.com/subject/urowpctx.html