Dubbo之参数配置(四)
目录
本地存根
- 使用场景
远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做ThreadLocal缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在API中带上Stub,客户端生成Proxy时,会把Proxy通过构造函数传输给Stub,然后把Stub暴露给用户,Stub可以决定要不要去调Proxy。
(1)调用示意图:
(2)配置及Stub实例
<!--第一种-->
<dubbo:service interface="com.foo.BarService" stub="true" />
<!--第二种-->
<dubbo:service interface="com.foo.BarService" stub=com.foo.BarServiceStub" />
package com.foo;
public class BarServiceStub implements BarSerivce{
private final BarService barService;
//构造函数传入真正的远程代理对象
public BarServiceStub(BarSerivce barSerivce){
this.barService = barService;
}
public String sayHello(String name){
//此代码在客户段执行
//可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法等待
try{
return barService.sayHello(name);
}catch(Exception e){
//可以容错
return "容错数据";
}
}
}
本地伪装
- 使用场景
Mock通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。
Mock是Stub的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现RpcException(比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用Stub,可能就需要捕获并依赖RpcException类,而用Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行。
- 配置
<dubbo:service interface="com.foo.BarService" mock="true" />
or
<dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" />
package com.foo
public class BarServiceMock implements BarService{
public String sayHello(String name){
return "容错数据";
}
}
如果服务的消费方经常需要try-catch捕获异常,如:
try{
//逻辑代码
}catch(Exception e){
logger.error(e);
}
可以考虑改为Mock实现,并在Mock中return null。
<!--如果只是想简单的忽略异常,在2.0.11以上版本可以用:-->
<dubbo:service interface="com.foo.BarService" mock="return null" />
延迟暴露
- 使用场景
如果服务需要warmup时间,比如初始化缓存,等待相关资源就位,可以使用delay进行延迟暴露。
<!--延迟暴露5s-->
<dubbo:service delay="5000" />
<!--延迟到Spring初始化完成后,再暴露服务(基于Spring的ContextRefreshedEvent事件触发暴露-->
<dubbo:service delay="-1" />