0Pricing
API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) · 课时

错误处理与降级方案

实施自定义错误处理,并定义服务不可用时的降级机制,实现平稳降级。

错误处理与降级方案 是 CoddyKit 上的免费 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Resilient Error Handling Intro

In a microservices architecture, services can fail. An API Gateway needs robust error handling and fallback mechanisms to ensure the entire system remains stable and user-friendly.

This lesson explores how Spring Cloud Gateway helps you gracefully handle errors and provide alternative responses when backend services are unavailable.

Default Gateway Errors

By default, Spring Cloud Gateway provides generic error responses when a routed service is unreachable or returns an error. These often include standard HTTP status codes (like 500 Internal Server Error, 503 Service Unavailable) and basic JSON.

While functional, these default messages are usually not user-friendly and might expose internal details. Customization is key for a good user experience.

Customizing Error Responses

To improve user experience, we can customize the error responses from the Gateway. This allows us to:

  • Provide clear, branded error messages.
  • Hide sensitive internal error details.
  • Return consistent error formats across all APIs.

Spring Cloud Gateway, being built on Spring WebFlux, allows us to implement custom ErrorWebExceptionHandler components.

Custom Error Handler Example

Let's create a custom error handler that intercepts errors and returns a simplified JSON response. This handler will replace the default error page.

Run this code and try accessing /fail. You'll see our custom message!

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("nonexistent_service", r -> r.path("/fail/**")
                .uri("http://localhost:9999")) // Route to a non-existent service
            .build();
    }
}

@Configuration
@Order(-1) // Ensure this handler runs before default ones
class CustomJsonErrorWebExceptionHandler implements ErrorWebExceptionHandler {

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        ServerHttpResponse response = exchange.getResponse();
        response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);

        String errorBody = "{\"status\":500, \"message\":\"Our service is temporarily unavailable. Please try again!\"}";
        DataBuffer buffer = response.bufferFactory().wrap(errorBody.getBytes(StandardCharsets.UTF_8));
        return response.writeWith(Mono.just(buffer));
    }
}

Understanding Fallback Mechanisms

A fallback mechanism provides an alternative path or response when a primary service fails or becomes unavailable. Instead of showing a raw error, the Gateway can gracefully degrade by:

  • Returning a default response.
  • Redirecting to a static error page.
  • Calling a dedicated fallback service.

Fallbacks are crucial for resilience and preventing cascading failures.

Gateway Fallback Strategies

Spring Cloud Gateway supports fallbacks primarily through its integration with circuit breakers (like Resilience4j, which we discussed in the previous lesson). When a circuit breaker trips, instead of failing outright, it can invoke a fallback.

A common way to define this fallback is using the setFallbackUri() method within the circuit breaker filter, often pointing to a forward: URI.

Implementing a Simple Fallback Route

The simplest fallback is to forward the request to another URI within the Gateway itself. This can be a static HTML page, a simple Spring controller method, or even another internal route.

The forward: prefix in fallbackUri tells the Gateway to handle the request internally, without making another external HTTP call.

Configuring a Fallback Route

Here's how to configure a route with a fallback. If the /api/** route's backend service fails (e.g., due to a circuit breaker opening), the Gateway will forward the request to our local /fallback endpoint.

Try accessing /api/hello when localhost:9000 is down.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController // For our simple fallback endpoint
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("backend_service", r -> r.path("/api/**")
                .filters(f -> f.circuitBreaker(config -> config
                    .setName("myCircuitBreaker")
                    .setFallbackUri("forward:/fallback"))) // Fallback URI
                .uri("http://localhost:9000")) // A service that might fail
            .build();
    }

    // This method acts as the fallback service
    @GetMapping("/fallback")
    public String fallback() {
        return "Service is currently unavailable. Please try again later!";
    }
}

Fallback to a Dedicated Service

For more complex scenarios, you might configure fallbackUri to point to a dedicated microservice. This "fallback service" can:

  • Serve rich error pages.
  • Provide cached or default data.
  • Log detailed error information.

This approach centralizes error handling logic and keeps your Gateway configuration cleaner.

Check Your Knowledge

Which of the following are benefits of implementing custom error handling and fallback mechanisms in an API Gateway?

Lesson Summary

In this lesson, we learned the importance of robust error handling and fallback mechanisms in Spring Cloud Gateway. We explored how to:

  • Customize default error responses using ErrorWebExceptionHandler.
  • Implement simple fallbacks using setFallbackUri("forward:") with circuit breakers.
  • Understand the benefits of dedicated fallback services for advanced scenarios.

These techniques are vital for building resilient and user-friendly microservice applications.

常见问题解答

「错误处理与降级方案」课时是免费的吗?

是的 — 「错误处理与降级方案」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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) 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「错误处理与降级方案」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课中编写并运行代码吗?

能。每节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Resilience4j 实现熔断器
  2. 重试与超时配置
  3. 错误处理与降级方案
  4. 隔离舱与限流:提升恢复能力
← 返回 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway)