热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dubbo超时重试

当consumer端调用超时,会触发重试调用。重试对应的配置属性是retries。默认的重试次数是2。就是说,当调用超时,会最多重试2次,如果仍然失败,会提示异常。对于


dubbo超时重试概述

consumer端和provider端都可以设置timeout。

超时优先级:consumer方法级>provider方法级>consumer接口级>provider接口级>consumer级>provider级

 

当consumer端调用超时,会触发重试调用。

重试对应的配置属性是retries。默认的重试次数是2。就是说,当调用超时,会最多重试2次,如果仍然失败,会提示异常。

 

对于查询或删除来说,接口重试是幂等的。

对于新增数据,如果retries>0,则要做幂等处理,否则会造成重复数据入库而产生bug。安全起见,可单独设置retries=0。

 

【说明】在直连的情况下,是不会触发重试的。

 


代码

Provider application.yml dubbo配置:


技术分享图片技术分享图片

dubbo:
application:
name: zhanggz
-dubbodemo
registry:
# address: N
/A
address: zookeeper:
//127.0.0.1:2181
protocol:
port:
28088
name: dubbo
scan:
base
-packages: dubbodemo.provider
provider:
timeout:
2200
retries:
3


View Code

Provider代码:


技术分享图片技术分享图片

package dubbodemo.provider;
import dubbodemo.contract.HelloWord;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@Service(retries
= 3)
@SpringBootApplication
public class ProviderApplication implements HelloWord {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.
class);
}
public String add(String str) {
log.info(
"add入参:{}", str);
long start = System.currentTimeMillis();
try {
//int i=1/0;
try {
int r = RandomUtils.nextInt(1000, 2000);
log.info(
"sleep time={}", r);
Thread.sleep(r);
}
catch (InterruptedException e) {
e.printStackTrace();
}
return "test retry:" + str;
}
finally {
log.info(
"duration={}", System.currentTimeMillis() - start);
}
}
public String say() {
return ("hello");
}
}


View Code

Consumer application.yml dubbo配置:


技术分享图片技术分享图片

dubbo:
application:
name: zhanggz
-dubbodemo-consumer
registry:
address: zookeeper:
//127.0.0.1:2181
# address: N/A
protocol:
name: dubbo
consumer:
timeout:
1000
# retries:
0


View Code

Consumer代码:


技术分享图片技术分享图片

package dubbodemo.consumer;
import dubbodemo.contract.HelloWord;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@Slf4j
@RunWith(SpringRunner.
class)
@SpringBootTest
public class DubboConsumerTest {
@Reference(
/*url = "dubbo://localhost:28088",*/)
private HelloWord helloWord;
@Test
public void testAddRetry() {
long start = System.currentTimeMillis();
log.info(
"请求开始...");
try {
String str
= helloWord.add("str");
log.info(
"返回值={}", str);
}
finally {
log.info(
"duration=={}", System.currentTimeMillis() - start);
}
}
}


View Code

接口定义:


package dubbodemo.contract;
public interface HelloWord {
String say();
String add(String str);
}

 

 


测试结论

技术分享图片

--------consumer不设置timeout(默认值=1000ms),改变provider的timeout值

【provider】
provider:
timeout: 1000
2020-07-23 18:53:57.427 INFO 13356 --- [:20880-thread-2] dubbodemo.provider.ProviderApplication : duration=2000
2020-07-23 18:53:57.432 WARN 13356 --- [:20880-thread-2] o.apache.dubbo.rpc.filter.TimeoutFilter : [DUBBO] invoke time out. method: add arguments: [str] , url is dubbo://192.168.40.69:20880/dubbodemo.contract.HelloWord?anyhost=true&application=zhanggz-dubbodemo&bean.name=ServiceBean:dubbodemo.contract.HelloWord&bind.ip=192.168.40.69&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=dubbodemo.contract.HelloWord&methods=add,say&pid=13356&qos.enable=false®ister=true&release=2.7.3&side=provider&timeout=1000×tamp=1595501612605, invoke elapsed 2005 ms., dubbo version: 2.7.3, current host: 192.168.40.69


【provider】
provider:
timeout: 2200
2020-07-23 18:57:16.949 INFO 12280 --- [:20880-thread-2] dubbodemo.provider.ProviderApplication : duration=2000
(没有提示invoke timeout)

【consumer都会收到timeout异常】
2020-07-23 18:53:56.273 INFO 13216 --- [ main] dubbodemo.consumer.DubboConsumerTest : duration==1040

