
SpringCloud Alibaba系列——9Dubbo的Mock原理
作者 | 一起撸Java
来源 |今日头条
学习目标
- Dubbo的mock方式有哪几种
- Dubbo的mock原理
第1章 Mock原理分析1.1 功能描述
在前面的高级用法中我们讲过mock的使用方式以及作用,在这里不再赘述,这里针对mock的集中配置形式来分析一下mock的实现原理。
1.2 mock = "force:return eclipse2019"
1.2.1 使用场景
这种一般不会出现在代码配置中,一般都是在服务治理的时候进行配置的,如果指定后端接口有问题了,可以在dubbo-admin中配置该接口对应的某方法进行强制降级。
1.2.2 源码分析
有关mock的实现逻辑全部都在MockClusterInvoker中,当我们用代理对象调用的时候,代码会走到代理的advice类,也就是InvokerInvocationHandler中,然后走到MigrationInvoker,然后走到了MockClusterInvoker当中,调到了其invoke方法,代码如下:
从上述代码我们可以看到,MockClusterInvoker当中就是走了三套逻辑:
1、没有配置mock的情况
2、mock="force:"的情况
3、配置了mock的其他情况
我们都知道如果配置了force:就代表要进行强制降级,就不会走后端的rpc调用了,所以这里是直接调用到了
我们再看看mockInvoker的invoke方法
我们看一下normalizeMock方法
我们获取到mock的返回值内容后需要把该返回值包装成方法返回值类型,所以这里必须要有一个返回值类型的包装,我们看一下parseMockValue方法:
从上面的逻辑来看,如果是force:return 则会不走rpc直接返回一个结果,然后把这个结果包装成方法的返回值类型。
1.3 mock = "true"
1.3.1 使用场景
如果配置的是mock="true"就是一种约定俗成的方式,那么这种方式就代表会走远程调用,然后远程调用如果出现了RpcException的时候就会掉到降级逻辑,这个降级逻辑的定义必须满足两点:
1、类名必须是接口名+"Mock"
2、类必须定义在接口的同包名下
配置如下:
1.3.2 源码分析
在MockClusterInvoker中就会走这个逻辑:
从上面逻辑来看,会先进行invoke调用,如果后端调用有问题则会被catch捕获然后走doMockInvoke逻辑进行降级处理。我们来看看doMockInvoke中的逻辑;在MockInvoker中就会走到实现类mock逻辑;
重点看一下getInvoker方法:
getMockObject逻辑
从上面的代码我们可以看到,获取到实现类的实例的方式就是两种:
1、如果配置的是true,实现类就是:接口名+"Mock"
2、直接配置的类的完整限定名
在看看获取invoker的代码:
这个代码最终会走到JavassistProxyFactory类的getInvoker方法中,spi的方式获取实例,这里就不再赘述
这里是先生成了一个代理类wrapper,这个代理类中有一个invokeMethod方法,只要你传给他要掉的类的实例,方法名称,参数类型和参数列表就可以完成方法的调用,然后AbstractProxyInvoker持有了wrapper的引用,我们如果需要调用一个类的方法,只有用invoker对象调用invoke方法就可以了。这里为什么能调到MockServiceMock就不再赘述了。
1.4 mock = "xx.LocalMockService"
1.4.1 使用场景
同mock=“true”
配置:
1.4.2 源码分析
同mock=“true”
1.5 mock = "throw xx"
1.5.1 使用场景
当调用接口出现问题后需要直接抛出异常的情况可以实现它
配置如下:
1.5.2 源码分析
从源码分析来看,这里是注解获取到了配置的异常类的字符串,然后反射实例化,然后把这个异常直接往上抛了。
