你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何将 VMware Spring Cloud 网关路由筛选器与 Azure Spring Apps 企业计划配合使用

注意

从 2025 年 3 月中旬开始,基本、标准和企业计划将弃用,停用期为三年。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

从 2024 年 9 月 30 日开始,标准消耗和专用计划将弃用,六个月后将完全关闭。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:❌ 基本版/标准版 ✔️ 企业版

本文介绍如何将 VMware Spring Cloud 网关路由筛选器与 Azure Spring Apps 企业计划配合使用,将请求路由到应用程序。

VMware Spring Cloud 网关是一个基于开源 Spring Cloud 网关项目的商业 VMware Tanzu 组件。 Spring Cloud 网关处理 API 开发团队的横切关注点,例如单一登录 (SSO)、访问控制、速率限制、复原能力、安全性等。 你可以使用新式云本机模式以及你为 API 开发选择的任何编程语言来加速 API 交付。

VMware Spring Cloud 网关包括以下功能:

  • 动态路由配置,独立于无需重新编译即可应用和更改的单个应用程序。
  • 用于将授权的 JSON Web 令牌 (JWT) 声明传输到应用程序服务的商业 API 路由筛选器。
  • 客户端证书授权。
  • 速率限制方法。
  • 断路器配置。
  • 支持通过 HTTP 基本身份验证凭据访问应用程序服务。

为了与适用于 VMware Tanzu 的 API 门户集成,VMware Spring Cloud 网关会在任何路由配置增添或变更后自动生成 OpenAPI 版本 3 文档。 有关详细信息,请参阅使用适用于 VMware Tanzu 的 API 门户

先决条件

使用筛选器

使用 Spring Cloud Gateway 配置中的筛选器来处理传入请求或对路由配置的传出响应。

例如,可以使用筛选器添加 HTTP 标头或基于授权令牌拒绝访问。

使用开放源代码筛选器

Spring Cloud 网关 OSS 包括几个用于为路由创建筛选器的 GatewayFilter 中心。 以下部分会介绍这些中心。

AddRequestHeader

AddRequestHeader 中心将标头添加到下游请求的所有匹配请求的标头。

此中心接受以下配置参数:

  • name
  • value

以下示例配置了一个 AddRequestHeader 中心,该中心将标头 X-Request-red:blue 添加到下游请求的所有匹配请求的标头:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AddRequestHeader=X-Request-red, blue"
        ]
    }
]

AddRequestHeader 中心有权访问用于匹配路径或主机的 URI 变量。 可以在值中使用 URI 变量,并在运行时扩展变量。

以下示例配置了使用变量的 AddRequestHeader 中心:

[
    {
        "predicates": [
            "Path=/api/{segment}"
        ],
        "filters": [
            "AddRequestHeader=X-Request-red, blue-{segment}"
        ]
    }
]

AddRequestHeadersIfNotPresent

AddRequestHeadersIfNotPresent 中心会在原始请求中不存在标头时添加标头。

此中心接受以下配置参数:

  • headers:键值对(标头名称、标头值)的逗号分隔列表。

以下示例配置了 AddRequestHeadersIfNotPresent 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AddRequestHeadersIfNotPresent=Content-Type:application/json,Connection:keep-alive"
        ]
    }
]

AddRequestParameter

AddRequestParameter 中心将参数添加到下游请求的所有匹配请求的查询字符串中。

此中心接受以下配置参数:

  • name
  • value

以下示例配置了一个 AddRequestParameter 中心,该中心将 red=blue 参数添加到下游请求的所有匹配请求的查询字符串中:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AddRequestParameter=red, blue"
        ]
    }
]

AddRequestParameter 中心有权访问用于匹配路径或主机的 URI 变量。 可以在值中使用 URI 变量,并在运行时扩展变量。

以下示例配置了使用变量的 AddRequestParameter 中心:

[
    {
        "predicates": [
            "Path=/api/{segment}"
        ],
        "filters": [
            "AddRequestParameter=foo, bar-{segment}"
        ]
    }
]

AddResponseHeader

