Gateway核心架构

1 Gateway核心架构

1.1 基本概念

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

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

1.2 执行流程

Gateway核心架构_第1张图片

执行流程大体如下:
(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:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
routes:
-id: weight_route1 uri: host1 predicates:
-Path=/product/**
-Weight=group3, 1
-id: weight_route2 uri: host2 predicates:
-Path=/product/**
-Weight= group3, 9

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

server:
port: 7000
spring:
application:
 name: api-gateway
cloud:
 nacos:
  discovery:
   server-addr: 127.0.0.1:8848
 gateway:
  discovery:
   locator:
    enabled: true
  routes:
   - id: product_route
    uri: lb://service-product
    predicates:
     - Path=/product-serv/**
     - Before=2019-11-28T00:00:00.000+08:00 #限制请求时间在2019-11-28之前
     - Method=POST #限制请求方式为POST
    filters:
     - StripPrefix=1

你可能感兴趣的:(gateway,架构,linux)