Sentinel是如何适配dubbo?
Sentinel适配dubbo的代码在:sentinel-dubbo-adapter模块中,如下图所示:
SentinelDubboProviderFilter代码中实现了Dubbo Filter接口。
有上图所知,sentinel是利用了Dubbo Filter 和spi机制进行限流拓展,这样做的好处可以做到无需改动业务代码就能支持限流、熔断等功能。如果对Dubbo Filter机制不太了解的,可以去Dubbo官网了解下Dubbo Filter机制。
Sentinel-Dubbo-adapter 源码分析
Sentinel Dubbo 项目中几个主要类的类图:
由上可知,SentinelDubboProviderFilter继承了AbstractDubboFilter,AbstractDubboFilter抽象类则实现了Filter接口。
接下来我们首先来看下AbstractDubboFilter这个抽象类AbstractDubboFilter:
abstract class AbstractDubboFilter implements Filter {
protected String getResourceName(Invoker<?> invoker, Invocation invocation) {
StringBuilder buf = new StringBuilder(64);
buf.append(invoker.getInterface().getName())
.append(":")
.append(invocation.getMethodName())
.append("(");
boolean isFirst = true;
for (Class<?> clazz : invocation.getParameterTypes()) {
if (!isFirst) {
buf.append(",");
}
buf.append(clazz.getName());
isFirst = false;
}
buf.append(")");
return buf.toString();
}
protected String getResourceName(Invoker<?> invoker, Invocation invocation, String prefix) {
if (StringUtil.isBlank(prefix)) {
return getResourceName(invoker, invocation);
}
StringBuilder buf = new StringBuilder(64);
return buf.append(prefix)
.append(getResourceName(invoker, invocation))
.toString();