一、所有设置
dubbo的所有设置可参考官方示例:设置示例
二、常用设置
1、启动时检查
当注册中心没有消费者订阅的服务时(服务提供者宕机或未启动等)启动消费者,消费者在启动时会由于其订阅的服务不存在而报错,这是因为消费者在启动时默认会检查服务其订阅的服务是否存在(默认check=true),可以在配置文件中通过设置check=false关闭启动时检查而不影响服务消费者的启动:
<dubbo:reference check="false" interface="com.bdm.gmall.service.UserService" id="userService">dubbo:reference>
在SpringBoot中设置如下:
@Reference(check=false)
UserService userService;
也可以统一配置消费者的启动时检查:消费者的所有订阅都不检查
<dubbo.consumer check="false">dubbo:consumer>
在SpringBoot中对应如下(dubbo.properties/application.properties):
dubbo.consumer.check=false
对注册中心的启动时检查也可以做相应配置(对应dubbo:registry标签),具体参考官方示例。
2、超时设置
服务消费者在等待服务提供者的服务方法返回时的时长设置,避免因网络原因或者服务消费者自身问题导致服务消费方的很多线程被阻塞,通过该设置设置在指定时间内没返回就立即中止而避免大量线程阻塞:单位毫秒,默认值1000ms
<dubbo:reference timeout="3000" interface="com.bdm.gmall.service.UserService" id="userService">dubbo:reference>
通过dubbo:consumer标签设置:
<dubbo.consumer check="false" timeout="3000">dubbo:consumer>
3、重试次数
由于各种原因(网络不佳等)导致远程调用超时,可使用该配置调整重试次数多调用几次(这里不包含第一次调用,0代表不重试),一般配合超时设置使用,具体参考:集群容错
<dubbo:reference timeout="3000" retries="3" interface="com.bdm.gmall.service.UserService" id="userService">dubbo:reference>
在该设置中如果服务提供者端有多台机器同时提供服务,则消费者在重试调用的时候会一台一台的去尝试,直至调用成功或者或者重试次数用完或者最终调用失败,具体参考集群容错模式。
另外
:
1️⃣eclipse中同时启动多个提供者服务的操作很简单,只需要将SpringBoot的main()多运行几次即可(但是每次运行时注意修改端口等参数)。
2️⃣不是所有的方法都可以设置重试次数,必须是幂等的方法才可设置,非幂等的方法是不可以设置重试的
注:
幂等:无论该方法执行多少次,执行的效果都是一样的,比如查询、删除和修改,因为这些方法在带有相同的参数去请求时无论请求多少次产生的结果都是一样的
非幂等:即使请求带有相同的参数但产生的效果会不同,比如新增
4、多版本(即灰度发布)
在一个服务出现了不兼容的升级或者新版本不稳定时,可以在一个时间段内提供多个版本的服务,让一部分消费者使用新版本的服务,另一部分消费者依然使用旧版本的服务,待新版本稳定之后再实现全部替换而实现版本的过渡。
服务提供者配置示例:指明版本
<dubbo:service version="1.0.0" interface="com.bdm.gmall.service.UserService" ref="userServiceImpl01">dubbo:service>
<bean id="userServiceImpl01" class="com.bdm.gmall.service.impl.UserServiceImpl">bean>
<dubbo:service version="2.0.0" interface="com.bdm.gmall.service.UserService" ref="userServiceImpl02">dubbo:service>
<bean id="userServiceImpl02" class="com.bdm.gmall.service.impl.UserServiceImpl2">bean>
服务消费者配置示例:指明服务的版本,该版本在服务端已声明
<dubbo:reference version="1.0.0" check="false" interface="com.bdm.gmall.service.UserService" id="userService">dubbo:reference>
若在服务消费者端配置version="*",则会随机调用所有版本的服务
5、本地存根
如果在真正远程调用服务方法之前需要做一些参数验证或者缓存,就可以在服务消费者端(或者服务接口端)编写一个本地存根,在该类中必须有一个有参构造器,该构造器方法中传入的是远程服务接口的代理实现(由Dubbo传入),服务消费者端的本地存根代码示例:实现远程服务接口
public class UserServiceStub implements UserService {
private final UserService userService;
// 有参构造器:入参是服务接口的远程代理,由dubbo传入
public UserServiceStub(UserService userService) {
super();
this.userService = userService;
}
public List<UserAddress> getUserAddressList(String userId) {
// 调用接口前的判断
if (!StringUtils.isEmpty(userId))
return userService.getUserAddressList(userId);
return null;
}
}
在consumer.xml中配置stub属性指向本地存根的实现类:
<dubbo:reference stub="com.bdm.gmall.service.impl.UserServiceStub" version="1.0.0" check="false" interface="com.bdm.gmall.service.UserService" id="userService">dubbo:reference>
这样的话消费者端在调用远程服务时会先调用本地存根中的方法完成校验,在方法返回时也可以做一些缓存操作,相当于在服务消费者端保存有服务提供者端的服务实现,实际上是dubbo传入的远程服务实现的代理
三、设置的覆盖关系
规则:
1️⃣方法级优先,接口级次之,全局配置再次之(精确优先)
2️⃣如果级别一样,则消费方优先,提供方次之(消费方优先)
其中,服务提供方配置,通过 URL 经由注册中心传递给消费方
设置优先级:从上到下优先级递减,其他属性配置亦可参考该图