API Gateway — a single entry point that receives all client requests and routes them to the appropriate backend microservice. It acts as a reverse proxy, handling cross-cutting concerns so individual services don't have to.
System Design Context: Without an API gateway, clients must know the exact URL of each microservice and handle authentication, rate limiting, and protocol translation themselves. The gateway centralizes these concerns and provides a unified API surface.
Core Responsibilities:
Spring Cloud Gateway — Production Configuration:
1@Configuration2public class GatewayConfig {34 @Bean5 public RouteLocator routes(RouteLocatorBuilder builder) {6 return builder.routes()7 .route("users", r -> r8 .path("/api/users/**")9 .filters(f -> f10 .stripPrefix(1)11 .addRequestHeader("X-Forwarded-By", "gateway")12 .retry(config -> config13 .setRetries(3)14 .setBackoff(Duration.ofMillis(100),15 Duration.ofSeconds(1), 2, true)))16 .uri("lb://user-service"))17 .route("orders", r -> r18 .path("/api/orders/**")19 .filters(f -> f20 .circuitBreaker(config -> config21 .setName("orderService")22 .setFallbackUri("forward:/fallback/orders")))23 .uri("lb://order-service"))24 .route("auth", r -> r25 .path("/api/auth/**")26 .filters(f -> f27 .rateLimiter(config -> config28 .setRateLimiter(rateLimiter)29 .setKeyResolver(userKeyResolver)))30 .uri("lb://auth-service"))31 .build();32 }3334 @Bean35 public GlobalFilter customGlobalFilter() {36 return (exchange, chain) -> {37 long startTime = System.currentTimeMillis();38 return chain.filter(exchange).then(Mono.fromRunnable(() -> {39 long duration = System.currentTimeMillis() - startTime;40 log.info("Request to {} took {}ms",41 exchange.getRequest().getPath(), duration);42 }));43 };44 }45}
Production Concerns:
Common Pitfalls:
Monitoring:
Benefits: