一、启动时检查
- 默认 check="true"。
- check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
- 示例
通过spring配置
代码语言:javascript复制<dubbo:reference interface="com.foo.BarService" check="false" /> //关闭某个服务的启动时检查 (没有提供者时报错)
代码语言:javascript复制<dubbo:consumer check="false" />//关闭所有服务的启动时检查 (没有提供者时报错):
代码语言:javascript复制<dubbo:registry check="false" />//关闭注册中心启动时检查 (注册订阅失败时报错):
通过 dubbo.properties
代码语言:javascript复制通过 dubbo.properties
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
通过 -D 参数
代码语言:javascript复制java -Ddubbo.reference.com.foo.BarService.check=false
java -Ddubbo.reference.check=false
java -Ddubbo.consumer.check=false
java -Ddubbo.registry.check=false
- 配置当前消费者的统一规则
dubbo.consumer.check=false// 当前消费者所有服务都不检查
二、超时设置
- 当很多消费者调用提供者,如果提供者因为网络原因会返回会比较慢,此时会有大量的消费者请求堆积导致性能下降,可以设置timeout
<dubbo:reference id="UserService" interface="com.sangyu.gmall.service.UserService" timeout="3000"/>
- timeout默认是1000毫秒
- 配置所有接口的timeout
<dubbo:consumer check="false" timeout="3000"></dubbo>
- 属性配置覆盖关系
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
- 建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设
三、重试次数
- 重试次数不包含第一次调用的次数,retries
<dubbo:reference id="UserService" interface="com.sangyu.gmall.service.UserService" timeout="3000" retries="3"/>
- 如果有一个服务有多个服务器提供相同服务的情况下,会去调用其他服务器的服务
- 幂等设置重试次数,幂等是方法无论执行多少产生的效果与执行一次产生的效果是一样的,比如查询、删除、修改
4.非幂等不能设置重试次数,非幂等是每次调用的结果都不一样的,比如:数据库新增
5.retries="0" 代表不重试
三、多版本
针对新版本上线后,考虑影响情况,可以使用多版本,一部分用户使用新版本,一部分用户使用老版本,等新版本稳定后,才开放全部用户使用新版本。
- 在提供方和消费方配置访问版本,在消费者配置对应的老版本号,实现只支持访问老版本
// provider.xml
// 版本1 version="1.0.0"
<bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
<dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0">
</dubbo:service>
// 版本2 version="2.0.0"
<bean id="userServiceImpl02" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean>
<dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl02" timeout="1000" version="2.0.0">
</dubbo:service>
代码语言:javascript复制//consumer.xml
<dubbo:reference interface="com.sangyu.gmall.service.UserService" id="userService" timeout="5000" retries="3" version="1.0.0"
- 在消费者配置对应的为*,实现只支持访问老版本
// consumer.xml
<dubbo:reference interface="com.sangyu.gmall.service.UserService" id="userService" timeout="5000" retries="3" version="*"
四、本地存根
实现远程服务后,客户端通常只剩下接口,功能的实现全在服务器端,但提供方有些时候想再客户端调用真正的实现之前也在提供方执行部分逻辑,比如:缓存,参数验证,调用失败后伪造容错数据等等,此时编写一个本地存根,远程引用的接口在服务消费者本地也有实现的代码,如果满足要求才调用远程的接口,如果不满足就不调用,怎么实现呢?在消费方实现远程接口的本地存根实现,必须有一个有参构造器,传入的是远程接口的代理实现(dubbo默认会传进来)
代码语言:javascript复制// consumer.xml
<dubbo:reference id="UserService" interface="com.sangyu.gmall.service.UserService" stub="com.sangyu.gmall.service.impl.UserServiceStub" />
代码语言:javascript复制// UserServiceStub类
// 在服务消费方增加远程调用接口的本地存根
public class UserServiceStub implements UserService {
private final UserService userService;
/**
* 传入的是userService远程的代理对象
* @param userService
*/
public UserServiceStub(UserService userService){
super();
this.userService = userService;
}
@Override
public List<UserAddress> getUserAddressList(String userId) {
System.out.println("UserServiceStub...");
if(StringUtils.isEmpty(userId)){
return userService.getUserAddressList(userId);
}
return null;
}
}