dubbo的超时与重试为什么建议写在服务提供者这一方?

dubbo里面有个特性是超时与重试,为啥我看网上的demo代码都是把超时与重试设置写在“服务提供者”这一边呢?我的理解不应该写在“服务消费者”这里嘛?如果是这样子,那假如服务提供者挂掉了,那服务消费者咋知道超时时间和重试几次呢?

在Dubbo中,超时和重试可以在服务提供者和服务消费者两端都进行设置。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/270130
  • 你也可以参考下这篇文章:【dubbo】基于dubbo如何做服务治理?服务降级?以及重试?
  • 除此之外, 这篇博客: 大白话带你梳理一下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在加载配置文件的优先顺序如下:

    1. 优先会读取JVM -D启动参数后边的内容

    2. 读取xml配置文件

    3. 读取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技术教程课程中的 微服务分布式开发简介小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料和个人经验,回答如下:

    在使用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 {
        //...
    }
    
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632