1、请求流程
- 1.客户端向Spring Cloud Gateway发出请求。
- 2.网关处理程序映射确定请求与路由匹配
- 3.过滤器过滤请求。
- 4.服务端处理请求
- 5.过滤器处理响应请求
- 6.网关路由处理响应请求
- 7.响应到客户端
2、自定义谓词
例如:
- 自定义谓词CustomPredicate:有2个参数
-
点击配置文件中“routes”进入RouteDefinition后进入PredicateDefinition类中,查看当前包下AbstractRoutePredicateFactory接口的层次结构,可以发现,在第一篇文章中所示的11个谓词类。
-
分析谓词类可得规则
-
代码
@Slf4j @Component public class CustomPredicateRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomPredicateRoutePredicateFactory.Config> { public CustomPredicateRoutePredicateFactory () { // 传入bean super(CustomPredicateRoutePredicateFactory.Config.class); } /** *参数值 */ @Override public List<String> shortcutFieldOrder() { // 与参数bean一一对应 return Arrays.asList("startTime", "endTime"); } /** * ServerWebExchange:相当于当前请求和响应的上下文 * @param config 参数类 * @return */ @Override public Predicate<ServerWebExchange> apply (Config config) { // 路由判断是否符合 此处根据自己的场景处理返回true或false就可以 return exchange -> { System.out.println(config.getStartTime()); System.out.println(config.getEndTime()); return true; }; } /** * 几个参数bean中就有几个对象 */ @Data public static class Config { private LocalTime startTime; private LocalTime endTime; } }
-
配置类谓词:CustomPredicate=下午10:11, 下午11:20
3、自定义过滤器
同谓词配置相似
随便找几个过滤器发现大部分都是继承AbstractNameValueGatewayFilterFactory来实现过滤器的
代码如下
@Slf4j
@Component
public class CustomGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return (ServerWebExchange exchange, GatewayFilterChain chain) -> {
// config.getName() 对应的是配置文件中filter中的key
log.info("请求网关,filter.key={}, filter.value={}", config.getName(), config.getValue());
// 继续执行其他filter
return chain.filter(exchange);
};
}
}
配置文件如图:- Custom=prefix, gateway
3、自定义全局过滤器
-
全局filter 会作用于所有路由(走满足要求的全局filter)
-
全局filter有执行顺序,通过getOrder()方法的返回值决定执行顺序,数值越小越靠前执行;
-
定义成spring的bean对象就会生效
代码如下
@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("自定义全局Filter请求.url={}",exchange.getRequest().getURI());
//业务逻辑
// 继续执行其他全局filter
return chain.filter(exchange);
}
/**
* 定义的filter执行的顺序,越小越优先执行
* @return
*/
@Override
public int getOrder() {
return 0;
}
}