文档章节

微服务常用技能之优雅的重试

稻草鸟人
 稻草鸟人
发布于 2017/04/08 15:04
字数 976
阅读 3064
收藏 190
点赞 4
评论 20

一般从事软件开发工作的同时通常需要调用远程服务,但是即使是亚马逊、阿里巴巴、腾讯这些巨头提供的服务也可能因为网络或者服务高可用方面的一些问题,或许会遇到超时等异常情况,这时候我们就必需要考虑到异常情况下我们的应用如何能处变不惊处理这些异常,是直接抛出异常还是说可以自动进行一些处理呢? 通常情况下我们首先想到的解决方案一定是重试对吧。

我看过很多代码,他们都怎么写的呢,如下

public String invoke(int times) {
    for(int i = 0; i < times; i ++) {
        try{
            // do some thing
            // return
        }catch(Exception e) {
            return invoke(i);
        }
    }
}

上面的代码意思是首先传入一个次数参数,假设我们传递的是3,那么当遇到异常的时候,重新调用当前方法,次数变为2…

你有没有发现如果调用外部服务很多的时候,这样的for循环写的让人不舒服,因为都是重复的代码,而且显的很啰嗦呢,spring boot给我们带来了一些福音,我们看看spring boot框架下如何进行重试

1、 首先引入JAR包

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

2、使用注解 @EnableRetry @Retryable 下面先给出代码,然后我们再讲注解的含义

