环境 SpringCloud:Finchley.RELEASE SpringBoot:2.0.0.RELEASE JDK:1.8
1. 过滤器
SpringCloud gateway 除了具备路由的功能,也支持对请求的过滤,类似Zuul网关,也是通过过滤器实现的。
1.1 过滤器基础
1.1.1 过滤器生命周期
- Pre Pre过滤器在请求被路由之前调用。可以通过pre过滤器实现身份认证
- Post post过滤器是在路由到微服务后执行,可以用来给响应添加http header、收集统计信息和指标、将微服务响应返回给客户端
1.1.2 过滤器类型
- Gateway Filter 应用到单一或一组路由上
- Global Filter 应用到所有路由上
1.2 局部过滤器
| 序号 | 局部过滤器名称 |
|---|---|
| 1 | AddRequestHeader GatewayFilter |
| 2 | AddRequestParameter GatewayFilter |
| 3 | AddResponseHeader GatewayFilter |
| 4 | DedupeResponseHeader |
| 5 | Hystrix |
| 6 | Spring Cloud CircuitBreaker GatewayFilter |
| 7 | FallbackHeaders GatewayFilter Factory |
| 8 | MapRequestHeader GatewayFilter |
| 9 | PrefixPath GatewayFilter |
| 10 | PreserveHostHeader GatewayFilter |
| 11 | RequestRateLimiter GatewayFilter |
| 12 | RedirectTo GatewayFilter |
| 13 | RemoveRequestHeader GatewayFilter |
| 14 | RemoveResponseHeader GatewayFilter |
| 15 | RemoveRequestParameter GatewayFilter |
| 16 | RewritePath GatewayFilter |
| 17 | RewriteLocationResponseHeader GatewayFilter |
| 18 | RewriteResponseHeader GatewayFilter |
| 19 | SaveSession GatewayFilter |
| 20 | SecureHeaders GatewayFilter |
| 21 | SetPath GatewayFilter |
| 22 | SetRequestHeader GatewayFilter |
| 23 | SetResponseHeader GatewayFilter |
| 24 | SetStatus GatewayFilter |
| 25 | StripPrefix GatewayFilter |
| 26 | Retry GatewayFilter |
| 27 | RequestSize GatewayFilter |
| 28 | Modify a Request Body GatewayFilter |
| 29 | Modify a Response Body GatewayFilter |
| 30 | Default Filters |
1.3 全局过滤器
| 序号 | 全局过滤器名称 |
|---|---|
| 1 | Forward Routing Filter |
| 2 | The LoadBalancerClient Filter |
| 3 | The ReactiveLoadBalancerClientFilter |
| 4 | The Netty Routing Filter |
| 5 | The Netty Write Response Filter |
| 6 | The RouteToRequestUrl Filter |
| 7 | The Websocket Routing Filter |
| 8 | The Websocket Routing Filter |
| 9 | The Gateway Metrics Filter |
1.4 自定义过滤器
- 创建自定义过滤器
com.xyz.gateway.filters.MyFilter
@Component
@Log4j2
public class MyFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("自定义全局过滤器-MyFilter");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
1.5 权限认证
- 修改MyFilter,判断请求参数中是否包含access-token,若包含继续处理,若不包含则返回
@Component
@Log4j2
public class MyFilter implements GlobalFilter, Ordered {
/**
* 认证鉴权:判断请求参数中是否包含access-token,若包含继续处理,若不包含直接返回
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("自定义全局过滤器-MyFilter");
String token = exchange.getRequest().getQueryParams().getFirst("access-token");
if ( token == null) {
log.info("没有登录");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
- 测试,请求
http://localhost:6101/product/provider/list?access-token=100返回成功; 请求http://localhost:6101/product/provider/list返回未登录