Khi Netflix Zuul được dùng như một gateway để điều hướng những truy vấn nhận được cho các services ở backend, có đôi lúc những truy vấn này có thể không được các service này trả lời.
Để tránh những trường hợp này, ta có thể cấu hình sao cho những truy vấn này được thực thi lại (retry) một cách tự động. Khi dùng Spring Cloud Netflix, ta cần thêm Spring Retry vào tập tin pom.xml của dự án để dùng cấu hình này. Khi Spring Retry được dùng, loadbalancer của Zuul (ở đây là Ribbon) sẽ tự động thực hiện retry những truy vấn thất bại.
Trong tập tin pom.xml thêm Spring Retry vào dự án như sau :
<!-- enable retry for non-reactive version (load-balanced RestTemplate) -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
Trong tập tin cấu hình application.xml của zuul, ta cần kích hoạt loadbalancer và retry như sau :
spring:
cloud:
# enable retry for reactive version (with WebClient)
loadbalancer:
retry:
enabled: true
ribbon:
enabled: true
zuul:
retryable: true
ribbon:
OkToRetryOnAllOperations: true
MaxAutoRetries: 3
MaxAutoRetriesNextServer: 3
# 500 (Internal Server Error), 503 (Service Unavailable), 408 (Request Timeout)
retryableStatusCodes: 500, 503, 408
Trong các tập tin cấu hình application.xml của các services, ta cần cấu hình cho retry như sau :
ribbon:
OkToRetryOnAllOperations: true
MaxAutoRetries: 3
MaxAutoRetriesNextServer: 3
# 500 (Internal Server Error), 503 (Service Unavailable), 408 (Request Timeout)
retryableStatusCodes: 500, 503, 408
Giải thích :
- Nếu trong các service, bạn dùng RestTemplate, thì mặc định retry không được kích hoạt. Để kích hoạt retry cho phiên bản non-reactive tức RestTemplate, bạn chỉ cần thêm Spring Retry vào dự án như trên.
- Cho phiên bản reactive tức WebClient, để kích hoạt retry bạn cần phải thêm như sau: spring.cloud.loadbalancer.retry.enabled=true và spring.cloud.loadbalancer.ribbon.enabled=true
- MaxAutoRetries – Số lần truy vấn thất bại được tái thực thi trên cùng server (default 0)
- MaxAutoRetriesNextServer – Số server được dùng để thực hiện retry, ngoại trừ server đầu tiên (default 0)
- retryableStatusCodes – danh sách status code của HTTP để thực hiện retry
- OkToRetryOnAllOperations – khi biến này là true, thì mọi loại truy vấn HTTP đều được thực hiện retry, chứ không bải chỉ có loại chi vấn GET được retry ở mặc định.