Spring Cloud Gateway 执行流程解读

版本:2.2.9.RELEASE

一、基本介绍与简单使用
什么是网关?

网关是整个微服务 API 请求的入口,负责拦截所有请求,分发到服务上去。可以实现日志拦截、权限控制、解决跨域问题、限流、熔断、负载均衡,隐藏服务端的ip,黑名单与白名单拦截、授权等,常用的网关有 Zuul (netflix 已经停更)和 SpringCloud Gateway。SpringCloud Gateway是一个全新的项目,其基于 Spring5.0 以及 SpringBoot2.0 和 Webflux 等技术开发的网关,其主要的目的是为微服务架构提供一种简单有效的API路由管理方式。

名词解释

​ 官方:

  • Route: 组成网关的最基本模块,由路由 ID(确保唯一)、目标 URI、predicates 与 filters 集合组成,如果 predicate 为 true,则表示路由匹配,并访问目标 URI。

  • Predicate: 这是一个 Java 8 的 Predicate,入参为 Spring 框架的 ServerWebExchange,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。

  • Filter: GatewayFilter 的实例,可以在发送下游请求之前或之后修改请求和响应。

    白话:

    元素 概念 作用
    Route 网关的基本组成,由路由id(唯一)以及一系列的断言与过滤器组成 根据断言转发到对应的 uri 上,支持注册中心
    Predicate 断言目前 SpringCloud Gateway 支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式 路由转发的判断条件
    Filter 过滤器是路由转发请求时所经过的过滤逻辑 可用于修改请求、响应内容;如 日志记录获取请求与响应内容

    img

    Example application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: reform-pinoint
            uri: lb://reform-pinpoint
            predicates:
            - Path=/app/pinpoint/**
            filters:
            - RewritePath=/app/pinpoint/(?<remaining>.*), /${
         remaining}
    

    上面配置的意思是当访问 http://localhost:18000/app/pinpoint/login 时,会被路由到 reform-pinpoint 服务的 login 接口。filters 配置了一个重写路径的方法,将原本访问 http://localhost:18000/app/pinpoint/login 的 URL 修改为 http://localhost:18000/login,否则如果 reform-pinpoint 没有 /app/pinpoint/login 这个 URI 时将会出现 404。

    上面的配置有一点其实是有错误的,在 yml 文档中 $ 要写成 $\ ,因此 ${remaining} 应该改为 $\ {remaining}

    更多配置请参考:Gateway Config

二、整体流程
  1. 请求处理流程 UML 图

    从 UML 图可以看得出来 gateway 使用了与 Spring Mvc 类似的处理逻辑,即适配器模式;先从 Mapping 中匹配到适配器,然后使用适配器调用 handler。

image-20220315174139579

  1. 官网流程图

    Spring Cloud Gateway Diagram

  2. 针对路由的 UML 时序图

    image-20220316100238324

    整体流程是:

    • 请求从 DispatcherHandler 进来
    • 循环遍历所有的 HandlerMapping 并找到合适的 Handler(可能有多个)
    • 遍历所有的适配器 Adapter,找到能够支持执行 Handler 的适配器
    • 通过适配器 Adapter 去执行 Handler
    Talk is cheap. Show me the code.
    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
         
        if (this.handlerMappings == null) {
         
            return createNotFoundError();
        }
        // 遍历所有 HandlerMapping 并找到处理器适配器,再执行 handler
        return Flux.fromIterable(this.handlerMappings)
            .concatMap(mapping -> mapping
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值