深度剖析ApacheDubbo核心技术内幕
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第5章 Dubbo消费端服务mock与服务降级策略原理

5.1 服务降级原理

5.1.1 降级策略注册

在基础篇中,我们介绍了使用下面的代码可以将服务降级信息注册到ZooKeeper:

当以参数force调用上述代码时,降级策略就会写入ZooKeeper服务器com.books.dubbo.demo.api.GreetingService子树中Type为configurators的下面,如图5.1所示。当然,也可以使用admin手动配置服务降级策略。

图5.1

当服务消费者启动时,会去订阅com.books.dubbo.demo.api.GreetingService子树中的信息,比如Providers(服务提供者列表)、Routes(路由信息)、Configurators(服务降级策略)等信息,这些内容在第4章已经讲过。

当服务消费者发起远程调用时,会看是否设置了force:return降级策略,如果设置了则不发起远程调用并直接返回mock值,否则发起远程调用。当远程调用结果OK时,直接返回远程调用返回的结果;如果远程调用失败了,则看当前是否设置了fail:return的降级策略,如果设置了,则直接返回mock值,否则返回调用远程服务失败的具体原因。

5.1.2 服务消费端使用降级策略

首先,我们看一幅简化的时序图,了解一下从消费端发起远程调用的流程,如图5.2所示。

图5.2

从图中可以看出,服务消费端是在MockClusterInvoker类的invoke()方法里使用降级策略并在DubboInvoker的invoke()方法里发起远程调用的,所以服务降级是在消费端还没有发起远程调用时完成的。

本节主要讲解服务降级,所以我们看看MockClusterInvoker类的代码:

通过上面的代码可知,其中directory.getUrl()方法获取的就是上一节我们讲解overrideDirectoryUrl,代码1查看该URL里面是否含有mock的值,如果没有或者有但是值为false,说明没有设置降级策略,则执行代码2.1,也就是正常发起远程调用。

如果URL里面含有mock字段,并且其值以force开头,则说明设置了force:return降级策略,那么直接调用doMockInvoke()方法(其内部会调用创建的MockInvoker的invoke()方法),返回mock值,而不发起远程调用。

如果URL里面含有mock字段,并且其值以fail开头,则说明设置了fail:return降级策略,那么先发起远程调用。如果远程调用成功,则直接返回远程返回的结果(如果这里使用了默认的集群容错策略,则代码4.1会调用FailoverClusterInvokerd的invoke()方法发起远程调用);如果发起远程调用失败,则执行代码4.3,直接返回mock的值。