AddResponseHeader 中心将标头添加到下游响应的所有匹配请求的标头中。

此中心接受以下配置参数:

  • name
  • value

以下示例配置了一个 AddResponseHeader 中心,该中心将 X-Response-Red:Blue 标头添加到下游响应的所有匹配请求的标头:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AddResponseHeader=X-Response-Red, Blue"
        ]
    }
]

AddResponseHeader 中心有权访问用于匹配路径或主机的 URI 变量。 可以在值中使用 URI 变量,并在运行时扩展变量。

以下示例配置了使用变量的 AddResponseHeader 中心:

[
    {
        "predicates": [
            "Path=/api/{segment}"
        ],
        "filters": [
            "AddResponseHeader=foo, bar-{segment}"
        ]
    }
]

CircuitBreaker

CircuitBreaker 中心将路由包装在断路器中。

此中心接受以下配置参数:

  • name:断路器名称。
  • fallbackUri:重新路由 URI,可以是本地路由或外部处理程序。
  • status codes(可选):使用数字或文本格式的要匹配的状态代码冒号分隔列表。
  • failure rate(可选):开启断路器的阈值。 默认值为 50%。
  • duration(可选):再次关闭前等待的时间。 默认值为 60 秒。

以下示例配置了 CircuitBreaker 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "CircuitBreaker=myCircuitBreaker,forward:/inCaseOfFailureUseThis,401:NOT_FOUND:500,10,30s"
        ]
    }
]

DeDupeResponseHeader

DeDupeResponseHeader 中心会移除响应头的重复值。

此中心接受以下配置参数:

  • name:标头名称的空格分隔列表。
  • strategy(可选):接受的值为 RETAIN_FIRSTRETAIN_LASTRETAIN_UNIQUE。 默认值为 RETAIN_FIRST

以下示例配置了一个 DeDupeResponseHeader 中心,当网关 CORS 逻辑和下游逻辑添加 Access-Control-Allow-CredentialsAccess-Control-Allow-Origin 响应标头的重复值时,该中心会移除它们:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "DeDupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin"
        ]
    }
]

FallbackHeaders

FallbackHeaders 中心会将任何断路器异常添加到标头。 此筛选器要求在另一个路由中使用 CircuitBreaker 筛选器。

此中心没有任何参数。

以下示例使用异常类型、消息和(如果可用)根本原因异常类型和说明 FallbackHeaders 筛选器添加到请求的消息来配置 FallbackHeaders 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "CircuitBreaker=myCircuitBreaker,forward:/inCaseOfFailureUseThis,401:NOT_FOUND:500,10,30s"
        ]
    },
    {
        "predicates": [
            "Path=/inCaseOfFailureUseThis"
        ],
        "filters": [
            "FallbackHeaders"
        ]
    }
]

可以通过设置以下参数的值(提到它们时使用的是默认值)来覆盖配置中标头的名称:

  • executionExceptionTypeHeaderName ("Execution-Exception-Type")
  • executionExceptionMessageHeaderName ("Execution-Exception-Message")
  • rootCauseExceptionTypeHeaderName ("Root-Cause-Exception-Type")
  • rootCauseExceptionMessageHeaderName ("Root-Cause-Exception-Message")

JSONToGRPC

JSONToGRPCFilter 中心将 JSON 有效负载转换为 gRPC 请求。

此中心接受以下配置参数:

  • protoDescriptor:原型描述符文件。

可以使用 protoc 和指定 --descriptor_set_out 标志来生成此文件,如以下示例所示:

protoc --proto_path=src/main/resources/proto/ \
    --descriptor_set_out=src/main/resources/proto/hello.pb \
    src/main/resources/proto/hello.proto

注意

不支持 streaming 参数。

以下示例使用来自 protoc 的输出配置了 JSONToGRPCFilter 中心:

[
    {
        "predicates": [
            "Path=/json/**"
        ],
        "filters": [
            "JsonToGrpc=file:proto/hello.pb,file:proto/hello.proto,HelloService,hello"
        ]
    }
]

LocalResponseCache

