最近一个小伙伴在开发一款小而美的应用程序性能监控框架(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,此模块的结构如下:
Pepper-Metrics-Dubbo
|-src/main/java
|-com.pepper.metrics.integration.dubbo
|-DubboProfilerFilterTemplate
|-DubboProviderProfilerFilter
|-DubboConsumerProfilerFilter
|-src/main/resources
|-META-INF
|-dubbo
|-org.apache.dubbo.rpc.Filter
在Pepper-Metrics-Dubbo中,DubboProfilerFilterTemplate类实现了org.apache.dubbo.rpc.Filter接口。
这是一个模板类,定义了Filter.invoke()方法的通用实现,由于具体收集profile时,针对Provider和Consumer需要不同的收集器,这里通过其子类DubboProviderProfilerFilter和DubboConsumerProfilerFilter分别实现。
上述的类关系可通过下图描述:
DubboProfilerFilterTemplate大致实现如下:
public abstract class DubboProfilerFilterTemplate implements Filter {
// Provider的收集器
static final Stats PROFILER_STAT_IN = Profiler.Builder
.builder()
.name("app.dubbo.request.in")
.build();
// Consumer的收集器
static final Stats PROFILER_