This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

中间件组件说明

列出所有支持的中间件组件,这些组件可以集成到Dapr的处理流程中。

下表展示了Dapr支持的中间件组件。了解如何定制处理流程并配置中间件组件。

Table headers to note:

HeaderDescriptionExample
StatusComponent certification statusAlpha
Beta
Stable
Component versionThe version of the componentv1
Since runtime versionThe version of the Dapr runtime when the component status was set or updated1.11

HTTP

ComponentDescriptionStatusComponent version
OAuth2 Authorization Grant flowEnables the OAuth2 Authorization Grant flow on a Web APIAlphav1
OAuth2 Client Credentials Grant flowEnables the OAuth2 Client Credentials Grant flow on a Web APIAlphav1
OpenID ConnectVerifies a Bearer Token using OpenID Connect on a Web APIStablev1
Rate limitRestricts the maximum number of allowed HTTP requests per secondStablev1
Rego/OPA PoliciesApplies Rego/OPA Policies to incoming Dapr HTTP requestsAlphav1
Router AliasUse Router Alias to map arbitrary HTTP routes to valid Dapr API endpointsAlphav1
RouterCheckerUse RouterChecker middleware to block invalid http request routingAlphav1
SentinelUse Sentinel middleware to guarantee the reliability and resiliency of your applicationAlphav1
UppercaseConverts the body of the request to uppercase letters (demo)Stablev1
WasmUse Wasm middleware in your HTTP pipelineAlphav1

1 - Bearer

通过验证 bearer 令牌,使用 bearer 中间件保护 HTTP 端点

Bearer HTTP 中间件 利用 OpenID Connect 在 Web API 上验证 Bearer Token,无需修改应用程序代码。此设计将身份验证和授权与应用程序逻辑分离,使应用程序管理员可以配置身份验证和授权提供者,而不影响应用程序的正常运行。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: bearer-token
spec:
  type: middleware.http.bearer
  version: v1
  metadata:
    - name: audience
      value: "<您的令牌受众,例如应用程序的客户端 ID>"
    - name: issuer
      value: "<您的令牌发行者,例如 'https://accounts.google.com'>"

    # 可选项
    - name: jwksURL
      value: "<JWKS URL,例如 'https://accounts.google.com/.well-known/openid-configuration'>"

规格元数据字段

字段必需详情示例
audienceY令牌中预期的受众,通常是您的应用程序的客户端 ID,由 OpenID Connect 平台提供。
issuerY令牌发行者,即令牌中发行者声明的预期值。"https://accounts.google.com"
jwksURLNJWKS(包含用于验证令牌的公钥的 JWK 集)的地址。如果未设置,将尝试从 OpenID 配置文档 <issuer>/.well-known/openid-configuration 中获取 URL。"https://accounts.google.com/.well-known/openid-configuration"

issuer 的常见值包括:

  • Auth0: https://{domain},其中 {domain} 是您的 Auth0 应用程序的域名
  • Microsoft Entra ID: https://login.microsoftonline.com/{tenant}/v2.0,其中 {tenant} 是您的应用程序的租户 ID,格式为 UUID
  • Google: https://accounts.google.com
  • Salesforce (Force.com): https://login.salesforce.com

Dapr 配置

要应用此中间件,必须在 配置 中进行引用。请参阅 中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: bearer-token
      type: middleware.http.bearer

相关链接

2 - OAuth2

使用OAuth2中间件来保护HTTP端点

OAuth2 HTTP中间件在Web API上启用OAuth2授权码流程,无需修改应用程序代码。这种设计将身份验证和授权问题与应用程序分离开来,使应用程序操作员可以独立采用和配置身份验证/授权提供者,而不影响应用程序的代码。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: oauth2
spec:
  type: middleware.http.oauth2
  version: v1
  metadata:
  - name: clientId
    value: "<your client ID>"
  - name: clientSecret
    value: "<your client secret>"
  - name: scopes
    value: "https://www.googleapis.com/auth/userinfo.email"
  - name: authURL
    value: "https://accounts.google.com/o/oauth2/v2/auth"
  - name: tokenURL
    value: "https://accounts.google.com/o/oauth2/token"
  - name: redirectURL
    value: "http://dummy.com"
  - name: authHeaderName
    value: "authorization"
  - name: forceHTTPS
    value: "false"

