第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的值。