@SpringBootApplication
@EnableRetry
public class LeaningNotesApplication {

public static void main(String[] args) {
    SpringApplication.run(LeaningNotesApplication.class, args);
}
}
@Service
public class BookService {

private Random random = new Random();

@Retryable(include = RuntimeException.class, maxAttempts = 3)
public String readingList() {
    int randomInt= random.nextInt(10) ;
    if(randomInt < 8){  //模拟调用失败情况
        System.out.println("调用失败发生异常");
        throw new RuntimeException("call dependency service fail.");
    }else{
        System.out.println("调用成功");
        return "调用成功 ;number:"+randomInt;
    }
}

@Recover
public String reliable() {
    return "Cloud Native Java (O'Reilly)";
}


3、我们再写一个接口,通过浏览器来访问这个接口,看看上面的代码帮我们进行了几次重试,另外如果重试了几次都失败,他又执行了什么方法

@RestController
public class BookController {

@Autowired
private BookService bookService;

@GetMapping("/book")
public String book() {
    return bookService.readingList();
}
}

上面的这个代码就比较简单了,我们可以通过http://localhost:8080/book 来访问这个接口,然后在控制台看结果,我都迫不及待想要去试试了,你呢?

4、我打开了浏览器输入了地址,然后我看到控制台打印了下面这样的信息

调用失败发生异常 
调用成功 
是的,你没看错,先输出了一个异常日志,然后又输出了一个成功日志,说明了它在异常的情况下帮我重试了一次,然后才成功的,当然你也可以多尝试几次看看不一样的结果。

5、@Retryable 几个比较重要的参数

value : 抛出某些异常的时候才进行重试

include: 和value的含义类似

exclude: 排除某些异常不进行重试,这里要注意的是,如果value、include、exclude都为空的时候则任何异常都进行重试

maxAttempts: 最大重试次数

backoff: 重试策略,默认使用注解@Backoff 而@BackOff中value的默认为1000L,multiplier的默认值为0,表示默认情况下固定暂停1秒进行重试,如果我们把multiplier调整为2,那么表面第一次进行重试时间为1秒,第二次为2秒,第三次为4秒。

是不是很牛逼,有木有GET到新技能?

注意:注解了@Recover方法的参数可以没有,如果有一定是和注解@Retryable处理的异常是一样的或者是它的子集,否则recover方法将不能被执行,并不是网上一些人瞎逼逼说一定要和@Retryable处理的异常要保持一致

 

请大家多多关注,让我能有勇气坚持下去

© 著作权归作者所有

共有 人打赏支持
稻草鸟人

稻草鸟人

粉丝 50
博文 12
码字总数 10204
作品 0
上海
后端工程师
加载中

评论(20)

kubei
kubei
谢谢 博主的 分享
稻草鸟人
稻草鸟人

引用来自“终曲”的评论

生产环境重试有时候很危险,根据不同的异常可能要fail fast,那就把错误处理的逻辑全部隐式转嫁到抛什么异常上了,代码更难读

回复@终曲 : 重试只是其中最常见的方式,不错,有些可能要FAILFAST有些需要FAIL OVER当然还有其他降级等策略
Z
Zollty
没看出有多优雅。。。
终曲
终曲
生产环境重试有时候很危险,根据不同的异常可能要fail fast,那就把错误处理的逻辑全部隐式转嫁到抛什么异常上了,代码更难读
稻草鸟人
稻草鸟人

引用来自“楼雨”的评论

一点都不优雅,当项目越久越大,人员N次更替之后,你这简直是恶梦。
当然,也不赞同第一种写法。

回复@楼雨 : 如何写更好?请指教
楼雨
楼雨
一点都不优雅,当项目越久越大,人员N次更替之后,你这简直是恶梦。
当然,也不赞同第一种写法。
HeartArea
HeartArea
原理就是aop,但是low逼的是为什么引入retry时不能把aspectj-weaver依赖也搞进入啊,还得自己手加。
HideHai
HideHai
又涨姿势了
notreami
notreami
无非改成切面实现,自己实现,一样没有问题。
notreami
notreami
无非改成切面实现,自己实现,一样没有问题。
微服务神经元--Neural

微服务神经元(Neural) 为微服务架构的提供一个类似于中枢神经的功能,主要功能如下: NPI(SPI):解决JDK原生SPI的缺陷 支持实现的排序 支持实现的分组 支持单例、多例选择 个性化重试 支持...

李景枫 ⋅ 2016/05/14 ⋅ 0

微服务学习(1)-微服务概念

一、什么是微服务(Microservices )? 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注...

花蝴蝶511 ⋅ 2017/12/14 ⋅ 0

微服务分布式事务-补偿模式

微服务分布式事务-补偿模式 为了描述方便,这里先定义两个概念: 业务异常:业务逻辑产生错误的情况,比如账户余额不足、商品库存不足等。 技术异常:非业务逻辑产生的异常,如网络连接异常、...

17099933344 ⋅ 2017/12/26 ⋅ 0

Polly 故障处理(一): 重试策略

在微服务架构下,我相信大家都应该遇到类似以下问题: 某些接口异常,最终造成应用程序池奔溃; 某些接口不稳定、偶尔超时,数据获取异常; 某些服务不稳定,调用方连接不上; 某些服务异常,...

BeckJin ⋅ 05/14 ⋅ 0

IT架构师绝对不能错过的34张史上最全技术知识图谱

架构师图谱 Java架构师图谱 微服务架构秘籍 一致性图谱 互联网大流量的方法 安全秘籍 阿里巴巴常用小框架 架构方法论图谱 设计模式秘籍图谱 JVM虚拟机垃圾回收图谱 Java并发图谱 Java集合图谱...

棋帅小七 ⋅ 2017/12/22 ⋅ 1

@eechen来来,哥给你展示什么叫“优雅”

@eechen总是在与自己无关的问题乱插一脚,要么推销php,要么攻击别的语言,比如:https://www.oschina.net/question/3188325_2215860 本人对php没什么偏见,而且我们公司的oa就是用php开发的。...

wei2011 ⋅ 2016/12/30 ⋅ 17

微服务网关netflix-zuul

引言:前面一个系列文章介绍了认证鉴权与API权限控制在微服务架构中的设计与实现 ,好多同学询问有没有完整的demo项目,笔者回答肯定有的。由于之前系列文章侧重讲解了权限前置,所以近期补上...

aoho ⋅ 2017/11/14 ⋅ 0

"分布式事务一致性" 看这一篇就够了

大家好,我是田向阳,是现任普元解决方案的中心架构师。今天我给大家分享的题目是微服务架构下的事务一致性保证。 主要内容包括4部分:传统分布式事务不是微服务中一致性的最佳选择 微服务架...

技术小能手 ⋅ 04/17 ⋅ 0

学习微服务首先要了解为什么使用微服务

说明本文偏重微服务理论知识,如需学习真实项目实战经验,可以参考课程《Java深入微服务原理改造房产销售平台》 单体的优缺点 单体应用就是将应用程序的所有功能都打包成一个独立的单元,最终...

格_鲁 ⋅ 01/15 ⋅ 0

微服务神经元 Neural 发布 3.1.0

微服务神经元 Neural 发布 3.1.0,主要更新了以下功能: 微服务神经元由Nerver正式更名为Neural 新增基于Log4j2的自定义日志中心,用于分别收集各类日志,如启动日志、业务日志、错误日志和性...

李景枫 ⋅ 2016/07/11 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

聊聊spring cloud gateway的RedisRateLimiter

序 本文主要研究下spring cloud gateway的RedisRateLimiter GatewayRedisAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/gateway/con......

go4it ⋅ 昨天 ⋅ 0

169. Majority Element - LeetCode

Question 169. Majority Element Solution 思路:构造一个map存储每个数字出现的次数,然后遍历map返回出现次数大于数组一半的数字. 还有一种思路是:对这个数组排序,次数超过n/2的元素必然在中...

yysue ⋅ 昨天 ⋅ 0

NFS

14.1 NFS介绍 NFS是Network File System的缩写 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版本 NFS数据传输基于RPC协议,RPC...

派派菠菜 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部