启动检查设置
Dubbo缺省会在启动时检查依赖的服务是否可用,不可用会抛出异常,阻止Spring初始化完成,默认check=“true”;是开启检查。
比如测试的时候,有些服务并不关心,或者出现了循环依赖,必须有一方先启动。
此时可以通过设置 check=“false”
配置方式可以通过Spring配置文件
关闭 某个服务没启动时会报错
<dubbo:reference interface="com.foo.BarService" check="false" />
关闭所有服务启动时检查
<dubbo:consumer check="false" />
关闭注册中心启动时检查
<dubbo registry check="false"/>
通过dubbo.properties
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
超时设置
配置的覆盖关系
以超时设置为例 timeout
默认是1000ms 也就是1秒,可以在全局消费者、全局提供者、消费者的方法,提供者的方法、消费者的引用,提供者的服务都可以指定超时参数。如果方法中线程等待的时间或者方法执行的时间大于超时时间就会抛出超时异常。
如果各个级别都设置了超时时间,覆盖关系(优先级)遵循以下两个原则
- 方法级优先,接口级次之,全局配置再次之。(精确优先)
- 如果级别一样,则消费者优先,提供者次之。(在同级别下消费者优先于提供者)
具体的优先级顺序参考官网给的图
建议服务提供方设置超时时间,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要惯性每个服务的超时设置。
重试次数
一般开发中,超时等待和重试次数组合起来使用。属性retries
类型是int,可选值,默认是重试2次,作用是性能调优,远程服务调用重试次数,不包括第一次调用,不需要重试请设为0,仅在cluster为failback/failover时有效。
例如:对于请求调用一个远程服务,超时时间设置的很短,过程中又有线程阻塞或者等待的时间超过了超时时间。因此可以设置重试次数,当首次调用失败还会再重新请求调用其他的远程服务 n 次,n 代表你设置retries属性的值。
什么时候需要设置retries
属性
当本次操作满足幂等性时 才能设置重试次数,默认是2次,0代表不重试。
- 幂等性:无论操作多少次,对最终结果没有影响。【删除、修改、查询】
- 非幂等性:每次操作都会影响最后的结果。【新增操作】
本地存根
远程服务后,客户端只剩下接口,实现全部在服务器端,但是提供方有些时候向在客户端也执行部分逻辑,比如:做ThreadLocal缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在API中带上Stub,客户端生成代理实例,会把Proxy通过构造函数传给Stub,然后把Stub暴露给用户,Stub可以决定要不要调用代理对象。
Stub的实现例子
package com.foo;
public class BarServiceStub implements BarService {
private final BarService barService; // 构造函数传入真正的远程代理对象
public BarServiceStub(BarService barService){
this.barService = barService;
}
public String sayHello(String name) {
// 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
try {
return barService.sayHello(name);
} catch (Exception e) {
// 你可以容错,可以做任何AOP拦截事项 return "容错数据";
}
}
}
需要注意的是:Stub必须有可传入Proxy的构造函数。
在Spring配置文件中按照以下方式
<dubbo:service interface="com.foo.BarService" stub="true" />
<!--或者-->
<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />