gateway介绍

gateway相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求通过gateway后由定义的路由和断言进行转发,路由代表需要转发请求的地址,断言相当于请求这些地址时所满足的条件,只有同时符合路由和断言才给予转发。

一、鉴权

我们在gateway服务定义了一组过滤器其图如下:

在这里插入图片描述

在所有的客户端请求在经过gateway时,都会被拦截下来,并进行统一的权限判断处理,校验权限信息,如果不通过会返回指定结果,当然也可以在代码中定义指定的路径不受权限的控制。

1、实现方式:

通过实现GlobalFilter和Ordered这两个接口中的filter(进行全局过滤)和getOrder(指定过滤器的优先级)方法

其中,FilterChain维护了一个链表,链表中存放着配置对象的链条,每次用户调用 一次chain.doFilter(request, response),链表就去取下一个配置对象,再通过配置对象 得到下一个filter,然后调用该filter,接着在filter里写的逻辑就被执行了。

public class AuthFilterTest implements GlobalFilter, Ordered {
    /**
     * @description  过滤器执行方法
     * @param exchange 前后端交互信息,包括request与response
     * @param chain 过滤器链
     * @return 下个过滤器直到过滤器结束或者校验不通过返回结果
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 开始执行鉴权方法
        doCheckAuth(exchange);
        // 调用下个过滤器(过滤器是基于函数回调)
        return chain.filter(exchange);
    }

    /**
     * @description 定义过滤器优先级,数字越小优先级约高,可以为负数
     * @return 
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
2、验证登录实现方式

在gateway的拦截器中拦截到请求后,对请求进行权限验证,
1)、判断该接口是否携带token的请求头信息
String token = exchange.getRequest().getHeaders().getFirst(“Authorization”);
2)、如果没有则跳去登录页面进行 登录获取token信息,如果有则开始校验token信息
3)、传入token与请求路径,根据token去redis中获取登录信息包括手机号姓名等一些基本信息,再根据手机号去redis中当做key去获取相关权限信息
4)、如果同个账号多次登录则会在redis中手机号码对应的value会更新token的值(手机号对应的value是hash类型。)
5)、如果接口权限包含请求路径则放行
大致流程如下:
在这里插入图片描述

3、附加知识

1)、执行顺序与性能
执行顺序过滤器>>拦截器>>aop ,拦截器与aop类似,都是基于反射机制而过滤器是基于函数回调,依赖selevet容器。拦截规则越来越细致,执行顺序依次是过滤器、拦截器、切面。一般情况下数据被过滤的时机越早对服务的性能影响越小,因此我们在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。比如权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验
2)、拦截器与过滤器的区别
–过滤器基于函数回调,拦截器是基于java的反射
–过滤器可以拦截所有请求(包括静态资源的请求),拦截器只能拦截action请求(不包含静态资源)
–拦截器在action的生命周期内是可以多次调用,而过滤器只在容器初始化时被调用一次。
–过滤器是包裹在拦截器之外
–拦截器可以访问action的上下文,值栈里面的对象,而过滤器不行
3)、过滤器与拦截器用途
– 过滤器用于比如设置字符编码,鉴权操作等
–拦截器颗粒比过滤器要细可用于日志输出、请求参数安全验证等

二、路由

概述:
gateway根据路由与断言去转发请求到指定的服务,gateway服务中的配置文件中配置

spring:
 cloud:
  gateway:
     routes:
        #唯一识别号 ,例:请求 http://localhost:6001/tool/test/get 会转发到tool-service-ly服务的test/get 接口
        - id: TOOL-SERVICE-ly 
          #在服务注册中心找服务名为 tool-service-ly的服务
          uri: lb://tool-service-ly 
           #设置路由断言,代理servicerId为TOOL-SERVICE-ly的   /tool/* 路径
          predicates:
            - Path=/tool/**    
          #前缀, 在当前路径匹配中表示去掉第一个前缀 /tool 即请求从/tool/test/get 变成 /test/get
          filters:
            - StripPrefix=1     

三、灰度发布、限流

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