规范元数据字段

字段详情示例
clientId您的应用程序的客户端ID,是在启用OAuth的平台上创建的凭据的一部分"your-client-id"
clientSecret您的应用程序的客户端secret,是在启用OAuth的平台上创建的凭据的一部分"your-client-secret"
scopes空格分隔的、区分大小写的范围字符串列表,通常用于应用程序中的授权"https://www.googleapis.com/auth/userinfo.email"
authURLOAuth2授权服务器的端点"https://accounts.google.com/o/oauth2/v2/auth"
tokenURL客户端通过提供其授权授予或刷新令牌来获取访问令牌的端点"https://accounts.google.com/o/oauth2/token"
redirectURL用户认证后授权服务器应重定向到的Web应用程序的URL"https://myapp.com"
authHeaderName转发到应用程序的授权头名称"authorization"
forceHTTPS如果为true,则强制使用TLS/SSL"true","false"

Dapr配置

要应用中间件,必须在配置中引用。请参阅中间件处理管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: oauth2
      type: middleware.http.oauth2

相关链接

3 - OAuth2 客户端凭证

使用 OAuth2 客户端凭证中间件保护 HTTP 端点

OAuth2 客户端凭证的 HTTP 中间件可以在 Web API 上启用 OAuth2 客户端凭证流程,而无需对应用程序进行任何修改。这种设计将身份验证和授权与应用程序逻辑分离,使得应用程序的操作员可以独立于应用程序代码来选择和配置身份验证/授权提供者。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: oauth2clientcredentials
spec:
  type: middleware.http.oauth2clientcredentials
  version: v1
  metadata:
  - name: clientId
    value: "<your client ID>"
  - name: clientSecret
    value: "<your client secret>"
  - name: scopes
    value: "https://www.googleapis.com/auth/userinfo.email"
  - name: tokenURL
    value: "https://accounts.google.com/o/oauth2/token"
  - name: headerName
    value: "authorization"

规范元数据字段

字段详情示例
clientId您的应用程序的客户端 ID,是由支持 OAuth 的平台生成的凭证的一部分
clientSecret您的应用程序的客户端 secret,是由支持 OAuth 的平台生成的凭证的一部分
scopes空格分隔的、区分大小写的 scopes 字符串列表,通常用于定义应用程序的授权范围"https://www.googleapis.com/auth/userinfo.email"
tokenURL客户端通过提供授权授予或刷新令牌来获取访问令牌的端点"https://accounts.google.com/o/oauth2/token"
headerName转发到您的应用程序的授权头名称"authorization"
endpointParamsQuery指定请求令牌端点的附加参数true
authStyle可选地指定端点希望客户端 ID 和客户端 secret 发送的方式。请参阅下表中的可能值0

authStyle 的可能值

含义
1在 POST 请求体中以 application/x-www-form-urlencoded 参数的形式发送 “client_id” 和 “client_secret”。
2使用 HTTP 基本授权方式发送 “client_id” 和 “client_secret”。这是 OAuth2 RFC 6749 第 2.3.1 节 中描述的可选方式。
0自动检测提供者期望的身份验证方式,通过尝试两种方式并缓存成功的方式以备将来使用。

Dapr 配置

要应用中间件,必须在 配置中引用。请参阅 中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: oauth2clientcredentials
      type: middleware.http.oauth2clientcredentials

相关链接

4 - 应用 Open Policy Agent (OPA) 策略

通过中间件对传入请求应用 Open Policy Agent (OPA) 策略

