1、背景说明
在互联网时代, 不同系统之间大多数是通过http调用,调用过程中会超时、异常等过种问题。为了保证业务稳定,http 重试是常用方案。下面列举几种方案。
2、Http重试方案介绍
2.1 传统方案
1、使用传统的递归调用,实现方法的代码截图如下:
还有更low的方法通过循环实现重试调用。
2、使用Http 自身的重试定义,要引入的jar 如下
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.1</version>
</dependency>
这种方案需要自定义一个 HttpRequestRetryHandler,但是他一般是针对不同异常重试,代码截图如下,然后在产出httpClient 连接的时候把这个重试策略初始化进去。
2.2 使用灵活的框架
1、 使用spring-retry框架实现,依赖jar 如下
要aop 的jar,因为retry 依赖此框架。 在Springboot 项目启动类上要加@EnableRetry(表示是否开启重试),代码通过注解方式实现,代码截图如下
注解说明如下
@Retryable表示 标注此注解的方法在发生异常时会进行重试,@Retryable属性有如下截图:
说明:interceptor表示interceptor的 bean 名称应用到 retryable(),默认为空,value表示可重试的异常类型。label表示 统计报告的唯一标签。如果没有提供,调用者可以选择忽略它,或者提供默认值。maxAttempts表示尝试的最大次数(包括第一次失败),默认为3次,backoff表示指定用于重试此操作的backof属性。默认为空。
@BackOff 注解如下截图
属性说明:
delay表示等待重试时间,如果不设置则默认使用 1000 milliseconds。
maxDelay表示最大重试等待时间。
multiplier表示用于计算下一个延迟延迟的乘数(大于0生效)
random表示随机等待时间。
2、使用guava-retrying 框架重试,依赖jar 如下,
代码截图如下
2.3、总结
相比传统的方式,使用框架让代码更加整洁、灵活,并且讲正常方法和重试方法进行解耦,并且可以设置超时时间、重试次数、间隔时间、监听结果、都是不错的框架。但是guava-retry在使用上更便捷,更灵活,能根据方法返回值来判断是否重试,而Spring-retry只能根据抛出的异常来进行重试。