org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: add, provider: dubbo://localhost:20880/dubbodemo.contract.HelloWord?application=zhanggz-dubbodemo-consumer&interface=dubbodemo.contract.HelloWord&lazy=false&pid=13216&qos.enable=false®ister.ip=192.168.40.69&remote.application=&side=consumer&sticky=false, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2020-07-23 18:53:55.250, end time: 2020-07-23 18:53:56.272, client elapsed: 106 ms, server elapsed: 916 ms, timeout: 1000 ms, request: Request [id=0, version=2.0.2, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=add, parameterTypes=[class java.lang.String], arguments=[str], attachments={path=dubbodemo.contract.HelloWord, interface=dubbodemo.contract.HelloWord, version=0.0.0}]], channel: /192.168.40.69:1813 -> /192.168.40.69:20880


技术分享图片
----------------------------- 服务端停止运行后,客户端无法启动

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘dubbodemo.consumer.DubboConsumerTest‘: Injection of @Reference dependencies is failed; nested exception is org.apache.dubbo.rpc.RpcException: Fail to create remoting client for service(dubbo://localhost:20880/dubbodemo.contract.HelloWord?application=zhanggz-dubbodemo-consumer&codec=dubbo&heartbeat=60000&interface=dubbodemo.contract.HelloWord&lazy=false&pid=5236&qos.enable=false®ister.ip=192.168.40.69&remote.application=&side=consumer&sticky=false&timeout=2200): client(url: dubbo://localhost:20880/dubbodemo.contract.HelloWord?application=zhanggz-dubbodemo-consumer&codec=dubbo&heartbeat=60000&interface=dubbodemo.contract.HelloWord&lazy=false&pid=5236&qos.enable=false®ister.ip=192.168.40.69&remote.application=&side=consumer&sticky=false&timeout=2200) failed to connect to server localhost/127.0.0.1:20880, error message is:Connection refused: no further information: /192.168.40.69:20880

技术分享图片

----------------------------- consumer端设置dubbo.consumer.check=false。则可以启动consumer服务。不过,当调用远程服务的时候,由于远程服务处于停止状态,所以会报错。org.apache.dubbo.rpc.RpcException: Failed to invoke remote method: add, provider: dubbo://localhost:20880/dubbodemo.contract.HelloWord?application=zhanggz-dubbodemo-consumer&check=false&interface=dubbodemo.contract.HelloWord&lazy=false&pid=12504&qos.enable=false®ister.ip=192.168.40.69&remote.application=&side=consumer&sticky=false&timeout=2200, cause: message can not send, because channel is closed . url:dubbo://localhost:20880/dubbodemo.contract.HelloWord?application=zhanggz-dubbodemo-consumer&check=false&codec=dubbo&heartbeat=60000&interface=dubbodemo.contract.HelloWord&lazy=false&pid=12504&qos.enable=false®ister.ip=192.168.40.69&remote.application=&side=consumer&sticky=false&timeout=2200

技术分享图片

----------------------------------

consumer端,设置retries=3
2020-07-24 17:12:57.389 INFO 7468 --- [ main] dubbodemo.consumer.DubboConsumerTest : 请求开始...
2020-07-24 17:13:00.202 INFO 7468 --- [ main] dubbodemo.consumer.DubboConsumerTest : 返回值=test retry:str
2020-07-24 17:13:00.202 INFO 7468 --- [ main] dubbodemo.consumer.DubboConsumerTest : duration==2813

provider端:最多会被执行1+retries=4次
2020-07-24 17:12:57.540 INFO 2372 --- [28088-thread-17] dubbodemo.provider.ProviderApplication : add入参:str
2020-07-24 17:12:57.541 INFO 2372 --- [28088-thread-17] dubbodemo.provider.ProviderApplication : r=1169
2020-07-24 17:12:58.444 INFO 2372 --- [28088-thread-18] dubbodemo.provider.ProviderApplication : add入参:str
2020-07-24 17:12:58.444 INFO 2372 --- [28088-thread-18] dubbodemo.provider.ProviderApplication : r=1934
2020-07-24 17:12:58.711 INFO 2372 --- [28088-thread-17] dubbodemo.provider.ProviderApplication : duration=1170
2020-07-24 17:12:59.461 INFO 2372 --- [28088-thread-19] dubbodemo.provider.ProviderApplication : add入参:str
2020-07-24 17:12:59.461 INFO 2372 --- [28088-thread-19] dubbodemo.provider.ProviderApplication : r=736
2020-07-24 17:13:00.198 INFO 2372 --- [28088-thread-19] dubbodemo.provider.ProviderApplication : duration=737
2020-07-24 17:13:00.379 INFO 2372 --- [28088-thread-18] dubbodemo.provider.ProviderApplication : duration=1935

 


推荐阅读
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 探讨如何在映射文件中处理重复的属性字段,以避免数据操作时出现错误。 ... [详细]
  • 在测试软件或进行系统维护时,有时会遇到电脑蓝屏的情况,即便使用了沙盒环境也无法完全避免。本文将详细介绍常见的蓝屏错误代码及其解决方案,帮助用户快速定位并解决问题。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
author-avatar
太2真人05
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有