Open Policy Agent (OPA) HTTP 中间件 用于对传入的 Dapr HTTP 请求应用 OPA 策略。这可以用于在应用程序端点上实施可重用的授权策略。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: my-policy
spec:
  type: middleware.http.opa
  version: v1
  metadata:
    # `includedHeaders` 是一个不区分大小写的逗号分隔的头集合,包含在请求输入中。
    # 默认情况下,请求头不会传递给策略。需要明确指定以接收传入请求头。
    - name: includedHeaders
      value: "x-my-custom-header, x-jwt-header"

    # `defaultStatus` 是拒绝响应时返回的状态码
    - name: defaultStatus
      value: 403

    # `readBody` 控制中间件是否在内存中读取整个请求体并使其可用于策略决策。
    - name: readBody
      value: "false"

    # `rego` 是要评估的 open policy agent 策略。必需
    # 策略包必须命名为 http,策略必须设置 data.http.allow
    - name: rego
      value: |
        package http

        default allow = true

        # Allow 也可以是一个对象并包含其他属性

        # 例如,如果您想在策略失败时重定向,可以将状态码设置为 301 并在响应中设置位置头:
        allow = {
            "status_code": 301,
            "additional_headers": {
                "location": "https://my.site/authorize"
            }
        } {
            not jwt.payload["my-claim"]
        }

        # 您还可以允许请求并向其添加其他头:
        allow = {
            "allow": true,
            "additional_headers": {
                "x-my-claim": my_claim
            }
        } {
            my_claim := jwt.payload["my-claim"]
        }
        jwt = { "payload": payload } {
            auth_header := input.request.headers["Authorization"]
            [_, jwt] := split(auth_header, " ")
            [_, payload, _] := io.jwt.decode(jwt)
        }

您可以使用 官方 OPA playground 来原型和实验策略。例如,您可以在此处找到上面的示例策略

规格元数据字段

字段详情示例
regoRego 策略语言见上文
defaultStatus拒绝响应时返回的状态码"https://accounts.google.com""https://login.salesforce.com"
readBody如果设置为 true(默认值),则每个请求的主体将完全在内存中读取,并可用于进行策略决策。如果您的策略不依赖于检查请求体,请考虑禁用此功能(设置为 false)以显著提高性能。"false"
includedHeaders一个不区分大小写的逗号分隔的头集合,包含在请求输入中。默认情况下,请求头不会传递给策略。需要明确指定以接收传入请求头。"x-my-custom-header, x-jwt-header"

Dapr 配置

要应用中间件,必须在 配置 中引用。请参阅 中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: my-policy
      type: middleware.http.opa

输入

此中间件提供一个 HTTPRequest 作为输入。

HTTPRequest

HTTPRequest 输入包含有关传入 HTTP 请求的所有相关信息。

type Input struct {
  request HTTPRequest
}

type HTTPRequest struct {
  // 请求方法(例如 GET,POST 等)
  method string
  // 原始请求路径(例如 "/v2/my-path/")
  path string
  // 路径分解为部分以便于使用(例如 ["v2", "my-path"])
  path_parts string[]
  // 原始查询字符串(例如 "?a=1&b=2")
  raw_query string
  // 查询分解为键及其值
  query map[string][]string
  // 请求头
  // 注意:默认情况下,不包括任何头。您必须指定要通过 `spec.metadata.includedHeaders` 接收的头(见上文)
  headers map[string]string
  // 请求方案(例如 http, https)
  scheme string
  // 请求体(例如 http, https)
  body string
}

结果

策略必须设置 data.http.allow,可以是 boolean 值,也可以是具有 allow 布尔属性的 object 值。trueallow 将允许请求,而 false 值将拒绝请求,并使用 defaultStatus 指定的状态。以下策略,带有默认值,演示了对所有请求的 403 - Forbidden

package http

default allow = false

这与以下相同:

package http

default allow = {
  "allow": false
}

更改拒绝响应状态码

拒绝请求时,您可以覆盖返回的状态码。例如,如果您想返回 401 而不是 403,可以执行以下操作:

package http

default allow = {
  "allow": false,
  "status_code": 401
}

添加响应头

要重定向,请添加头并将 status_code 设置为返回结果:

package http

default allow = {
  "allow": false,
  "status_code": 301,
  "additional_headers": {
    "Location": "https://my.redirect.site"
  }
}

添加请求头

您还可以在允许的请求上设置其他头:

package http

default allow = false

