Spring Cloud Gateway断言工厂

SpringCloud视频教程:

https://ke.qq.com/course/2805647?tuin=a3e3fb1&from_uin=171851697&from=1000201007

个人博客纯净版

http://www.51ufo.cn/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%88%86%E5%B8%83%E5%BC%8F/2020/07/11/SpringCloud%E5%85%A5%E9%97%A817-Spring-Cloud-Gateway%E6%96%AD%E8%A8%80%E5%B7%A5%E5%8E%82.html

通过前面的学习,大家已经对Spring Cloud Gateway的功能有一个初步的认识,网关作为一个系统的流量的入口,有着举足轻重的作用,通常的作用如下:

  • 协议转换,路由转发
  • 流量聚合,对流量进行监控,日志输出 = 作为整个系统的前端工程,对流量进行控制,有限流的作用
  • 作为系统的前端边界,外部流量只能通过网关才能访问系统
  • 可以在网关层做权限的判断
  • 可以在网关层做缓存

route.png

如上图所示,客户端向Spring Cloud Gateway发出请求。 如果Gateway Handler Mapping确定请求与路由匹配(这个时候就用到predicate),则将其发送到Gateway web handler处理。 Gateway web handler处理请求时会经过一系列的过滤器链。 过滤器链被虚线划分的原因是过滤器链可以在发送代理请求之前或之后执行过滤逻辑。 先执行所有“pre”过滤器逻辑,然后进行代理请求。 在发出代理请求之后,收到代理服务的响应之后执行“post”过滤器逻辑。这跟zuul的处理过程很类似。在执行所有“pre”过滤器逻辑时,往往进行了鉴权、限流、日志输出等功能,以及请求头的更改、协议的转换;转发之后收到响应之后,会执行所有“post”过滤器的逻辑,在这里可以响应数据进行了修改,比如响应头、协议的转换等。

在上面的处理过程中,有一个重要的点就是讲请求和路由进行匹配,这时候就需要用到predicate,它是决定了一个请求走哪一个路由。

Spring Cloud Gateway 内置了许多路由断言工厂,可以通过配置的方式直接使用,也可以组合使用多个路由断言工厂。接下来为大家介绍几个常用的路由断言工厂类。

1)Path 路由断言工厂

Path 路由断言工厂接收一个参数,根据 Path 定义好的规则来判断访问的 URI 是否匹配。

spring:
  cloud:
    gateway:
      routes:
      - id: baidu
        predicates:   #断言
        - Path=/baidu
        uri: http://www.baidu.com  #目标服务地址

如果请求路径为 /baidu,则此路由将匹配

2)Query 路由断言工厂

Query 路由断言工厂接收两个参数,一个必需的参数和一个可选的正则表达式。

spring:
  application:
    name: service-gateway
  cloud:
    gateway:
      routes:
      - id: query_route
        predicates:
        - Query=foo, ba.
        uri: http://c.biancheng.net

如果请求包含一个值与 ba 匹配的 foo 查询参数,则此路由将匹配。bar 和 baz 也会匹配,因为第二个参数是正则表达式。

在浏览器请求 http://localhost?foo=baz 会转发到 http://c.biancheng.net 目标服务

3)Method 路由断言工厂

Method 路由断言工厂接收一个参数,即要匹配的 HTTP 方法。

spring:
  application:
    name: service-gateway
  cloud:
    gateway:
      routes:
      - id: method_route
        predicates:
        - Method=GET
        uri: http://jd.com

4)Header 路由断言工厂

Header 路由断言工厂接收两个参数,分别是请求头名称和正则表达式。

spring:
  application:
    name: service-gateway
  cloud:
    gateway:
      routes:
      - id: header_route
        predicates:
        - Header=X-Request-Id, \d+
        uri: http://example.org

如果请求中带有请求头名为 x-request-id,其值与 \d+ 正则表达式匹配(值为一个或多个数字),则此路由匹配。

如果你想学习更多路由断言工厂的用法,可以参考官方文档进行学习。

本文代码git地址 https://gitee.com/xmingtx/springcloud-lesson.git

### 关于Spring Cloud Gateway断言的使用方法 #### 断言的概念及其重要性 在微服务架构中,路由规则对于流量管理和负载均衡至关重要。Spring Cloud Gateway 提供了一套强大的路由断言机制来实现这一目标[^3]。 #### 基本语法结构 定义一个简单的路径匹配断言语法如下所示: ```yaml spring: cloud: gateway: routes: - id: sample_route uri: http://example.com predicates: - Path=/sample/** ``` 此配置表示当接收到的目标URL路径以`/sample/`开头时,则该请求会被转发到指定URI `http://example.com`上处理[^5]。 #### 复杂条件组合 除了基本路径外,还可以利用其他类型的谓词来进行更精细控制,比如查询参数、HTTP头信息等。下面是一个综合运用多种断言的例子: ```yaml predicates: - Method=GET - Query=name, Jack - Header=X-Request-ID, \d+ - Cookie=username, admin ``` 上述设置意味着只有满足所有给定条件(即请求方式为GET、存在名为name且值为Jack的查询字符串、带有X-Request-ID正则表达式的头部以及username=admin的Cookie)的情况下才会触发相应的路由行为。 #### 动态调整与服务发现集成 得益于内置的支持,Spring Cloud Gateway能够轻松地同诸如Eureka之类的服务注册中心协同工作,从而允许基于实例ID或其他元数据创建更加智能灵活的路由策略[^2]。 例如,在知道具体IP地址的前提下也可以按照服务名称进行定向分发: ```yaml uri: lb://service-name ``` 这里lb代表负载平衡器前缀,它会自动解析出对应服务下的可用节点列表并随机选取其一作为实际访问对象。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值