Spring Cloud Gateway Core Concepts and Implementation
Introduction to Spring Cloud Gateway
Spring Cloud Gateway serves as an API gateway built on the Spring ecosystem, leveraging technologies like Spring 5, Spring Boot 2.0, and Project Reactor. It provides a straightforward approach to route APIs while offering robust filter capabilities including circuit breaking, rate limiting, and retries.
Core Components
1. Routing Fundamentals
A route consists of three key elements:
- ID: Unique route identifier
- Target URI: Destination endpoint
- Predicates: Matching conditinos for requests
- Filters: Request/response modifiers
2. Request Processing Flow
- Client request enters Gateway
- Handler mapping finds matching route
- Request pases through filter chain
- Proxy request sent to backend service
- Response processed through post-filters
Basic Configuration Example
spring:
cloud:
gateway:
routes:
- id: payment_route
uri: lb://payment-service
predicates:
- Path=/payment/**
filters:
- AddRequestHeader=X-Request-Red, Blue
Predicate Factories
Gateway provides multiple built-in predicate factories:
Path Predicate
predicates:
- Path=/api/v1/**
Header Predicate
predicates:
- Header=X-Request-Id, \d+
Filter Factories
Gateway offers various filter factories to modify requests/responses:
AddRequestHeader Filter
filters:
- AddRequestHeader=X-Request-Red, Blue
RewritePath Filter
filters:
- RewritePath=/service/(?<segment>.*), /$\{segment}
Global Filters
Filters applied to all routes:
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
// Pre-processing logic
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// Post-processing logic
}));
}
}
Rate Limiting
Redis-based rate limiting configuration:
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
Load Balancing
Service discovery integration:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
Circuit Breaker
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
WebSocket Support
routes:
- id: websocket_route
uri: ws://service:8080
predicates:
- Path=/ws/**
Monitoring Endpoints
Actuator endpoints for monitoring:
- /actuator/gateway/routes - List all routes
- /actuator/gateway/globalfilters - Show global filters
- /actuator/gateway/routefilters - Display route filters
Custom Filter Implementation
@Component
public class CustomFilterFactory extends
AbstractGatewayFilterFactory<CustomFilterFactory.Config> {
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// Filter logic
return chain.filter(exchange);
};
}
public static class Config {
// Configuration properties
}
}
TLS/SSL Configuration
server:
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: changeit