Spring Cloud路由与过滤器是Spring Cloud Gateway的核心功能。Spring Cloud Gateway是一个用于构建API网关的框架,旨在提供简单、有效的路由管理及API请求过滤。为了实现这些功能,Spring Cloud Gateway使用了路由(Route)和过滤器(Filter)两个重要概念。下面我们详细介绍这两个部分。
路由(Route)
路由是将请求映射到后端服务的规则。每个路由包含一个ID、一个目标URI(目的地址)和一组谓词(Predicate)和过滤器(Filter)。谓词用于匹配请求的条件,而过滤器则用于对请求进行修改或处理。
#
配置路由
你可以在`application.yml`文件中配置路由。例如:
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: http://example.org
predicates:
- Path=/example/**
- id: anotherRoute
uri: lb://my-service
predicates:
- Path=/my-service/**
- Method=GET
在上述配置中,第一个路由将匹配所有`/example/`路径的请求,并将它们路由到`http://example.org`。第二个路由则匹配`/my-service/`路径的GET请求,并将它们路由到通过负载均衡器(lazy load balancer)发现的名为`my-service`的服务上。
过滤器(Filter)
过滤器是对请求和响应进行修改的逻辑。Spring Cloud Gateway提供了多种内置过滤器,也支持用户自定义过滤器。
#
内置过滤器
Spring Cloud Gateway提供了许多内置的全局过滤器和路由过滤器。常用的内置过滤器包括:
1. AddRequestHeader:在请求头中添加一个键值对。
2. AddResponseHeader:在响应头中添加一个键值对。
3. RewritePath:重写请求路径。
4. StripPrefix:去掉请求路径中的前缀。
示例配置:
spring:
cloud:
gateway:
routes:
- id: rewritePathRoute
uri: http://example.org
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo/(?.*), /$\{segment}
- id: addHeaderRoute
uri: http://example.org
predicates:
- Path=/bar/**
filters:
- AddRequestHeader=X-Request-Id, 12345
- AddResponseHeader=X-Response-Id, 54321
在上述配置中,第一个路由通过`RewritePath`过滤器重写了请求路径,去掉了`/foo`前缀。第二个路由在请求头中添加了`X-Request-Id`,在响应头中添加了`X-Response-Id`。
#
自定义过滤器
除了使用内置过滤器外,你还可以定义自己的过滤器。自定义过滤器需要实现`GatewayFilter`或`GlobalFilter`接口。
示例:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CustomFilter implements GatewayFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在这里添加自定义的过滤逻辑
System.out.println("Custom pre-filter logic goes here");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 这里是响应后的逻辑
System.out.println("Custom post-filter logic goes here");
}));
}
@Override
public int getOrder() {
return -1;
}
}
在上述例子中,`CustomFilter`实现了`GatewayFilter`和`Ordered`接口,说明了如何在请求前和响应后执行自定义逻辑。
总结来说,Spring Cloud Gateway的路由和过滤器提供了强大的API网关功能,使得请求路由和处理变得简单且灵活。通过配置和扩展过滤器,你可以满足大多数网关的应用场景需求。