dubbo里面有个特性是超时与重试,为啥我看网上的demo代码都是把超时与重试设置写在“服务提供者”这一边呢?我的理解不应该写在“服务消费者”这里嘛?如果是这样子,那假如服务提供者挂掉了,那服务消费者咋知道超时时间和重试几次呢?
在Dubbo中,超时和重试可以在服务提供者和服务消费者两端都进行设置。
下边我们用一段xml的配置来进行讲解:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-invoker-provider">
<dubbo:parameter key="qos.port" value="22222"/>
</dubbo:application>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="userService" class="com.sise.user.service.UserServiceImpl" />
<dubbo:service interface="com.sise.user.service.UserService" ref="userService" />
</beans>
在dubbo的配置文件里面,通常我们所说的dubbo:service 可以理解为服务暴露,dubbo:refernce 为服务发现,mock是服务治理,timeout属于服务治理的一种(性能调优).
假设dubbo里面希望将一些公共的配置抽取出来,我们可以通过properties文件进行配置,dubbo在加载配置文件的优先顺序如下:
优先会读取JVM -D启动参数后边的内容
读取xml配置文件
读取properties配置文件内容
dubbo默认会读取dubbo.properties配置文件的信息,例如下边这种配置:
dubbo.application.name=dubbo-user-service
dubbo.registry.address=zookeeper://127.0.0.1:2181
假设我们的dubbo配置文件不命名为dubbo.properties(假设命名为了my-dubbo.properties)的时候,可以在启动参数的后边加上这么一段指令:
-Ddubbo.properties.file=my-dubbo.properties
那么在应用程序启动之后,对应的工程就会读取指定的配置文件,这样就可以将一些共用的dubbo配置给抽取了出来。
根据参考资料和个人经验,回答如下:
在使用dubbo框架时,建议将超时与重试的设置写在服务提供者这一方的代码中。这是因为dubbo的超时与重试特性是在服务消费者调用服务提供者时生效的,消费者需要与提供者通信才能知道调用的状态。如果服务提供者挂掉了,消费者无法知道超时时间和需要重试几次的设置,也就无法进行相应处理。因此,在服务提供者的代码中设置超时与重试可以确保服务提供方在收到请求时有相应的处理逻辑。
如果你在服务消费者这里进行设置,虽然也可以确保客户端在调用服务时有超时与重试的处理逻辑,但是服务提供者挂掉了时,消费者无法收到响应,就算重试也不会成功。
具体实现上,可以在服务提供者的Dubbo配置文件中设置超时时间和重试次数,示例如下:
<dubbo:service interface="com.example.service.UserService" timeout="5000" retries="3"/>
其中timeout表示超时时间,单位为毫秒,retries表示重试次数。也可以在服务提供者的对应接口方法上使用注解进行设置,示例如下:
@DubboService(timeout = 5000, retries = 3)
public class UserServiceImpl implements UserService {
//...
}