allow = { "allow": true, "additional_headers": { "X-JWT-Payload": payload } } {
  not input.path[0] == "forbidden"
  // 其中 `jwt` 是另一个规则的结果
  payload := base64.encode(json.marshal(jwt.payload))
}

结果结构

type Result bool
// 或
type Result struct {
  // 是否允许或拒绝传入请求
  allow bool
  // 覆盖拒绝响应状态码;可选
  status_code int
  // 设置允许请求或拒绝响应的头;可选
  additional_headers map[string]string
}

相关链接

5 - RouterChecker HTTP 请求路由检查

使用 routerchecker 中间件阻止无效的 HTTP 请求路由

RouterChecker HTTP 中间件 组件通过正则表达式来验证 HTTP 请求路由的有效性,防止无效路由进入 Dapr 集群。RouterChecker 组件能够过滤掉不良请求,从而减少遥测和日志数据中的噪音。

组件格式

RouterChecker 对传入的 HTTP 请求应用一组规则。您可以在组件的元数据中使用正则表达式来定义这些规则。在以下示例中,HTTP 请求 RouterChecker 被设置为验证所有请求路径是否符合 ^[A-Za-z0-9/._-]+$ 这个正则表达式。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: routerchecker 
spec:
  type: middleware.http.routerchecker
  version: v1
  metadata:
  - name: rule
    value: "^[A-Za-z0-9/._-]+$"

在此示例中,上述定义将导致以下请求被通过或拒绝:

PASS /v1.0/invoke/demo/method/method
PASS /v1.0/invoke/demo.default/method/method
PASS /v1.0/invoke/demo.default/method/01
PASS /v1.0/invoke/demo.default/method/METHOD
PASS /v1.0/invoke/demo.default/method/user/info
PASS /v1.0/invoke/demo.default/method/user_info
PASS /v1.0/invoke/demo.default/method/user-info

FAIL /v1.0/invoke/demo.default/method/cat password
FAIL /v1.0/invoke/demo.default/method/" AND 4210=4210 limit 1
FAIL /v1.0/invoke/demo.default/method/"$(curl

规格元数据字段

字段详情示例
ruleHTTP 请求 RouterChecker 使用的正则表达式^[A-Za-z0-9/._-]+$

Dapr 配置

要应用中间件,必须在配置中引用。请参阅中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: routerchecker 
      type: middleware.http.routerchecker

相关链接

6 - Sentinel 容错中间件组件

使用 Sentinel 中间件来保证应用程序的可靠性和弹性

Sentinel 是一个强大的容错组件,专注于流量管理,涵盖流量控制、流量整形、并发限制、熔断降级和自适应系统保护等多个领域,以确保微服务的可靠性和弹性。

Sentinel HTTP 中间件 使 Dapr 可以利用 Sentinel 的强大功能来保护您的应用程序。您可以参考 Sentinel Wiki 以获取有关 Sentinel 的更多详细信息。

组件格式

在以下定义中,最大请求数被设定为每秒 10 个:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: sentinel
spec:
  type: middleware.http.sentinel
  version: v1
  metadata:
  - name: appName
    value: "nodeapp"
  - name: logDir
    value: "/var/tmp"
  - name: flowRules
    value: >-
      [
        {
          "resource": "POST:/v1.0/invoke/nodeapp/method/neworder",
          "threshold": 10,
          "tokenCalculateStrategy": 0,
          "controlBehavior": 0
        }
      ]

规格元数据字段

字段详情示例
appName当前运行服务的名称nodeapp
logDir日志目录路径/var/tmp/sentinel
flowRulesSentinel 流量控制规则的 JSON 数组流量控制规则
circuitBreakerRulesSentinel 熔断器规则的 JSON 数组熔断器规则
hotSpotParamRulesSentinel 热点参数流量控制规则的 JSON 数组热点规则
isolationRulesSentinel 隔离规则的 JSON 数组隔离规则
systemRulesSentinel 系统规则的 JSON 数组系统规则

一旦达到限制,请求将返回 HTTP 状态码 429: 请求过多

请特别注意每个规则定义中的 resource 字段。在 Dapr 中,它遵循以下格式:

