使用SpringBoot实现微服务超时重试模式的示例
作者:banq 发布时间:2021-12-28 13:58:45
使用resilience4j的库和Spring Boot设计高弹性的微服务。
微服务本质上是分布式的。当您使用分布式系统时,请始终记住这一第一法则- 网络中可能发生任何事情。处理任何此类意外故障可能很难解决。故障可能是任何东西-应用程序,硬件或网络等。
系统从故障中恢复并保持正常运行的能力使系统更具 弹性。它还避免了下游服务的任何级联故障。
重试模式:
在微服务体系结构中,当有多个服务(A,B,C和D)时,一个服务(A)可能依赖于另一服务(B),而另一服务(B)又可能依赖于C,依此类推。有时由于某些问题,服务D可能无法按预期响应。服务D可能引发了某些异常,例如内存不足 错误或内部服务器错误。此类异常被级联到下游服务,这可能导致不良的用户体验,如下所示。
有时,当google.com对我们不起作用时,我们只是不放弃。我们假设页面下次可以正常工作,并且大多数情况下都会刷新页面,因此只需刷新页面即可。间歇性网络问题非常普遍。在微服务领域,我们可能正在运行同一服务D的多个实例,以实现高可用性和负载平衡。如果其中一个实例可能有问题,并且无法正确响应我们的请求,则如果我们重试该请求,则负载均衡器可以将请求发送到运行状况良好的节点并正确获得响应。因此,使用“重试”选项,我们有更多机会获得正确的响应。
让我们考虑这个简单的应用程序来解释此重试模式。
如上所述,我们有多个微服务
产品服务充当产品目录并负责提 * 品信息
产品服务取决于评级服务。
评分服务维护产品评论和评分。 由于拥有大量数据而速度慢是众所周知的。
每当我们查看产品详细信息时,产品服务就会将请求发送到评分服务,以获取该产品的评论。
我们还有其他服务,例如帐户服务,订单服务和付款服务等,与本文的讨论无关。
产品服务是一项核心服务,没有它,用户将无法启动订单工作流程。
设置:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.6.1</version>
</dependency>
产品服务负责根据用户搜索条件提 * 品列表。它是即使在关键负载下也应该启动和响应的核心服务之一。如果下降,将严重影响收入。由于此服务取决于评级服务,因此我们不希望任何网络问题或评级服务不可用性影响此产品服务。这就是使用 resilience4j 库的目的。
我首先为resilience4j创建一个配置, 如下所示。在这里,我们将超时明确设置为3秒。我们可以在特定的超时时间内添加多个服务。
我们可以有多种服务配置,如下所示。
对于ratingService,我们将最多进行3次重试,延迟5秒。
retryExceptions:这些是我们将重试的异常。这是一个数组字段。您可以配置多个例外。
ignoreExceptions:有些异常我们可能不想重试。例如,一个错误的请求就是一个错误的请求。重试没有意义。因此,我们忽略了这一点。
resilience4j.retry:
instances:
ratingService:
maxRetryAttempts: 3
waitDuration: 5s
retryExceptions:
- org.springframework.web.client.HttpServerErrorException
ignoreExceptions:
- org.springframework.web.client.HttpClientErrorException
someOtherService:
maxRetryAttempts: 3
waitDuration: 10s
retryExceptions:
- org.springframework.web.client.HttpServerErrorException
- java.io.IOException
代码:
@Service
public class RatingServiceClient {
private final RestTemplate restTemplate = new RestTemplate();
@Value("${rating.service.endpoint}")
private String ratingService;
@Retry(name = "ratingService", fallbackMethod = "getDefault")
public CompletionStage<ProductRatingDto> getProductRatingDto(int productId){
Supplier<ProductRatingDto> supplier = () ->
this.restTemplate.getForEntity(this.ratingService + productId, ProductRatingDto.class)
.getBody();
return CompletableFuture.supplyAsync(supplier);
}
private CompletionStage<ProductRatingDto> getDefault(int productId, HttpClientErrorException throwable){
return CompletableFuture.supplyAsync(() -> ProductRatingDto.of(0, Collections.emptyList()));
}
}
代码解释:
@Retry表示resilience4j将对该方法执行应用重试逻辑。
name = ratingService 表示 resilience4j 将使用yaml中的ratingService配置。
当main方法由于某种原因失败时,将使用fallbackMethod。
总结
重试模式 是用于设计弹性微服务的最简单的微服务 设计模式之一。引入重试可以解决与网络相关的问题。
源代码可 在此处获得。
超时模式源码可在此处获得。
来源:https://www.jdon.com/55324
猜你喜欢
- 我也不知道这个叫什么,就是比如我要打开我电脑的计算机,可以直接在命令行输入“calc”就可以了。现在用让代码去执行。public stati
- 打jar包实现分离依赖lib和配置为了业务需要配置文件和jar分离,便于使用者修改配置信息,在网上找了很久,最终找到一个简单有效的方法。操作
- 标识符和关键字标识符读音 biao zhi fu什么是标识符包、类、变量、方法…等等,只要是起名的地方,那个名字就是标
- 这里使用的是spring-security和原生的jasig cas包来进行整合,为什么没有直接使用spring提供的spring-secu
- 一、栈1.1 概述Java为什么要有集合类: 临时存储数据。链表的本质: 对象间通过持有和引用关系互相关联起来。线性表: 普通线性表, 操作
- 系列文章已完成,目录如下:jdk-logging log4j logback日志系统实现机制原理介绍commons-lo
- 实践过程效果代码public partial class Form1 : Form {
- 微信公众号提供了微信支付、微信优惠券、微信H5红包、微信红包封面等等促销工具来帮助我们的应用拉新保活。但是这些福利要想正确地发放到用户的手里
- 本文实例讲述了C#使用委托实现的快速排序算法。分享给大家供大家参考。具体如下:class QuickSort { private dele
- 本文实例为大家分享了Unity3D Shader实现扫描显示的具体代码,供大家参考,具体内容如下通过Shader实现,从左向右的扫描显示,可
- C#调用C++ dll string类型返回为了这个问题,百度了一堆不靠谱的资料,什么C#调用c++类型对应啥的,说用string ,Str
- 生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术
- 1、概念向下转型就是父类对象转成子类对象。我们把一个父类引用 Animal类型的引用 给了一个 Bird类型 的引用,这就是向下转型2、格式
- Java环境部署下载所需软件和依赖安装 jdk路径可选别的盘。但是指向时得注意我自己时装在 F 盘的,在f盘里新建文件夹 Java,Java
- 常用的字符串转date,和日期转字符串的方法,具体内容如下package com.cq2022.zago.base.util; import
- springboot Interceptor * excludePathPatterns忽略失效excludePathPatterns方法是
- 在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。常见的限流方式
- 前言:回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进
- 前言Java线程池中提交任务运行,通常使用execute()方法就足够了。那如果想要实现在主线程中阻塞获取线程池任务运行的结果,该怎么办呢?
- 对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。本文介绍的是除数据库之外的几种对象持久化方式。具体如下:保存成