使用resilience4j的库和Spring Boot设计高弹性的微服务。
微服务本质上是分布式的。当您使用分布式系统时,请始终记住这一第一法则- 网络中可能发生任何事情。处理任何此类意外故障可能很难解决。故障可能是任何东西-应用程序,硬件或网络等。
系统从故障中恢复并保持正常运行的能力使系统更具 弹性。它还避免了下游服务的任何级联故障。
重试模式:
在微服务体系结构中,当有多个服务(A,B,C和D)时,一个服务(A)可能依赖于另一服务(B),而另一服务(B)又可能依赖于C,依此类推。有时由于某些问题,服务D可能无法按预期响应。服务D可能引发了某些异常,例如内存不足 错误或内部服务器错误。此类异常被级联到下游服务,这可能导致不良的用户体验,如下所示。
有时,当google.com对我们不起作用时,我们只是不放弃。我们假设页面下次可以正常工作,并且大多数情况下都会刷新页面,因此只需刷新页面即可。间歇性网络问题非常普遍。在微服务领域,我们可能正在运行同一服务D的多个实例,以实现高可用性和负载平衡。如果其中一个实例可能有问题,并且无法正确响应我们的请求,则如果我们重试该请求,则负载均衡器可以将请求发送到运行状况良好的节点并正确获得响应。因此,使用“重试”选项,我们有更多机会获得正确的响应。
让我们考虑这个简单的应用程序来解释此重试模式。
设置:
io.github.resilience4j resilience4j-spring-boot2 1.6.1
产品服务负责根据用户搜索条件提供产品列表。它是即使在关键负载下也应该启动和响应的核心服务之一。如果下降,将严重影响收入。由于此服务取决于评级服务,因此我们不希望任何网络问题或评级服务不可用性影响此产品服务。这就是使用 resilience4j 库的目的。
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 CompletionStagegetProductRatingDto(int productId){ Supplier supplier = () -> this.restTemplate.getForEntity(this.ratingService + productId, ProductRatingDto.class) .getBody(); return CompletableFuture.supplyAsync(supplier); } private CompletionStage getDefault(int productId, HttpClientErrorException throwable){ return CompletableFuture.supplyAsync(() -> ProductRatingDto.of(0, Collections.emptyList())); } }
代码解释:
总结
重试模式 是用于设计弹性微服务的最简单的微服务 设计模式之一。引入重试可以解决与网络相关的问题。
源代码可 在此处获得。
超时模式源码可在此处获得。
以上就是使用SpringBoot实现微服务超时重试模式的示例的详细内容,更多关于SpringBoot实现微服务超时的资料请关注其它相关文章!