关于配置中timeout,有的服务有时是provider的身份,有时是consumer的身份,配置的timeout属性到底哪个生效,哪个优先,折腾了我一阵子,于是自己测试了半天,总结一下
原则:
1.精度优先(方法级优先,接口级次之,全局配置再次之)
2.消费者设置优先(如果级别一样)
下面简单demo记录下:
用户模块xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:provider timeout="2000"/>
<dubbo:consumer timeout="3000"/>
<!--loadbalance:负载均衡的一种轮询算法-->
<bean id="userService" class="com.study.impl.UserServiceImpl"></bean>
<dubbo:service interface="com.study.service.UserService" ref="userService" loadbalance="roundrobin"/>
<bean id="authrizationService" class="com.study.impl.AuthrizationServiceImpl"></bean>
<dubbo:service interface="com.study.service.AuthrizationService" ref="authrizationService" loadbalance="roundrobin"/>
<!--retries:找不到依赖服务时,不重试-->
<!--check:启动时不检查依赖服务是否存在-->
<dubbo:reference id="productService" interface="com.study.service.ProductService" retries="0" check="false"/>
<dubbo:reference id="saleService" interface="com.study.service.OrderService" retries="0" check="false"/>
</beans>
<dubbo:provider > 这里的配置表示:UserService,AuthrizationService这两个服务在作为服务提供者的时候,超时时间是2s
<dubbo:consumer 这里的配置表示:ProductService,SaleService这两个服务在作为服务消费者的时候,被调用时的超时时间是3s
商品模块xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo_provider"/>
<dubbo:provider timeout="4000"/>
<dubbo:consumer timeout="5000"/>
<bean id="productService" class="com.study.impl.ProductServiceImpl"></bean>
<dubbo:service interface="com.study.service.ProductService" ref="productService" loadbalance="roundrobin"/>
<dubbo:reference id="userService" interface="com.study.service.UserService" retries="0" check="false"/>
</beans>
<dubbo:provider > 这里的配置表示:ProductService这个服务在作为服务提供者的时候,超时时间是4s
<dubbo:consumer 这里的配置表示:UserService这个服务在作为服务消费者的时候,被调用时的超时时间是5s
业务场景1:用户模块UserService调用商品模块ProductService时,整个过程的超时时间又是怎么样的呢?
public class UserServiceImpl
{
private ProductService productService;
public void getUser()
{
this.userMapper.getOne();
...
this.productService.getProductByUser();
}
}
1.用户模块的UserService是作为provider的身份执行的,UserService本身的超时时间是2s;
2.远程调用的商品模块的ProductService的超时时间是2s还是4s还是5s呢?答案是2s,同一级别下调用,consumer的配置优先
思考:如果这里用户模块的<dubbo:consumer不设置超时时间,那么远程调用的商品模块的ProductService是多少呢?答案是4s,如果远程调用的商品模块不设置<dubbo:provider,这里超时时间就会缺省,就是找不到配置的,就会以默认超时时间1s为准。
业务场景2:商品模块ProductService调用用户模块UserService时,整个过程的超时时间又是怎么样的呢?
public class ProductServiceImpl
{
private UserService userService;
public void getProduct()
{
this.productMapper.getOne();
...
this.userService.getUserByProduct();
}
}
1.商品模块的ProductService是作为provider的身份执行的,ProductService本身的超时时间是4s;
2.远程调用的用户模块的UserService的超时时间是2s还是4s还是5s呢?答案是5s,同一级别下调用,consumer的配置优先
思考:如果这里商品模块的<dubbo:consumer不设置超时时间,那么远程调用的用户模块的UserService是多少呢?答案是2s,如果远程调用的用户模块不设置<dubbo:provider,这里超时时间就会缺省,就是找不到配置的,就会以默认超时时间1s为准。
最后说一句:除了timeout属性是这样的优先级规则,retries等其他配置也是这样