Gateway断言工厂配置

一、路由配置方式

路由配置方式:

  • 基于代码的的配置方式
  • 基于真实 URI的配置方式
  • 基于微服务 URI的配置方式

下面示例最常用的基于微服务URI的配置方式。

1、Gateway与注册中心相结合的路由配置方式

路由是网关配置的基本组成模块,在 uri的 schema协议部分为自定义的 lb://类型

lb://类型:表示从微服务注册中心(如Nacos)订阅服务,并且进行服务的路由。lb 整合负载均衡器ribbon,loadbalancer。

入门示例的配置如下:

server:
  port: 18088
spring:
  application:
    name: app-gateway

  #配置 nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.xxx.xxx:8848

    #配置 gateway网关
    gateway:
      #设置路由:路由id、路由到微服务的uri、断言
      routes:
        # app-order服务路由配置
        - id: app-order  #路由ID,全局唯一,建议配置服务名。
          uri: lb://app-order  #lb 整合负载均衡器ribbon,loadbalancer
          predicates:
            - Path=/order/**   # 断言,路径相匹配的进行路由
        # app-user服务路由配置
        - id: app-user
          uri: lb://app-user
          predicates:
            - Path=/app-api/app-user/user/**
          filters:
            # 删除前缀:1代表去除第一个路径
            - StripPrefix=1

二、路由断言工厂配置

Spring Cloud Gateway 是通过 Spring WebFlux 的 HandlerMapping 做为底层支持来匹配到转发路由,Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。

Gateway网关服务启动之后,通过日志可以查看内置路由断言工厂:

在这里插入图片描述

1、Predicate介绍

Predicate(断言):判断请求是否符合要求,符合则转发到路由目的地URI。
这是Java 8中的一个断言函数,断言函数的输入类型是 Spring5框架中的 ServerWebExchange。断言函数允许开发者定义匹配来自 Http request中的任何内容,例如 headers 或参数。如果断言为真,则说明请求的URL和配置的路由匹配。

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。

下面使用一下 Spring Cloud GateWay 内置几种 Predicate。

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

2、通过 Path路径匹配

当请求的路径为 /order/** 时,转发到 app-order微服务上。

    #配置 gateway网关
    gateway:
      #设置路由:路由id、路由到微服务的uri、断言
      routes:
        # app-order服务路由配置
        - id: app-order  #路由ID,全局唯一,建议配置服务名。
          uri: lb://app-order  #lb 整合负载均衡器ribbon,loadbalancer
          predicates:
            - Path=/order/**   # 断言,路径相匹配的进行路由

3、通过请求参数匹配

Query Route Predicate 支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。

    #配置 gateway网关
    gateway:
      #设置路由:路由id、路由到微服务的uri、断言
      routes:
        # app-order服务路由配置
        - id: app-order  #路由ID,全局唯一,建议配置服务名。
          uri: lb://app-order  #lb 整合负载均衡器ribbon,loadbalancer
          predicates:
            - Path=/order/**   # 断言,路径相匹配的进行路由
            - Query=username
  • Query=username:表示只要请求中包含 username 属性的参数即可匹配路由。
  • Query=username, zhaoyun:当请求中包含username属性并且参数值是为 zhaoyun才会进行匹配和路由。

4、通过 Header属性匹配

Header Route Predicate可以接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配时则执行。

    #配置 gateway网关
    gateway:
      #设置路由:路由id、路由到微服务的uri、断言
      routes:
        # app-order服务路由配置
        - id: app-order  #路由ID,全局唯一,建议配置服务名。
          uri: lb://app-order  #lb 整合负载均衡器ribbon,loadbalancer
          predicates:
            - Path=/order/**   # 断言,路径相匹配的进行路由
            - Header=X-Request-Id, \d+  # Header匹配 请求中带有请求头名为 x‐request‐id,其值与 \d+ 正则表达式匹配

在这里插入图片描述

5、通过 Cookie 匹配

Cookie Route Predicate 可以接收两个参数,一个是 Cookie name,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

    #配置 gateway网关
    gateway:
      #设置路由:路由id、路由到微服务的uri、断言
      routes:
        # app-order服务路由配置
        - id: app-order  #路由ID,全局唯一,建议配置服务名。
          uri: lb://app-order  #lb 整合负载均衡器ribbon,loadbalancer
          predicates:
            - Cookie=sessionId, testCookie

在这里插入图片描述

6、通过 Host 匹配

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用 .号作为分隔符。它通过请求头中的主机地址作为匹配规则。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

7、通过请求方法匹配

可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

其他路由,查看官方文档。

  • After 时间路由
  • Before 时间路由
  • Between 时间区间路由
  • Weight 权重路由

有兴趣可以查看每一个断言工厂(xxxRoutePredicateFactories)的源码处理逻辑。
在这里插入图片描述

– 求知若饥,虚心若愚。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值