使用SpringBoot實現微服務超時重試模式 - Vinsguru
使用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。
總結
重試模式 是用於設計彈性微服務的最簡單的微服務 設計模式之一。引入重試可以解決與網路相關的問題。
原始碼可 在此處獲得。
超時模式原始碼可在此處獲得。
相關文章
- 使用SpringBoot+PostgreSQL物化檢視實現微服務設計模式 - vinsguruSpring BootSQL微服務設計模式
- JMicro微服務之超時&重試微服務
- 使用Envoy 作Sidecar Proxy的微服務模式-2.超時和重試IDE微服務模式
- 使用Spring Boot實現Redis事務 | VinsguruSpring BootRedis
- 怎樣實現一個非阻塞的超時重試任務佇列佇列
- Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguruSpring Boot微服務模式原始碼
- 使用Spring Boot + Kafka實現Saga分散式事務模式的原始碼 - vinsguruSpring BootKafka分散式模式原始碼
- 使用Conductor實現微服務架構中Saga模式微服務架構模式
- NIO中如何實現超時重傳?
- zuul超時及重試配置Zuul
- 使用分散式Actor實現微服務分散式微服務
- 怎麼實現微服務的實時效能分析?微服務
- .NET Core 微服務之Polly重試策略微服務
- Spring Boot中使用斷路器模式實現彈性微服務Spring Boot模式微服務
- 微服務斷路器模式實現:Istio vs Hystrix微服務模式
- SpringBoot如何實現定時任務Spring Boot
- 架構設計:微服務模式下,實現灰度釋出模式架構微服務模式
- 微服務的重試與彈性設計微服務
- 微服務實戰 – docker-compose實現mysql+springboot+angular微服務DockerMySqlSpring BootAngular
- java springboot 實現定時器任務JavaSpring Boot定時器
- 使用 Spark 進行微服務的實時效能分析Spark微服務
- 微服務架構 | 11.1 整合 Seata AT 模式實現分散式事務微服務架構模式分散式
- 使用Spring Boot + Redis 進行實時流處理 - vinsguruSpring BootRedis
- SpringBoot微服務安全最佳實踐 - piotrminkowskiSpring Boot微服務
- Redis如何簡化實現微服務的設計模式 – thenewstackRedis微服務設計模式
- 微服務分散式雲架構-springboot執行模式微服務分散式架構Spring Boot模式
- 使用 Apache Kafka 和微服務實時分析 Twitter 趨勢ApacheKafka微服務
- .Net Core微服務——Ocelot(3):超時、熔斷、限流微服務
- 你瞭解微服務的超時傳遞嗎?微服務
- Spring Cloud OpenFeign 超時與重試SpringCloud
- 超時重試思考-非冪等請求
- DDD實踐:在SpringBoot中跨微服務通過發件箱模式實現分散式事務機制 - Hans-Peter GrahslSpring Boot微服務模式分散式
- DDD實踐:在SpringBoot中跨微服務透過發件箱模式實現分散式事務機制 - Hans-Peter GrahslSpring Boot微服務模式分散式
- 基於Springboot+Dubbo+Nacos 註解方式實現微服務呼叫Spring Boot微服務
- springboot+dubbo+zookeeper微服務實踐demoSpring Boot微服務
- 教程|使用Istio實現一個Service Mesh以簡化微服務間的通訊模式微服務模式
- python使用非同步任務celery出現異常崩潰時retry重試薦Python非同步
- Eureka實現微服務的呼叫微服務