激活全局缓存时,LocalResponseCache 中心会覆盖特定路由的本地响应缓存配置。

此中心接受以下配置参数:

  • size:缓存逐出开始前此路由允许的最大缓存条目大小(以 KB、MB 和 GB 为单位)。
  • timeToLive:过期前缓存条目允许的生存期。 使用持续时间后缀:s 为秒、m 为分钟、h 为小时。

以下示例配置了 LocalResponseCache 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "LocalResponseCache=3m,1MB"
        ]
    }
]

MapRequestHeader

MapRequestHeader 中心会向下游请求添加一个标头,其中包含传入 HTTP 请求标头中更新后的值。

此中心接受以下配置参数:

  • fromHeader
  • toHeader

此中心会创建一个新的命名标头 (toHeader),该值会从传入的 HTTP 请求中现有的命名标头 (fromHeader) 内提取出来。 如果输入标头不存在,则筛选器不起作用。 如果新的命名标头已存在,则其值将用新值扩充。

以下示例配置了一个 MapRequestHeader 中心,该中心使用传入 HTTP 请求的 Blue 标头的更新值将 X-Request-Red:<values> 标头添加到下游请求:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "MapRequestHeader=Blue, X-Request-Red"
        ]
    }
]

PrefixPath

PrefixPath 中心将前缀添加到所有请求的路径。

此中心接受以下配置参数:

  • prefix

以下示例配置了一个 PrefixPath 中心,该中心将前缀 /api 添加到所有请求的路径,以便将对 /catalog 的请求发送到 /api/catalog

[
    {
        "predicates": [
            "Path=/catalog/**"
        ],
        "filters": [
            "PrefixPath=/api"
        ]
    }
]

PreserveHostHeader

PreserveHostHeader 中心设置路由筛选器检查的请求特性,以确定是发送原始主机头还是由 HTTP 客户端确定的主机头。

此中心没有任何参数。

以下示例配置了 PreserveHostHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "PreserveHostHeader"
        ]
    }
]

RedirectTo

RedirectTo 中心将重定向添加到原始 URL。

此中心接受以下配置参数:

  • status:300 系列重定向 HTTP 代码,例如 301
  • urlLocation 标头的值。 必须是有效的 URI。 对于相对重定向,应将 uri: no://op 用作路由定义的 URI。

以下示例配置了一个 RedirectTo 中心,该中心会发送带有 Location:https://acme.org 标头的状态 302 以执行重定向:

[
    {
        "uri": "https://example.org",
        "filters": [
            "RedirectTo=302, https://acme.org"
        ]
    }
]

RemoveJsonAttributesResponseBody

RemoveJsonAttributesResponseBody 中心会从 JSON 响应正文中移除 JSON 特性及其值。

此中心接受以下配置参数:

  • attribute names:要从 JSON 响应中移除的特性名称的逗号分隔列表。
  • delete recursively(可选,布尔值):仅在根级别 (false) 或以递归方式 (true) 移除特性的配置。 默认值为 false

以下示例配置了 RemoveJsonAttributesResponseBody 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RemoveJsonAttributesResponseBody=origin,foo,true"
        ]
    }
]

RemoveRequestHeader

RemoveRequestHeader 中心会从下游请求中移除标头。

此中心接受以下配置参数:

  • name:要移除的标头的名称。

以下列表配置了会在 X-Request-Foo 标头发送到下游之前移除它的 RemoveRequestHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RemoveRequestHeader=X-Request-Foo"
        ]
    }
]

RemoveRequestParameter

RemoveRequestParameter 中心会在参数发送到下游之前移除它。

此中心接受以下配置参数:

  • name:要移除的查询参数的名称。

以下示例配置了在 red 参数发送到下游之前将其移除的 RemoveRequestParameter 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RemoveRequestParameter=red"
        ]
    }
]

RemoveResponseHeader

RemoveResponseHeader 中心会在标头返回到网关客户端之前从响应中移除它。

此中心接受以下配置参数:

  • name:要移除的标头的名称。

