关于dubbo的超时处理及重试原则

 更新时间:2023年08月08日 10:29:14   作者:一切为了实战  
这篇文章主要介绍了关于dubbo的超时处理及重试原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。

为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。

超时时间可以使用 timeout="超时次数" 来设置当消费者请求一个服务时出现错误,会重试连接其他的服务器,但重试会带来更多的延迟。

重试次数可以使用 retries=重试次数 来设置。

1. 注解配置如下

  • 在提供者中,reties的值设置在@Service中
  • 在消费者中,reties的值设置在@Reference中
  • 为模拟连接失败,可以采用超时连接;

具体步骤:

  • 1.在提供者分服务中添加一个睡眠时间为5秒
  • 2.设置消费者访问服务的超时时间为3秒,当服务在3秒后还没有得到结果就会连接失败,并设置次数为2次,虽然设置的次数是2,但是方法会执行3次,第一次是本来就会连的,第二次开始就算入了重试次数
  • 3.如果消费者配置了重试次数,提供者也配置了重试次数,则以消费者为准;

消费者的配置

@Service
public class OrderServiceImpl implements OrderService {
	@Reference(timeout=3000, retries=2)
	private UserService userService;
	@Override
	public List<Address> getAddress(String userId) {
		return userService.getAddress();
	}
}

提供者的配置

@Service(retries=5)
public class UserServiceImpl implements UserService{
	private static List<Address> address = new ArrayList<>();
	static {
		address.add(new Address(1, "武汉", "young"));
		address.add(new Address(2, "河源", "xian"));
	}
	@Override
	public List<Address> getAddress() {
		System.out.println("provider---1");
		return address;
	}
}

2. 在xml文件中配置

在xml文件中配置有多个级别,一个是全局级配置,一个是接口级配置,一个是方法级配置;

在提供者中的配置

方法一,全局级配置:

<dubbo:provider timeout="超时时间" retries="2"></dubbo:provider>

方法二,接口级配置:

<dubbo:service interface="com.young.service.UserService" ref="userServiceImpl" timeout="超时时间" retries="重试次数">
		<dubbo:method name="getAddress"></dubbo:method>
	</dubbo:service>

方法三,方法级配置:

<dubbo:service interface="com.young.service.UserService" ref="userServiceImpl" >
		<dubbo:method name="getAddress" timeout="超时时间" retries="重试次数"></dubbo:method>
</dubbo:service>

其中方法级的配置的优先级>接口级配置的优先级>全局级配置的优先级

在消费者中的配置

方法一,全局级配置:

<dubbo:consumer timeout="超时时间" retries="重试次数"></dubbo:consumer>

方法二,接口级配置

<dubbo:reference interface="com.young.service.UserService" id="userService"  timeout="超时时间" retries="重试次数">
	<dubbo:method name="getAddress" timeout="3000" retries="2"></dubbo:method>
</dubbo:reference>

方法三,方法级配置:

<dubbo:reference interface="com.young.service.UserService" id="userService">
	<dubbo:method name="getAddress" timeout="超时时间" retries="重试次数"></dubbo:method>
</dubbo:reference>

和提供者一样,消费者的优先级顺序为方法级的配置的优先级>接口级配置的优先级>全局级配置的优先级

配置的原则

dubbo推荐在Provider上尽量多配置Consumer端属性:

  • 作为服务的提供者,比服务方更清楚服务性能的参数,如调用时间,合理的重试次数等,所以这些参数应尽量配置在服务的提供者方;
  • 在provider配置后,Consumer不配置则会使用provider的配置值,即provider的配置会作为consumer配置的缺省值。如果使用consumer的全局配置,这对于provider是不可控的,并且是不合理的。

配置的覆盖规则

  • 方法级的配置的优先级>接口级配置的优先级>全局级配置的优先级,即遵循就近原则,以此为基础;
  • 在同级情况下,消费者的优先级大于提供者的优先级;
  • 优先级高的会将优先级低的覆盖;

timeout和retries是两个不同的参数,可以设置在不同的级别,但都遵循覆盖原则。

以上面的覆盖规则可以得到如下的所有情况:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java利用mybatis拦截器统计sql执行时间示例

    java利用mybatis拦截器统计sql执行时间示例

    这篇文章主要介绍了java利用mybatis拦截器统计sql执行时间示例,该拦截器拦截mybatis的query和update操作,能统计sql执行时间
    2014-03-03
  • 详解自动注册Gateway网关路由配置

    详解自动注册Gateway网关路由配置

    这篇文章主要为大家介绍了自动注册Gateway网关路由配置的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 浅谈Java操作符与其优先级

    浅谈Java操作符与其优先级

    这篇文章主要介绍了浅谈Java操作符与其优先级,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • Springboot集成Quartz实现定时任务代码实例

    Springboot集成Quartz实现定时任务代码实例

    这篇文章主要介绍了Springboot集成Quartz实现定时任务代码实例,任务是有可能并发执行的,若Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题,而JobDetail & Job方式,Scheduler都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问问题
    2023-09-09
  • java编程是做什么的

    java编程是做什么的

    在本篇文章里小编给大家整理的是一篇关于java编程是什么相关的基础知识点内容,有兴趣的朋友们可以阅读下。
    2021-01-01
  • java中random的用法小结

    java中random的用法小结

    这篇文章主要介绍了java中random的用法详解,主要包括java.lang.Math.random()方法的用法及java.util.Random类用法,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • @Controller、@RestController注解区别详解

    @Controller、@RestController注解区别详解

    这篇文章主要介绍了@Controller、@RestController注解区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • RocketMQ实现消息分发的步骤

    RocketMQ实现消息分发的步骤

    RocketMQ 实现消息分发的核心机制是通过 Topic、Queue 和 Consumer Group 的配合实现的,下面给大家介绍RocketMQ实现消息分发的步骤,感兴趣的朋友一起看看吧
    2024-03-03
  • SpringMVC和Ajax的交互详解(手工处理)

    SpringMVC和Ajax的交互详解(手工处理)

    Ajax即异步的 JavaScript和XML,是一种无需重新加载整个网页的情况下,能够更新部分模块的网页技术,下面这篇文章主要给大家介绍了关于SpringMVC和Ajax交互的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • java 数据类型有哪些取值范围多少

    java 数据类型有哪些取值范围多少

    这篇文章主要介绍了java 数据类型有哪些取值范围多少的相关资料,网上关于java 数据类型的资料有很多,不够全面,这里就整理下,需要的朋友可以参考下
    2017-01-01

最新评论