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

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

注意

Azure Spring Apps 是 Azure Spring Cloud 服务的新名称。 虽然该服务有新名称,但一些地方仍会使用旧名称,我们仍在更新屏幕截图、视频和图形等资产。

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

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

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 Gateway 会在添加或更改任何路由配置后自动生成 OpenAPI 版本 3 文档。 有关详细信息,请参阅 适用于 VMware Tanzu 的 API 门户。

先决条件

  • 已启用 Spring Cloud Gateway 的已预配 Azure Spring Apps Enterprise 计划服务实例。 有关详细信息,请参阅 快速入门:使用企业计划生成应用并将其部署到 Azure Spring Apps。
  • Azure CLI 2.0.67 或更高版本。 使用以下命令安装 Azure Spring Apps 扩展:az extension add --name spring

使用筛选器

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

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

使用开放源代码筛选器

Spring Cloud Gateway 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

以下示例配置一个工厂,当网关 CORS 逻辑和下游逻辑添加两个 DeDupeResponseHeader 值时,该工厂将删除重复值 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:proto 描述符文件。

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

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 工厂,该 X-Request-Red:<values> 工厂使用传入 HTTP 请求标头的 Blue 更新值将标头添加到下游请求:

[
    {
        "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
  • url:标头的值 Location 。 必须是有效的 URI。 对于相对重定向,应用作 uri: no://op 路由定义的 URI。

以下示例配置一个RedirectTo工厂,该工厂使用标头发送状态302Location:https://acme.org以执行重定向:

[
    {
        "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:要删除的标头的名称。

以下列表配置在 RemoveRequestHeader 向下游发送标头之前删除 X-Request-Foo 标头的工厂:

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

RemoveRequestParameter

工厂 RemoveRequestParameter 在向下游发送参数之前删除该参数。

此工厂接受以下配置参数:

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

以下示例配置在 RemoveRequestParameter 向下游发送参数之前删除 red 参数的工厂:

[
    {
        "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:此参数用于在提供时替换 host:port 响应 Location 标头的部分。 如果未提供,则使用请求标头的值 Host

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

  • locationHeaderName

以下列表配置工厂 RewriteLocationResponseHeader

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

在此示例中,对于请求值的POSTapi.example.com/some/object/nameLocation响应标头值object-service.prod.example.net/v2/some/object/id,将重写为 api.example.com/some/object/id< a0/>。

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< a0/> 表示。
  • methods:应重试的 HTTP 方法,使用 org.springframework.http.HttpMethod
  • series:要重试的状态代码系列,使用 org.springframework.http.HttpStatus.Series
  • exceptions:应重试的引发异常的列表。
  • backoff:为重试配置的指数退避。 重试在回退间隔 firstBackoff * (factor ^ n)后执行,其中 n 迭代。 如果 maxBackoff 已配置,则应用的最大退避限制为 maxBackoff。 如果 basedOnPreviousValue 为 true, backoff 则使用 prevBackoff * factor..

启用后,将为筛选器配置 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 响应状态设置为 413 Payload Too Large 另一个标头 errorMessage

以下示例演示了一个 errorMessage

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

TokenRelay

工厂 TokenRelayOAuth2 访问令牌转发到下游资源。 此筛选器配置为 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 向请求添加标头 BasicAuthAuthorization

此工厂没有参数。

以下示例配置工厂 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 patternX-Forwarded-Client-Cert:根据 Kubernetes 识别客户端证书 CA 的能力的值。
  • 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"
        ]
    }
]

后续步骤