我是如何使用 Spring Retry 减少1000 行代码!

本文翻译自国外论坛 medium,原文地址:https://levelup.gitconnected.com/how-i-deleted-more-than-1000-lines-of-code-using-Spring-retry-9118de29060

使用 Spring Retry 重构代码的综合指南。

问题介绍

在我的日常工作中,我主要负责开发一个庞大的金融应用程序。当客户发送请求时,我们使用他们的用户 ID 从第三方服务获取他们的帐户信息,保存交易并更新缓存中的详细信息。

尽管整个流程看起来足够简单,但这些下游系统中的每一个都是不可靠的。我们必须在每一层上实现重试,并且我们必须以一种可以控制重试次数和每次重试之间的延迟的方式来实现,这样我们就不会超载下游系统。由于我无法共享实际代码,我会创建一个演示系统来做简单表示:

我是如何使用 Spring Retry 减少1000 行代码!

由于我们必须在每一层上实现重试,因此我们必须编写大量样板代码,这不仅容易出错,而且难以维护。由于每个下游系统都有自己的重试要求,因此我们最终添加了越来越多的代码,最终就像在现有垃圾之上添加垃圾一样。随着时间的推移,代码变得非常脆弱,即使是很小的变化也会破坏整个系统。

解决方案

为了解决这个问题我们决定使用 Spring Retry。

Spring Retry 项目地址:https://github.com/spring-projects/spring-retry

Spring Retry 是 Spring Batch 的一个子项目,它提供了一组注解和接口,我们可以使用它们向代码添加重试逻辑。它提供了一种向代码添加重试逻辑的声明性方法。

我是如何使用 Spring Retry 减少1000 行代码!

作为本文的一部分,我们将了解如何使用 Spring Retry 重写现有代码,以及它如何帮助我将代码库减少 1000 行。在展示新代码时,我将解释每个代码的注解和用例。

在研究重构的代码之前,让我们先了解一下在项目中设置 Spring 重试所涉及的步骤。

Let’s start hacking!

1. 设置 Spring 重试

将以下依赖项添加到我们的 pom.xml 文件中:

<dependency>  
   <groupId>org.springframework.retry</groupId>  
   <artifactId>spring-retry</artifactId>  
   <version>2.0.0</version>  
</dependency>  
<dependency>  
   <groupId>org.springframework</groupId>  
   <artifactId>spring-aspects</artifactId>  
   <version>5.2.8.RELEASE</version>  
</dependency>  

在 spring 配置上启用 Spring 重试,并使用以下注解:

@Configuration  
@EnableRetry  
public class ApplicationConfig { }  

2. 重构代码

既然我们已经设置了 Spring Retry,那么让我们开始重构代码。

  1. 以下是一个查询用户全名的代码示例,左边是老代码,右边是使用了 Spring Retry 的新代码。
我是如何使用 Spring Retry 减少1000 行代码!

使用 @Retryable 注解,我们通过 retryFor 属性指定要重试的异常数组,使用 maxAttempts 属性,可以指定要重试的次数。

  1. 具有指数退避的缓存重试

以下图片是一个添加缓存的代码示例中,我指定要在 JedisConnectionException 上重试,每次重试之间的延迟应为 1000 毫秒,并且延迟应呈指数增长。

我是如何使用 Spring Retry 减少1000 行代码!

使用 @Retryable 注解,我们可以使用重试退避 backoff 属性,还可以指定每次重试之间的延迟 delay。

  1. 外部化重试配置

我们可以轻松地将重试配置外部化到属性文件中。当我们想要重用配置并更改它们而无需重新部署应用程序时,这非常有用。就我而言,我创建了一个 retry.properties 文件并添加了以下属性:

retry.maxAttempts=2  

在我的 spring 配置中包含属性文件:

// <<Other annotations>>  
@PropertySource("classpath:retryConfig.properties")  
public class ApplicationConfig { }  

以下图片是一个先获取 MySQL 连接,再查数据的例子,我再代码中使用了该外部化配置属性:

我是如何使用 Spring Retry 减少1000 行代码!
  1. 消除错误时的重复操作,使用 RetryListenerSupport 重试

在前面的先获取 MySql 连接,再查数据的例子中,我想获取以下事件的指标:

再 Spring Retry 中,我可以使用 RetryListenerSupport 将所有代码添加到一个位置,而不是在连接到 Mysql 数据库的所有代码的每个重试块中添加相同的代码。

使用 RetryTemplate 上的 registerListener 方法注册 RetryListenerSupport:

@Configuration  
public class ApplicationConfig {  
  
  @Bean  
  public RetryTemplate installTemplate() {  
     RetryTemplate retryTemplate = new RetryTemplate();  
     retryTemplate.registerListener(new DefaultListenerSupport());  
     return retryTemplate;  
  }  
}  

RetryListenerSupport 提供了三种方法,我们可以重写它们来添加自定义逻辑:

现在让我们看看重构后的代码:

我是如何使用 Spring Retry 减少1000 行代码!
  • onError — 当出现错误时调用此方法

  • close——当所有重试都用尽时调用该方法

  • open — 重试开始时调用该方法

  • 连接 MySql 数据库时,发出指标

  • 连接 MySql 数据库失败时,发出指标

  • 当用尽所有重试次数时,发出指标

总结

在本文中,我们了解了如何使用 Spring Retry 来减少样板代码并使代码更具可读性和可维护性。通过 Spring Retry,相信你也能够消除超过 1000 行代码。

后端专属技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗

我是如何使用 Spring Retry 减少1000 行代码!

加我好友,拉你进群 

原文始发于微信公众号(Java笔记虾):我是如何使用 Spring Retry 减少1000 行代码!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/162415.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!