下面是Spring Cloud Gateway过滤器GatewayFilter的详解攻略:
什么是Gateway Filter
Spring Cloud Gateway 的过滤器(Filters)提供了许多内置的功能,包括路由转发、限流、安全、监控等。Gateway Filter 是一个基本的工作单元,它由若干个有顺序的 GatewayFilter组成。每个 GatewayFilter 实例都可以实现 GatewayFilter 接口中的公共方法,如#filter方法,用于定义特定的行为和规则。
GatewayFilter 接口规范
public interface GatewayFilter {
default Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange);
}
default int getOrder() {
return 0;
}
class GatewayFilterChain {
Flux<GatewayFilter> filters;
public Flux<GatewayFilter> getFilters() {
return filters;
}
public Mono<Void> filter(ServerWebExchange exchange) {
return null;
}
}
}
GatewayFilter 接口定义了两个方法,filter(ServerWebExchange exchange, GatewayFilterChain chain)和getOrder()方法。
- filter(ServerWebExchange exchange, GatewayFilterChain chain): 这是 GatewayFilter 的核心方法,用于对请求和响应进行处理,主要逻辑都在这个方法中实现。
- getOrder(): 定义当前过滤器的顺序,数值越小表示越早执行。
自定义 GatewayFilter
例如,我们需要一个过滤器,能够在处理请求的时候,在请求 header 中添加一个特定的键值对。我们需要完成以下步骤:
Step 1. 创建自定义过滤器类
@Component
public class AddHeaderFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange.getRequest().mutate().header("X-Request-Foo", "Bar");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
上述过滤器实现了 GatewayFilter 接口并实现了 filter(ServerWebExchange exchange, GatewayFilterChain chain) 和 getOrder() 方法。filter 方法中使用mutate() 方法修改请求的 header 信息,将“X-Request-Foo”添加为“Bar”。
Step 2. 配置路由
为了使用上述自定义过滤器,需要在路由配置文件中添加自定义过滤器。
spring:
cloud:
gateway:
routes:
- id: add_header_route
uri: http://localhost:8080
predicates:
- Path=/test/**
filters:
- name: AddHeaderFilter
上述配置中,我们为 add_header_route 路由添加自定义过滤器 AddHeaderFilter。
示例一:自定义过滤器实现接口鉴权
接口鉴权是一个常见的应用场景。为了实现接口鉴权,可以创建一个 AuthorizationFilter 过滤器,它需要获取请求中的token,并验证token是否有效。
@Component
public class AuthorizationFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String authorization = exchange.getRequest().getHeaders().getFirst("Authorization");
if (StringUtils.isBlank(authorization)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
if (!validateAuthorization(authorization)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
private boolean validateAuthorization(String authorization) {
//验证逻辑
return true;
}
@Override
public int getOrder() {
return 0;
}
}
AuthorizationFilter 过滤器的 filter 实现了获取请求头中的 Authorization 字段,验证 Authorization 字段的有效性并进行处理。
在配置路由的时候,需要将 AuthorizationFilter 过滤器加到路由规则中:
spring:
cloud:
gateway:
routes:
- id: authentication_route
uri: http://localhost:8080
predicates:
- Path=/auth/**
filters:
- name: AuthorizationFilter
以上配置中,当请求的路径以/auth/开始时,会启用 AuthorizationFilter 过滤器对接口进行鉴权。
示例二:自定义过滤器实现请求记录
我们可以自定义一个 RequestLogFilter 过滤器来记录网关服务的请求日志。
@Component
public class RequestLogFilter implements GatewayFilter, Ordered {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String path = exchange.getRequest().getURI().getPath();
logger.info("Request path: {}", path);
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
RequestLogFilter 过滤器的 filter 方法实现了获取请求地址并输出日志信息。
在配置路由的时候,需要将 RequestLogFilter 过滤器加到路由规则中:
spring:
cloud:
gateway:
routes:
- id: request_log_route
uri: http://localhost:8080
predicates:
- Path=/request/**
filters:
- name: RequestLogFilter
以上配置中,当请求的路径以/request/开始时,会启用 RequestLogFilter 过滤器来记录服务请求日志。
以上就是关于Spring Cloud Gateway过滤器GatewayFilter的详解攻略,包括自定义过滤器的创建和使用,以及两个实际的使用示例的介绍。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringCloud Gateway之过滤器GatewayFilter - Python技术站