stub=true or default
设为true/default,表示使用缺省代理类名,即:接口名 + Local后缀,服务接口客户端本地代理类名,用于在客户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceLocal(XxxService xxxService)
mock=true or default
设为true/default,表示使用缺省Mock类名,即:接口名 + Mock后缀,服务接口调用失败Mock实现类,该Mock类必须有一个无参构造函数,与Local的区别在于,Local总是被执行,而Mock只在出现非业务异常(比如超时,网络异常等)时执行,Local在远程调用之前执行,Mock在远程调用后执行。
源码里还有一个local参数,和 stub等价,但是被 deprecated 了
StubProxyFactoryWrapper
处理 stub/local , 以下代码不清楚意图,难道只是为了改个变量名
String stub = invoker.getUrl().getParameter(Constants.STUB_KEY, invoker.getUrl().getParameter(Constants.LOCAL_KEY));
StubProxyFactoryWrapper 是 proxyFactory的 wrapper类,所以 stub类总是被执行.
MockClusterInvoker
处理 mock , MockClusterWrapper 里调用了 MockClusterInvoker,MockClusterWrapper 是Cluster 的 wrapper类,理解 ExtensionLoader 的 cachedWrapperClasses 很重要。
Cluster的配置只在consumer端生效,所以mock、stub、local参数也只在consumer端生效,可以跟踪下 RegistryDirectory.mergeUrl。 但是 service 和 consumer端都会做检查。checkStubAndMock(interfaceClass);
参考 : read: https://www.jianshu.com/p/ce8de35986cf