以下列表配置了一个 RemoveResponseHeader 中心,该中心会在 X-Response-Foo 标头返回到网关客户端之前从响应中移除它:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RemoveResponseHeader=X-Response-Foo"
        ]
    }
]

RequestHeaderSize

RequestHeaderSize 中心确定请求头的大小。

此中心接受以下配置参数:

  • maxSize:请求头允许的最大数据大小,包括键和值。
  • errorHeaderName:包含错误消息的响应头的名称。 默认情况下,响应头的名称为 errorMessage

以下列表配置了一个 RequestHeaderSize 中心,如果任何请求头的大小大于 1000 字节,则该中心会发送状态 431

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RequestHeaderSize=1000B"
        ]
    }
]

RewriteLocationResponseHeader

RewriteLocationResponseHeader 中心会修改 Location 响应头的值,目的通常是去除特定于后端的详细信息。

此中心接受以下配置参数:

  • stripVersionMode:此参数具有以下可能的值:NEVER_STRIPAS_IN_REQUESTALWAYS_STRIP。 默认值为 AS_IN_REQUEST

    • NEVER_STRIP:即使原始请求路径不包含任何版本,版本也不会剥离。
    • AS_IN_REQUEST:仅当原始请求路径不包含任何版本时,才会剥离版本。
    • ALWAYS_STRIP:即使原始请求路径包含版本,版本也始终会被剥离。
  • hostValue:此参数用于在提供了响应 Location 标头的 host:port 部分时替换它。 如果它未被提供,则会使用 Host 请求头的值。

  • protocolsRegex:协议名称与其匹配的有效正则表达式 String。 如果不匹配,则筛选器不起作用。 默认值为 http|https|ftp|ftps

  • locationHeaderName

以下列表配置了 RewriteLocationResponseHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,"
        ]
    }
]

在此示例中,对于 POST api.example.com/some/object/name 的请求值,object-service.prod.example.net/v2/some/object/idLocation 响应头值将重写为 api.example.com/some/object/id

RewritePath

RewritePath 中心使用 Java 正则表达式来灵活重写请求路径。

此中心接受以下配置参数:

  • regexp
  • replacement

以下列表配置了 RewritePath 中心:

[
    {
        "predicates": [
            "Path=/red/**"
        ],
        "filters": [
            "RewritePath=/red/?(?<segment>.*), /$\\{segment}"
        ]
    }
]

在此示例中,对于 /red/blue 的请求路径,此配置在发出下游请求之前将路径设置为 /blue

RewriteResponseHeader

RewriteResponseHeader 中心使用 Java 正则表达式来灵活重写响应头值。

此中心接受以下配置参数:

  • name
  • regexp
  • replacement

以下示例配置了 RewriteResponseHeader 中心:

[
    {
        "predicates": [
            "Path=/red/**"
        ],
        "filters": [
            "RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***"
        ]
    }
]

在此示例中,对于 /42?user=ford&password=omg!what&flag=true 的标头值,在发出下游请求后,该配置将设置为 /42?user=ford&password=***&flag=true

SetPath

SetPath 中心提供了一种简单的方法来操作请求路径,方法是允许路径的模板化段。 此筛选器使用 Spring Framework 中的 URI 模板,并允许多个匹配的段。

此中心接受以下配置参数:

  • template

以下示例配置了 SetPath 中心:

[
    {
        "predicates": [
            "Path=/red/{segment}"
        ],
        "filters": [
            "SetPath=/{segment}"
        ]
    }
]

在此示例中,对于 /red/blue 的请求路径,此配置在发出下游请求之前将路径设置为 /blue

SetRequestHeader

SetRequestHeader 中心会用给定的名称替换所有标头(而不是添加)。

此中心接受以下配置参数:

  • name
  • value

以下列表配置了 SetRequestHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "SetRequestHeader=X-Request-Red, Blue"
        ]
    }
]

在此示例中,下游服务器响应了 X-Request-Red:1234,并被替换为 X-Request-Red:Blue

SetRequestHeader 中心有权访问用于匹配路径或主机的 URI 变量。 可以在值中使用 URI 变量,并在运行时扩展变量。

