Spring Cloud Gateway之路由配置
Spring Cloud Gateway支持多种方式的路由配置,允许根据各种条件和需求来定义和控制请求的路由行为。以下是Spring Cloud Gateway中常用的路由配置选项和相关功能:
基本路由配置
路由的基本配置通常包括路由ID、目标URI、谓词(Predicates)和过滤器(Filters)。这是一个最基本的路由配置结构:
spring:
cloud:
gateway:
routes:
- id: example_route
uri: https://example.com
predicates:
- Path=/example/**
filters:
- AddRequestHeader=Example, Header
- id: 路由的唯一标识符。
- uri: 目标URI,表示请求将被转发到哪个服务或外部网站。
- predicates: 路由谓词,用于定义哪些请求符合条件并会匹配此路由。
- filters: 过滤器,用于在请求被路由到目标URI之前或响应返回客户端之前对请求或响应进行处理。
谓词(Predicates)
谓词用于定义路由的匹配条件。Spring Cloud Gateway支持多种谓词类型,它们基于Spring的java.util.function.Predicate
。常用的谓词包括:
- Path: 按照请求路径匹配。例如,
Path=/example/**
。 - Method: 按照HTTP方法匹配。例如,
Method=GET
。 - Header: 按照请求头匹配。例如,
Header=X-Request-Id, \d+
。 - Query: 按照请求参数匹配。例如,
Query=foo, ba.
。 - Cookie: 按照请求中的Cookie匹配。例如,
Cookie=chocolate, choco.*
。 - Host: 按照主机名匹配。例如,
Host=**.example.com
。
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.com
predicates:
- Header=MyHeader, my-value
过滤器(Filters)
过滤器是Spring Cloud Gateway路由的重要组成部分,用于在请求或响应的生命周期中添加自定义处理逻辑。常用的过滤器包括:
- AddRequestHeader: 添加请求头。
- AddRequestParameter: 添加请求参数。
- StripPrefix: 移除路径前缀。
- RewritePath: 重写请求路径。
- SetPath: 设置请求路径。
- RedirectTo: 重定向请求。
- Retry: 请求失败时重试。
- RequestRateLimiter: 请求限流。
spring:
cloud:
gateway:
routes:
- id: rewrite_route
uri: https://example.com
predicates:
- Path=/oldpath/**
filters:
- RewritePath=/oldpath/(?<segment>.*), /newpath/${segment}
组合多个谓词
Spring Cloud Gateway支持使用多个谓词组合来匹配请求,所有谓词必须都满足时,路由才会生效。
spring:
cloud:
gateway:
routes:
- id: complex_route
uri: https://example.com
predicates:
- Path=/example/**
- Method=GET
- Header=MyHeader, my-value
在这个配置中,只有请求路径是/example/**
、HTTP方法是GET
,并且请求头MyHeader
的值是my-value
时,路由才会匹配。
全局过滤器
全局过滤器作用于所有路由,通常用于实现通用功能,如日志记录、身份认证、跨域处理等。
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@Component
public class CustomGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("Global Pre Filter executed");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("Global Post Filter executed");
}));
}
}
动态路由
Spring Cloud Gateway支持动态路由配置,可以通过编程方式在运行时添加、修改或删除路由。这种方式适用于需要根据外部条件(如数据库配置、服务发现等)实时调整路由的场景。
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/example/**")
.uri("https://example.com"))
.build();
}
}
总结
Spring Cloud Gateway提供了丰富且灵活的路由配置方式,可以通过谓词、过滤器、全局过滤器以及动态路由等功能满足各种复杂的路由需求。正确地配置和使用这些选项可以确保API网关在微服务架构中的高效、安全运行。