SpringCloud Gateway工作流程

Spring Cloud Gateway的工作流程

Spring Cloud Gateway Diagram

具体的流程:

  1. 用户发送请求到网关

  2. 请求断言,用户请求到达网关后,由Gateway Handler Mapping(网关处理器映射)进行Predicates(断言),看一下哪一个符合路由规则,选择对应的过滤器进行处理

    spring:
      cloud:
        gateway:
          routes:
            - id: api_route
              uri: http://localhost:8123
              predicates:
                - Path=/api/**
           filters:
            - 'AddRequestHeader=token,wahahaawahaha'
    

    上面是使用application.yml对网关进行路由规则的制定

    1. - id: api_route: 这是路由的标识符。这只是一个名称,可以是任何描述性的名称
    2. uri:http//localhost:8123是表示请求要转发的路径
    3. predicates:断言,比如指定了- Path=/api/**,任何到达网关的请求,如果请求资源定位符是/api/开头的都会进行匹配
    4. 例如:网关的端口是8090,我发送请求http://localhost:8090/api/hello,那么网关就会将请求转发到http://localhost:8123/api/hello,但是转发之前会经过filters,例如上面的AddRequestHeader=source,api,会在请求头加一个<source,api>
  3. 请求过滤:请求到达Gateway Web Handler,里面有很多Filter(过滤器),多个Filter像一个Chain(链条)一样串起来,符合路由断言的请求会先后经过这些Filter进行处理,在FIlter中可以进行限流、访问控制、参数校验、添加请求头等

  4. 服务处理:如果请求经过所有FIlter无异常,会将请求转发给真正的后端进行处理

  5. 响应过滤:后端处理完结果后,返回给Gateway的过滤器再次做处理,逻辑上可以称为 Post-Filters

总结:客户端的请求先通过匹配规则找到合适的路由,就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。

常见路由断言规则

Spring Cloud GateWay 路由断言规则

自定义过滤器

如果要定义的过滤器比较复杂,可以使用自定义过滤器

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 获取请求头
        ServerHttpRequest request = exchange.getRequest();
        String path = INTERFACE_HOST + request.getPath().value();
        String method = request.getMethod().toString();
        log.info("请求唯一标识:" + request.getId());
        log.info("请求路径:" + path);
        log.info("请求方法:" + method);
        log.info("请求参数:" + request.getQueryParams());
        String sourceAddress = request.getLocalAddress().getHostString();
        log.info("请求来源地址:" + sourceAddress);
        log.info("请求来源地址:" + request.getRemoteAddress());
        ServerHttpResponse response = exchange.getResponse();
        // 2. 访问控制 - 黑白名单
        if (!IP_WHITE_LIST.contains(sourceAddress)) {
            response.setStatusCode(HttpStatus.FORBIDDEN);
            return response.setComplete();
        }
        // 3. 用户鉴权
        return chain.filter(exchange);

    }


   // 设置order调用顺序
    @Override
    public int getOrder() {
        return -1;
    }

    public Mono<Void> handleNoAuth(ServerHttpResponse response) {
        response.setStatusCode(HttpStatus.FORBIDDEN);
        return response.setComplete();
    }

    public Mono<Void> handleInvokeError(ServerHttpResponse response) {
        response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        return response.setComplete();
    }
}

其实学习SpringCloud Gateway就是进行一些配置,没有什么资料比官方更丰富,所以强烈建议去看官方文档:官方文档

相关推荐

  1. SpringCloudGateway

    2024-03-21 07:16:06       25 阅读
  2. 测试的工作流程

    2024-03-21 07:16:06       57 阅读
  3. GIT工作流程总结

    2024-03-21 07:16:06       51 阅读
  4. Redux 的工作流程

    2024-03-21 07:16:06       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 07:16:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 07:16:06       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 07:16:06       82 阅读
  4. Python语言-面向对象

    2024-03-21 07:16:06       91 阅读

热门阅读

  1. k8s污点去除

    2024-03-21 07:16:06       38 阅读
  2. kafka流式处理中aggregate()方法--笔记

    2024-03-21 07:16:06       40 阅读
  3. js 实现合并重复数据

    2024-03-21 07:16:06       36 阅读
  4. rk3568 安卓11双屏异显,隐藏副屏的导航栏

    2024-03-21 07:16:06       63 阅读
  5. 51单片机蜂鸣器

    2024-03-21 07:16:06       36 阅读
  6. Github 2024-03-20 C开源项目日报 Top8

    2024-03-21 07:16:06       35 阅读
  7. rsync+inotify实现实时同步

    2024-03-21 07:16:06       31 阅读
  8. Hive自定义UpperGenericUDF函数

    2024-03-21 07:16:06       40 阅读
  9. 3.19号arm

    2024-03-21 07:16:06       43 阅读