以下示例配置了使用变量的 SetRequestHeader 中心:

[
    {
        "predicates": [
            "Path=/api/{segment}"
        ],
        "filters": [
            "SetRequestHeader=foo, bar-{segment}"
        ]
    }
]

SetResponseHeader

SetResponseHeader 中心会用给定的名称替换所有标头(而不是添加)。

此中心接受以下配置参数:

  • name
  • value

以下列表配置了 SetResponseHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "SetResponseHeader=X-Response-Red, Blue"
        ]
    }
]

在此示例中,下游服务器响应了 X-Response-Red:1234,并被替换为 X-Response-Red:Blue

SetResponseHeader 中心有权访问用于匹配路径或主机的 URI 变量。 可以在值中使用 URI 变量,并在运行时扩展变量。

以下示例配置了使用变量的 SetResponseHeader 中心:

[
    {
        "predicates": [
            "Path=/api/{segment}"
        ],
        "filters": [
            "SetResponseHeader=foo, bar-{segment}"
        ]
    }
]

SetStatus

SetStatus 中心会配置服务器请求的响应状态。

此中心接受以下配置参数:

  • status:有效的 Spring HttpStatus 值,它可以是整数值,例如 404,也可以是枚举的字符串表示形式,例如 NOT_FOUND

以下列表配置了 SetStatus 中心:

[
    {
        "predicates": [
            "Path=/experimental/**"
        ],
        "filters": [
            "SetStatus=UNAUTHORIZED"
        ]
    },
    {
        "predicates": [
            "Path=/unknown/**"
        ],
        "filters": [
            "SetStatus=401"
        ]
    }
]

StripPrefix

StripPrefix 中心会先从请求中移除前缀,然后再将其发送到下游。

此中心接受以下配置参数:

  • parts:在发送到下游之前,要从请求中剥离的路径中的部件数。 默认值是 1秒。

以下示例配置了 StripPrefix 中心:

[
    {
        "predicates": [
            "Path=/name/**"
        ],
        "filters": [
            "StripPrefix=2"
        ]
    }
]

在此示例中,通过网关向 /name/blue/red 发出了请求。 向 nameservice 发出的请求显示为 nameservice/red

重试

Retry 中心会确定尝试的重试次数。

此中心接受以下配置参数:

  • retries:应尝试的重试次数。
  • statuses:应重试的 HTTP 状态代码,用 org.springframework.http.HttpStatus 表示。
  • methods:应重试的 HTTP 方法,用 org.springframework.http.HttpMethod 表示。
  • series:要重试的状态代码系列,用 org.springframework.http.HttpStatus.Series 表示。
  • exceptions:应重试的引发的异常的列表。
  • backoff:为重试配置的指数退避。 重试在退避间隔 firstBackoff * (factor ^ n) 后执行,其中 n 为迭代。 如果 maxBackoff 已配置,则应用的退避上限为 maxBackoff。 如果 basedOnPreviousValue 为 true,则使用 prevBackoff * factor 计算 backoff

启用后,将为 Retry 筛选器配置以下默认值:

  • retries:三次。
  • series:5XX 系列。
  • methods:GET 方法。
  • exceptionsIOExceptionTimeoutException
  • backoff:已禁用。

以下示例配置了 Retry 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false"
        ]
    }
]

RequestSize

当请求大小大于允许的限制时,RequestSize 中心可以限制请求到达下游服务。

此中心接受以下配置参数:

  • maxSize:一种 DataSize 类型,其中值定义为后跟可选的 DataUnit 后缀(例如 KBMB)的数字。 默认后缀值为 B(字节)。 它是以字节为单位定义的请求的允许大小限制。

以下示例配置了 RequestSize 中心:

[
    {
        "predicates": [
            "Path=/upload"
        ],
        "filters": [
            "RequestSize=5000000"
        ]
    }
]

在此示例中,当请求因大小而被拒绝时,RequestSize 中心会使用另一个标头 errorMessage 将响应状态设置为 413 Payload Too Large

以下示例显示了一个 errorMessage

