统一降级策略
在我们之前的博客里介绍了dubbo如何整合sentinel进行限流。既然用到了限流,那么每次让被限流的服务都抛一个异常让调用端自己处理显然不是优雅的解决方案,在者一些带有业务含义的降级策略只有在服务提供方才能完成,这时候我们就需要引入sentinel的降级能力。sentinel官方文档推荐的做法是使用注解。这种方法比较灵活但缺点是降级的代码比较分散,代码量也比较多,这时候我们需要一种全量的降级策略,将降级的逻辑集中起来,或者极端情况下一个provider的所有服务都可以使用同一个降级策略(比如返回null)。官方文档里并没有提及这样的降级方法,下面我们来探索如何实现上述逻辑。
从源码入手
解决问题的最好方式就是从源码入口,dubbo的扩展点在于filter,sentinel也是通过一个filter与dubbo做了整合
com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// Get origin caller.
String application = DubboUtils.getApplication(invocation, "");
Entry interfaceEntry = null;
Entry methodEntry = null;
try {
String resourceName = DubboUtils.getResourceName(invoker, invocation);
String interfaceName = invoker.getInterface().getName();
// Only need to create entrance context at provider side, as context will take effect
// at entrance of invocation chain only (for inbound traffic).
ContextUtil.enter(resourceName, application);
interfaceEntry = SphU.entry(interfaceName, ResourceTypeConstants.COMMON_RPC, EntryType.IN);
methodEntry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_RPC,
EntryType.IN, invocation.getArguments());
Result result = invoker.invoke(invocation);
if (result.hasException()