Spring cloud gateway
配置拆解
route
路由
predicte
断言(谓词),用于简单的验证
- path:路径校验
- head:header校验,可以校验header中的任意参数
- host:只校验请求头中的host参数
- query:请求query参数校验
- method:请求方法校验
- remoteAdress:客户端地址校验
- cookies: cookies校验
- before/after/between:请求时间校验
- weight:指定相同的group,在group内做负载均衡
predicates的可选值看gatewayPredicte的实现类有哪些,取前缀部分
filter
过滤器,加header、parameter
同一个filter可指定多个,例如addRequestHeader可以指定两次,用于添加两个请求头
- addRequestHeader:添加请求头
- addRequestParam:添加请求参数
- FallbackHeaders:可以添加降级时的异常信息
filter的可选值看filterDefination的实现类有哪些,取前缀部分
过滤器有两类:全局过滤器和路由过滤器
全局过滤器
全局过滤器,不需要配置,对所有路由都生效
可以用来实现统一的权限校验、日志记录等能力
自定义全局过滤器示例:
路由过滤器
可以自定义过滤器,在路由策略中配置使用
@Component
public class RequestPathGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> {public RequestPathGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String path = exchange.getRequest().getPath().toString();System.out.println("path: " + path + ", config: " + config);return chain.filter(exchange);}};}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name", "path");}@Setter@Getterpublic static class Config {private String name;private String path;}
}
application.yml配置
filter根据order排序,order小的先执行
Spring Cloud Gateway通过执行过滤器将逻辑分为“前置”和“后置”阶段,优先级较高的前置过滤器会优先被执行,而优先级较高的后置过滤器的执行顺序正好相反,最后执行。
动态路由
- 通过SpringCloudGateway提供的
GatewayControllerEndpoint端点功能,实现路由的增删改查 , 或者自己实现 ApplicationEventPublisherAware 接口,实现自定义的路由操作方法。具体可以参考源码
- 通过实现RouteDefinitionRepository接口,实现自定义的Repository类,实现从数据库或者缓存中动态加载路由信息的功能
示例
请求/baidu时,转发请求给baidu.com
方式一:yml配置文件
方式二:代码配置
源码
Spring Cloud Gateway中使用HandlerMapping对请求的链接进行解析,匹配对应的Route,转发到对应的服务。下图为整个请求的流程 , 用 户 请 求 先 通 过 DispatcherHandler 找 到 对 应 的GatewayHandlerMapping,再通过GatewayHandlerMapping解析匹配到的Handler;Handler处理完后,经过Filter处理,最终将请求转发到后端服务。
最后一个handler是ForwardRoutingFilter