• Gateway核心架构


    1 Gateway核心架构

    1.1 基本概念

            路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:

    • id,路由标识符,区别于其他 Route。
    • uri,路由指向的目的地 uri,即客户端请求最终被转发到的微服务。
    • order,用于多个 Route 之间的排序,数值越小排序越靠前,匹配优先级越高。
    • predicate,断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。
    • filter,过滤器用于修改请求和响应信息。

    1.2 执行流程

    执行流程大体如下:
    (1) Gateway Client向Gateway Server发送请求
    (2) 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
    (3)然后网关的上下文会传递到DispatcherHandler,它负责将请求分发RoutePredicateHandlerMapping
    (4) RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
    (5)如果过断言成功,由FilteringWebHandler创建过滤器链并调用

    (6)请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应

    2 断言

    Predicate(断言, 谓词) 用于进行条件判断,只有断言都返回真,才会真正的执行路由。
    断言就是说: 在 什么条件下 才能进行路由转发

    2.1 内置路由断言工厂

            SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:

    • 基于Datetime类型的断言工厂

            此类型的断言根据时间做判断,主要有三个:
            AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
            BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
            BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内

    -After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]

    • 基于远程地址的断言工厂 RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中

    -RemoteAddr=192.168.1.1/24

    • 基于Cookie的断言工厂
      CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
      cookie是否具有给定名称且值与正则表达式匹配。
    -Cookie=chocolate, ch.
    • 基于Header的断言工厂
      HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。
    -Header=X-Request-Id, \d+
    • 基于Host的断言工厂
      HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
    -Host=**.testhost.org
    • 基于Method请求方法的断言工厂
      MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
    -Method=GET
    • 基于Path请求路径的断言工厂
    -Path=/foo/{segment}


    PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。

    • 基于Query请求参数的断言工厂
      QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
    -Query=baz, ba.
    • 基于路由权重的断言工厂
      WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
    1. routes:
    2. -id: weight_route1 uri: host1 predicates:
    3. -Path=/product/**
    4. -Weight=group3, 1
    5. -id: weight_route2 uri: host2 predicates:
    6. -Path=/product/**
    7. -Weight= group3, 9

    内置路由断言工厂的使用
    接下来我们验证几个内置断言的使用:

    1. server:
    2. port: 7000
    3. spring:
    4. application:
    5.  name: api-gateway
    6. cloud:
    7.  nacos:
    8.   discovery:
    9.    server-addr: 127.0.0.1:8848
    10.  gateway:
    11.   discovery:
    12.    locator:
    13.     enabled: true
    14.   routes:
    15.    - id: product_route
    16.     uri: lb://service-product
    17.     predicates:
    18.      - Path=/product-serv/**
    19.      - Before=2019-11-28T00:00:00.000+08:00 #限制请求时间在2019-11-28之前
    20.      - Method=POST #限制请求方式为POST
    21.     filters:
    22.      - StripPrefix=1

  • 相关阅读:
    MySQL——进阶操作
    【Apache Spark 】第 5 章Spark SQL 和 DataFrames:与外部数据源交互
    基于PHP+MySQL的养老院管理系统
    【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!
    Android发布依赖到 Jitpack
    基于AERMOD模型在大气环境影响评价中的实践
    当黑客遇到电脑白痴
    Rycky9.0安装k8s1.25.0+containerd
    Ubuntu上搭建FTP服务
    如果再来一次,你还会选择互联网么?
  • 原文地址:https://blog.csdn.net/Lj_chuxuezhe/article/details/132804381