errorMessage : Request size is larger than permissible limit. Request size is 6.0 MB where permissible limit is 5.0 MB

TokenRelay

TokenRelay 中心会将 OAuth2 访问令牌转发到下游资源。 此筛选器配置为路由定义中的 boolean 值,而不是显式筛选器。

以下示例配置了 TokenRelay 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "tokenRelay": true
    }
]

使用商业筛选器

适用于 Kubernetes 的 Spring Cloud Gateway 还提供了许多自定义 GatewayFilter 中心。 以下部分会介绍这些中心。

AllowedRequestCookieCount

AllowedRequestCookieCount 中心会根据 Cookie 数确定是否允许匹配请求继续。

此中心接受以下配置参数:

  • amount:允许的 Cookie 数。

以下示例配置了 AllowedRequestCookieCount 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AllowedRequestCookieCount=2"
        ]
    }
]

AllowedRequestHeadersCount

AllowedRequestHeadersCount 中心会根据标头数确定是否允许匹配请求继续。

此中心接受以下配置参数:

  • amount:允许的标头数。

以下示例配置了 AllowedRequestHeadersCount 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AllowedRequestHeadersCount=4"
        ]
    }
]

AllowedRequestQueryParamsCount

AllowedRequestQueryParamsCount 中心会根据查询参数的数量确定是否允许匹配请求继续。

此中心接受以下配置参数:

  • amount:允许的参数数量。

以下示例配置了 AllowedRequestQueryParamsCount 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "AllowedRequestQueryParamsCount=3"
        ]
    }
]

BasicAuth

BasicAuth 中心会向请求添加 BasicAuth Authorization 标头。

此中心没有任何参数。

以下示例配置了 BasicAuth 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "BasicAuth"
        ]
    }
]

ClaimHeader

ClaimHeader 中心会将数据从 JWT 声明复制到 HTTP 标头中。

此中心接受以下配置参数:

  • Claim name:要传递的声明的区分大小写的名称。
  • Header name:HTTP 标头的名称。

以下示例配置了 ClaimHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "ClaimHeader=sub,X-Claim-Sub"
        ]
    }
]

ClientCertificateHeader

ClientCertificateHeader 中心会验证 X-Forwarded-Client-Cert 标头证书。

此中心接受以下配置参数:

  • domain pattern:根据 Kubernetes 识别客户端证书 CA 的能力的 X-Forwarded-Client-Cert 值。
  • certificate fingerprint(可选):TLS/SSL 证书指纹。

以下示例配置了 ClientCertificateHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "ClientCertificateHeader=*.example.com,sha-1:aa:bb:00:99"
        ]
    }
]

Cors

Cors 中心会在路由上激活 CORS 验证。

此中心接受以下整理为 CORS 选项的键值对的配置参数:

  • allowedOrigins
  • allowedMethods
  • allowedHeaders
  • maxAge
  • allowCredentials
  • allowedOriginPatterns

以下示例配置了 Cors 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "Cors=[allowedOrigins:https://origin-1,allowedMethods:GET;POST;DELETE,allowedHeaders:*,maxAge:400,allowCredentials:true,allowedOriginPatterns:https://*.test.com:8080]"
        ]
    }
]

JsonToXml

JsonToXml 中心会将 JSON 响应正文转换为 XML 响应正文。

此中心接受以下配置参数:

  • wrapper:XML 响应的根标记名称(如果需要另一个根标记才能生成有效的 XML)。 默认值为 response

以下示例配置了 JsonToXml 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "JsonToXml=custom-response"
        ]
    }
]

RateLimit

RateLimit 中心会根据请求量确定是否允许匹配请求继续。

此中心接受以下配置参数:

  • request limit:在窗口期间接受的请求数上限。
  • window duration:窗口持续时间(以毫秒为单位)。 或者,可以使用 smh 后缀来指定持续时间(以秒、分钟或小时为单位)。
  • partition source(可选):分区键的位置(claimheaderIPs)。
  • partition key(可选):用于对请求计数器进行分区的值。

以下示例配置了 RateLimit 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RateLimit=1,10s"
        ]
    }
]