POST/GET/PUT/DELETE:Dapr HTTP API 请求路径

所有具体的 HTTP API 信息可以在 [Dapr API 参考]https://v1-16.docs.dapr.io/zh-hans/reference/api/ 中找到。在上述示例配置中,resource 字段被设置为 POST:/v1.0/invoke/nodeapp/method/neworder

Dapr 配置

要应用中间件,必须在 configuration 中引用。请参阅 中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  httpPipeline:
    handlers:
      - name: sentinel
        type: middleware.http.sentinel

相关链接

7 - Wasm

在HTTP管道中使用Wasm中间件

WebAssembly是一种安全执行由其他语言编译的代码的方法。运行时会执行WebAssembly模块(Wasm),这些模块通常是带有.wasm扩展名的二进制文件。

Wasm HTTP中间件允许您使用编译为Wasm二进制文件的自定义逻辑来处理传入请求或提供响应。换句话说,您可以使用未预编译到daprd二进制文件中的外部文件来扩展Dapr。Dapr嵌入了wazero以在不使用CGO的情况下实现这一点。

Wasm二进制文件可以从URL加载。例如,使用URL file://rewrite.wasm可以从进程的当前目录加载rewrite.wasm文件。在Kubernetes环境中,您可以参考如何:将Pod卷挂载到Dapr sidecar来配置可以包含Wasm模块的文件系统挂载。也可以从远程URL获取Wasm二进制文件。在这种情况下,URL必须精确指向一个Wasm二进制文件。例如:

  • http://example.com/rewrite.wasm,或
  • https://example.com/rewrite.wasm

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: wasm
spec:
  type: middleware.http.wasm
  version: v1
  metadata:
  - name: url
    value: "file://router.wasm"
  - guestConfig
    value: {"environment":"production"}

规范元数据字段

用户至少需要指定一个实现http-handler的Wasm二进制文件。如何编译将在后面描述。

字段详情必需示例
url包含要实例化的Wasm二进制文件的资源URL。支持的方案包括file://http://https://file:// URL的路径相对于Dapr进程,除非它以/开头。truefile://hello.wasmhttps://example.com/hello.wasm
guestConfig传递给Wasm来宾的可选配置。用户可以传递由Wasm代码解析的任意字符串。falseenvironment=production{"environment":"production"}

Dapr配置

要应用中间件,必须在configuration中引用它。请参阅中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: wasm
      type: middleware.http.wasm

注意:WebAssembly中间件使用的资源比本地中间件多。这可能导致资源限制比在本地代码中更快达到。生产环境中应控制最大并发

生成Wasm

此组件允许您使用http-handler应用程序二进制接口(ABI)编译的自定义逻辑来处理传入请求或提供响应。handle_request函数接收传入请求,并可以根据需要对其进行处理或提供响应。

要编译您的Wasm,您需要使用符合http-handler的来宾SDK(如TinyGo)来编译源代码。

以下是TinyGo中的示例:

package main

import (
	"strings"

	"github.com/http-wasm/http-wasm-guest-tinygo/handler"
	"github.com/http-wasm/http-wasm-guest-tinygo/handler/api"
)

func main() {
	handler.HandleRequestFn = handleRequest
}

// handleRequest实现了一个简单的HTTP路由器。
func handleRequest(req api.Request, resp api.Response) (next bool, reqCtx uint32) {
	// 如果URI以/host开头,修剪它并分派到下一个处理程序。
	if uri := req.GetURI(); strings.HasPrefix(uri, "/host") {
		req.SetURI(uri[5:])
		next = true // 继续到主机上的下一个处理程序。
		return
	}

	// 提供静态响应
	resp.Headers().Set("Content-Type", "text/plain")
	resp.Body().WriteString("hello")
	return // 跳过下一个处理程序,因为我们已经写了一个响应。
}

