重试与超时配置
为暂时性故障配置自动重试,并设置超时,防止长时间运行的请求阻塞资源。
重试与超时配置 是 CoddyKit 上的免费 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Build Resilient Gateways
In microservices, services can fail or become slow. To keep our applications running smoothly, we need to build resilience.
- Resilience means your system can recover from failures and continue to function.
- Spring Cloud Gateway provides tools to make your API Gateway more resilient.
- Two key strategies for resilience are Timeouts and Retries.
Preventing Slow Responses with Timeouts
A timeout is a limit on how long an operation is allowed to take. If the operation doesn't complete within that time, it's automatically stopped.
- Timeouts prevent requests from hanging indefinitely.
- They free up resources (like network connections and threads) that would otherwise be tied up by a slow or unresponsive service.
- In a gateway, timeouts ensure that a slow backend service doesn't slow down the entire gateway or other requests.
Configuring Read Timeouts
Spring Cloud Gateway allows you to configure specific timeouts for routes. The ReadTimeout filter is commonly used to limit how long the gateway waits for a response from the backend service after the connection is established.
- This timeout is applied per route.
- It helps prevent a single slow backend from impacting the gateway's overall performance.
- The value is typically set in milliseconds.
Read Timeout Configuration Example
Here's how you can configure a ReadTimeout for a specific route in your application.yml. This example sets a 5-second read timeout for requests to /service-a/**:
Remember, this is part of your Spring Boot application's configuration.
spring:
cloud:
gateway:
routes:
- id: service_a_route
uri: http://localhost:8081
predicates:
- Path=/service-a/**
filters:
- ReadTimeout=5000Handling Transient Failures with Retries
Retries involve automatically re-sending a request that has failed, hoping it will succeed on a subsequent attempt.
- They are ideal for transient failures: temporary issues like network glitches or a brief service restart.
- Retries should be used cautiously, especially for non-idempotent operations (actions that produce different results if performed multiple times).
- Spring Cloud Gateway can be configured to automatically retry requests to backend services.
The Retry GatewayFilter
Spring Cloud Gateway provides a Retry filter to enable automatic retries for failed requests. You can configure various aspects of the retry logic:
retries: The maximum number of retry attempts.statuses: HTTP status codes that should trigger a retry (e.g.,503for Service Unavailable).methods: HTTP methods that can be retried (e.g.,GET,PUT).
Retry Configuration Example
Let's configure a Retry filter. This example retries requests up to 3 times if the backend returns a 5XX error or a 404, specifically for GET requests to /service-b/**:
spring:
cloud:
gateway:
routes:
- id: service_b_route
uri: http://localhost:8082
predicates:
- Path=/service-b/**
filters:
- name: Retry
args:
retries: 3
statuses:
- SERVER_ERROR
- NOT_FOUND
methods:
- GETSimple Retry Logic Demo
While Spring Cloud Gateway handles retries via configuration, the core concept involves looping until success or max attempts. Here's a basic Java program demonstrating a retry loop:
public class RetryDemo {
private static int attempt = 0;
public static boolean simulateBackendCall() {
System.out.println("Attempt " + (++attempt));
return attempt < 3; // Fails for first 2 attempts
}
public static void main(String[] args) {
int maxRetries = 2;
for (int i = 0; i <= maxRetries; i++) {
if (!simulateBackendCall()) {
System.out.println("Success!");
return;
}
System.out.println("Failed. Retrying...");
try { Thread.sleep(100); } catch (InterruptedException e) {}
}
System.out.println("Max retries reached. Operation failed.");
}
}Combining Timeouts & Retries
Timeouts and retries often work together:
- A timeout can trigger a retry if the request doesn't complete within the specified time.
- If a request times out, the gateway might then attempt a retry, hoping the next attempt will be faster or the service will respond.
- It's crucial to configure these carefully to avoid endless loops or excessive delays. For example, a retry might happen *after* a read timeout, or a global timeout could encompass all retries.
Best Practices for Resilience
When implementing timeouts and retries, consider these best practices:
- Idempotency: Only retry idempotent operations (e.g., GET, PUT) unless you have specific logic to handle non-idempotent ones (e.g., POST).
- Exponential Backoff: Introduce increasing delays between retries to avoid overwhelming a struggling service.
- Circuit Breakers: Combine with circuit breakers (covered in Lesson 10.1) to stop retrying services that are clearly down.
- Monitoring: Monitor retry counts and timeouts to identify persistently problematic services.
Quick Check on Gateway Resilience
You're configuring a Spring Cloud Gateway route for a backend service that sometimes experiences brief network hiccups, resulting in a 503 Service Unavailable error. You want the gateway to automatically try the request again a few times before giving up. Which filter and configuration would best achieve this?
Recap: Timeouts & Retries
We've explored how Timeouts and Retries are fundamental for building resilient API Gateways with Spring Cloud Gateway.
- Timeouts prevent requests from hanging, freeing up resources.
- The
ReadTimeoutfilter configures the wait time for backend responses. - Retries automatically re-send requests for transient failures.
- The
Retryfilter allows fine-grained control over retry attempts, statuses, and HTTP methods. - Combining these with best practices helps create robust microservice architectures.
用 AI 导师学习 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 12
- 课程
- 48
常见问题解答
「重试与超时配置」课时是免费的吗?
是的 — 「重试与超时配置」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程的其余内容,请升级到 CoddyKit PRO。 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程共包含 4 节课。
「重试与超时配置」这节课中我会学到什么?
为暂时性故障配置自动重试,并设置超时,防止长时间运行的请求阻塞资源。 你通过在浏览器中直接运行的动手代码来练习 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway),全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 需要有经验吗?
无需任何先前经验。CoddyKit 上的 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「重试与超时配置」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课中编写并运行代码吗?
能。每节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。