以下示例显示了其他 RateLimit 配置:

RateLimit=1,10s
RateLimit=1,10s,{claim:client_id}
RateLimit=1,10s,{header:client_id}
RateLimit=2,10s,{IPs:2;127.0.0.1;192.168.0.1}

RestrictRequestHeaders

RestrictRequestHeaders 中心会根据标头确定是否允许匹配请求继续。

如果有任何 HTTP 标头不在不区分大小写的 headerList 配置中,则 431 Forbidden error 的响应会返回到客户端。

此中心接受以下配置参数:

  • headerList:不区分大小写的允许标头的名称列表。

以下示例配置了 RestrictRequestHeaders 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RestrictRequestHeaders=Content-Type,x-request-temp"
        ]
    }
]

RewriteAllResponseHeaders

RewriteAllResponseHeaders 中心会一次重写多个响应头。

此中心接受以下配置参数:

  • pattern to match:要与标头值匹配的正则表达式。
  • replacement:替换值。

以下示例配置了 RewriteAllResponseHeaders 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RewriteAllResponseHeaders=\\d,0"
        ]
    }
]

RewriteResponseBody

RewriteResponseBody 中心会修改响应的正文。

此中心接受以下配置参数,这些参数会被整理为键值对的逗号分隔列表,其中每个对都接受此形式 pattern to match:replacement

  • pattern to match:要与响应正文中的文本匹配的正则表达式。
  • replacement:替换值。

以下示例配置了 RewriteResponseBody 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RewriteResponseBody=foo:bar,/path-one/:/path-two/"
        ]
    }
]

RewriteJsonAttributesResponseBody

RewriteJsonAttributesResponseBody 中心会使用 JSONPath 表示法重写 JSON 特性。

此中心接受以下配置参数,这些参数会被整理为键值对的逗号分隔列表,其中每个对都接受此形式 jsonpath:replacement

  • jsonpath:与响应正文匹配的 JSONPath 表达式。
  • replacement:替换值。

以下示例配置了 RewriteJsonAttributesResponseBody 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "RewriteJsonAttributesResponseBody=slides[1].title:Welcome,date:11-11-2022"
        ]
    }
]

角色

Roles 中心会授权包含其中一个已配置的角色的请求。

此中心接受以下配置参数:

  • roles:已授权的角色的逗号分隔列表。

以下示例配置了 Roles 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "Roles=role_01,role_02"
        ]
    }
]

作用域

Scopes 中心会授权包含其中一个已配置的 OAuth 范围的请求。

此中心接受以下配置参数:

  • scopes:已授权的 OAuth 范围的逗号分隔列表。

以下示例配置了 Scopes 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "Scopes=api.read,api.write,user"
        ]
    }
]

StoreIpAddress

StoreIPAddress 中心仅用于扩展开发,并且用于应用程序的上下文。

此中心接受以下配置参数:

  • attribute name:用于将 IP 存储为交换特性的名称。

以下示例配置了 StoreIPAddress 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "StoreIpAddress=ip"
        ]
    }
]

SSO 登录

如果没有有效的授权令牌,SSO login 中心会重定向以进行身份验证。 此中心配置为路由定义中的 boolean 值,而不是显式筛选器。

以下示例配置了 SSO login 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "ssoEnabled": true
    }
]

StoreHeader

StoreHeader 中心会将标头值存储在应用程序的上下文中。 此筛选器仅用于扩展开发。

此中心接受以下配置参数:

  • headers:要检查的标头列表。 使用找到的第一个项。
  • attribute name:用于将标头值存储为交换特性的名称。

以下示例配置了 StoreHeader 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "StoreHeader=x-tracing-header,custom-id,x-custom-id,tracingParam"
        ]
    }
]

XmlToJson

XmlToJson 中心会将 XML 响应正文转换为 JSON 响应正文。

此中心没有任何参数。

以下示例配置了 XmlToJson 中心:

[
    {
        "predicates": [
            "Path=/api/**"
        ],
        "filters": [
            "XmlToJson"
        ]
    }
]

后续步骤