如果使用TinyGo,按如下所示编译,并将名为"url"的规范元数据字段设置为输出的位置(例如,file://router.wasm):

tinygo build -o router.wasm -scheduler=none --no-debug -target=wasi router.go`

Wasm guestConfig 示例

以下是如何使用guestConfig将配置传递给Wasm的示例。在Wasm代码中,您可以使用来宾SDK中定义的函数handler.Host.GetConfig来获取配置。在以下示例中,Wasm中间件从组件中定义的JSON配置中解析执行的environment

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: wasm
spec:
  type: middleware.http.wasm
  version: v1
  metadata:
  - name: url
    value: "file://router.wasm"
  - guestConfig
    value: {"environment":"production"}

以下是TinyGo中的示例:

package main

import (
	"encoding/json"
	"github.com/http-wasm/http-wasm-guest-tinygo/handler"
	"github.com/http-wasm/http-wasm-guest-tinygo/handler/api"
)

type Config struct {
	Environment string `json:"environment"`
}

func main() {
	// 获取配置字节,这是组件中定义的guestConfig的值。
	configBytes := handler.Host.GetConfig()
	
	config := Config{}
	json.Unmarshal(configBytes, &config)
	handler.Host.Log(api.LogLevelInfo, "Config environment: "+config.Environment)
}

相关链接

8 - 将请求体转换为大写

测试您的HTTP管道是否正常工作,使用大写中间件

大写HTTP中间件用于将请求体的内容转换为大写字母。它主要用于测试管道的正常运行,仅在本地开发环境中使用。

组件格式

在以下定义中,该中间件将请求体的内容转换为大写:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: uppercase
spec:
  type: middleware.http.uppercase
  version: v1

此组件没有可配置的metadata选项。

Dapr配置

要使用此中间件,必须在配置中进行设置。请参阅中间件管道以获取更多信息。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: uppercase
      type: middleware.http.uppercase

相关链接

9 - HTTP 路由别名

通过路由别名中间件将任意 HTTP 路由映射为 Dapr 端点

HTTP 路由别名 中间件 组件允许您将进入 Dapr 的任意 HTTP 路由映射为有效的 Dapr API 端点。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: routeralias 
spec:
  type: middleware.http.routeralias
  version: v1
  metadata:
    # 包含 JSON 或 YAML 格式的字典字符串
    # 字典中的每个键是传入路径,值是映射后的路径
    - name: "routes"
      value: |
        {
          "/mall/activity/info": "/v1.0/invoke/srv.default/method/mall/activity/info",
          "/hello/activity/{id}/info": "/v1.0/invoke/srv.default/method/hello/activity/info",
          "/hello/activity/{id}/user": "/v1.0/invoke/srv.default/method/hello/activity/user"
        }

在上面的示例中,传入的 HTTP 请求 /mall/activity/info?id=123 会被映射为 /v1.0/invoke/srv.default/method/mall/activity/info?id=123

规格元数据字段

字段详情示例
routes包含 JSON 或 YAML 格式的字典字符串。字典中的每个键是传入路径,值是映射后的路径。见上例

Dapr 配置

要使用中间件,必须在 配置 中进行引用。参见 中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: routeralias 
      type: middleware.http.routeralias

相关链接

10 - 速率限制

通过速率限制中间件控制每秒请求数量

HTTP中间件速率限制HTTP中间件允许您限制每秒HTTP请求的最大数量。通过速率限制,您可以保护应用程序免受拒绝服务(DoS)攻击的影响。DoS攻击可能由恶意第三方发起,也可能由于软件错误(即所谓的“友军火力”DoS攻击)而发生。

组件格式

在以下定义中,每秒最大请求数被设置为10:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: ratelimit
spec:
  type: middleware.http.ratelimit
  version: v1
  metadata:
  - name: maxRequestsPerSecond
    value: 10

规格元数据字段

字段详情示例
maxRequestsPerSecond每秒允许的最大请求数,基于远程IP。
组件通过X-Forwarded-ForX-Real-IP头来识别请求者的IP。
10

一旦达到限制,请求将返回HTTP状态码429: Too Many Requests

此外,您还可以使用最大并发设置来限制应用程序的请求处理能力,这种方法适用于所有流量,不论远程IP、协议或路径。

Dapr配置

要应用中间件,必须在配置中进行引用。请参阅中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: ratelimit
      type: middleware.http.ratelimit

相关链接