网关的配置项回顾

  1. 路由:是网关的基本单元,由IDURI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发
  2. route组成部分
  3. id:路由的ID
  4. uri:匹配路由的转发地址
  5. predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
  6. order:路由的优先级,数字越小,优先级越高。

交互流程

image.png

  • 客户端向Spring Cloud Gateway发出请求
  • 如果网关处理程序映射确定请求与路由匹配
  • 则将其发送到网关Web处理程序
  • 通过特定过滤器链运行,前置处理-后置处理

什么是Gateway路由断言

  1. Predicate 来源于Java8,接受输入参数,返回一个布尔值结果
  2. Spring Cloud Gateway Spring 利用 Predicate 的特性实现了各种路由匹配规则
  3. 转发的判断条件,SpringCloud Gateway支持多种方式,常见如:PathQueryMethodHeader
  4. 支持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发

内置路由断言介绍 RoutePredicateFactory 接口实现类

image-20200910144246781.png

参数编写规则 XXXRoutePredicateFactory,使用XXX作为参数配置

  1. predicates:
  2. - Host=
  3. - Path=
  4. - Method=
  5. - Header=
  6. - Query=
  7. - Cookie=

需求:接口需要在指定时间进行下线,过后不可以在被访问

  1. 使用Before ,只要当前时间小于设定时间,路由才会匹配请求
  2. 8区的2020-09-11T01:01:01.000+08:00后,请求不可访问
  3. 为了方便测试,修改时间即可
  4. predicates:
  5. - Before=2020-09-09T01:01:01.000+08:00

网关过滤器

过滤器生命周期

  • PRE: 这种过滤器在请求被路由之前调用,一般用于鉴权、限流等
  • POST:这种过滤器在路由到微服务以后执行,一般用于修改响应结果,比如增加header信息、打点结果日志

网关过滤器分类

  • 局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 结尾
  • 全局过滤器:作用全部路由上

Gateway全局过滤器实现用户鉴权

  1. //自定义全局过滤器实现鉴权
  2. @Component
  3. public class UserGlobalFilter implements GlobalFilter,Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. String token = exchange.getRequest().getHeaders().getFirst("token");
  7. System.out.println(token);
  8. if(StringUtils.isBlank(token)){
  9. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  10. return exchange.getResponse().setComplete();
  11. }
  12. //继续往下执行
  13. return chain.filter(exchange);
  14. }
  15. //数字越小,优先级越高
  16. @Override
  17. public int getOrder() {
  18. return 0;
  19. }
  20. }
  21. 路径:http://localhost:8888/order-server/api/v1/video_order/list?source=wechat

注意:网关不要加太多业务逻辑,否则会影响性能,务必记住