跳转至

Buffering

转发前如何和读取请求

Buffering

缓存中间件使您可以控制在将请求发送到服务之前如何读取请求。

通过 “缓村”,Traefik 将整个请求读入内存(可能将大请求缓存到磁盘),并拒绝超过指定限制的请求。

这可以帮助服务处理大数据(例如,多部分 / 表单数据),并可以最大程度地减少将数据发送到服务所花费的时间。

配置示例

# 将最大请求体设置为2Mb
labels:
  - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
# 将最大请求体设置为2Mb
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    maxRequestBodyBytes: 2000000
# 将最大请求体设置为2Mb
- "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
"labels": {
  "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes": "2000000"
}
# 将最大请求体设置为2Mb
labels:
  - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
# 将最大请求体设置为2Mb
[http.middlewares]
  [http.middlewares.limit.buffering]
    maxRequestBodyBytes = 2000000
# 将最大请求体设置为2Mb
http:
  middlewares:
    limit:
      buffering:
        maxRequestBodyBytes: 2000000

配置选项

maxRequestBodyBytes

使用 maxRequestBodyBytes 选项, 您可以配置允许的请求的最大请求体(以字节为单位)。

如果请求超过允许的大小,则不会将其转发到服务,并且客户端会收到 413 (Request Entity Too Large) 响应.

labels:
  - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    maxRequestBodyBytes: 2000000
- "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
"labels": {
  "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes": "2000000"
}
labels:
  - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
[http.middlewares]
  [http.middlewares.limit.buffering]
    maxRequestBodyBytes = 2000000
http:
  middlewares:
    limit:
      buffering:
        maxRequestBodyBytes: 2000000

memRequestBodyBytes

您可以使用 memRequestBodyBytes 选项配置一个阈值(以字节为单位),低于该阈值的请求会缓存到内存,而超过该阈值的请求将缓存到磁盘上。

labels:
  - "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    memRequestBodyBytes: 2000000
- "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"
"labels": {
  "traefik.http.middlewares.limit.buffering.memRequestBodyBytes": "2000000"
}
labels:
  - "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"
[http.middlewares]
  [http.middlewares.limit.buffering]
    memRequestBodyBytes = 2000000
http:
  middlewares:
    limit:
      buffering:
        memRequestBodyBytes: 2000000

maxResponseBodyBytes

使用 maxReesponseBodyBytes 选项,您可以配置服务允许的最大响应大小(以字节为单位)。

如果响应超出允许的大小,则不会转发给客户端。 客户端改为收到 413 (Request Entity Too Large) 响应。

labels:
  - "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    maxResponseBodyBytes: 2000000
- "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"
"labels": {
  "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes": "2000000"
}
labels:
  - "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"
[http.middlewares]
  [http.middlewares.limit.buffering]
    maxResponseBodyBytes = 2000000
http:
  middlewares:
    limit:
      buffering:
        maxResponseBodyBytes: 2000000

memResponseBodyBytes

您可以使用 memResponseBodyBytes 选项配置一个阈值(以字节为单位),低于该阈值的响应会缓存到内存,而超过该阈值的响应将缓存到磁盘上。

labels:
  - "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    memResponseBodyBytes: 2000000
- "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"
"labels": {
  "traefik.http.middlewares.limit.buffering.memResponseBodyBytes": "2000000"
}
labels:
  - "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"
[http.middlewares]
  [http.middlewares.limit.buffering]
    memResponseBodyBytes = 2000000
http:
  middlewares:
    limit:
      buffering:
        memResponseBodyBytes: 2000000

retryExpression

您可以在 retryExpression 选项的帮助下使缓存中间件重试该请求。

发生网络错误时重试一次
labels:
  - "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: limit
spec:
  buffering:
    retryExpression: "IsNetworkError() && Attempts() < 2"
- "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"
"labels": {
  "traefik.http.middlewares.limit.buffering.retryExpression": "IsNetworkError() && Attempts() < 2"
}
labels:
  - "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"
[http.middlewares]
  [http.middlewares.limit.buffering]
    retryExpression = "IsNetworkError() && Attempts() < 2"
http:
  middlewares:
    limit:
      buffering:
        retryExpression: "IsNetworkError() && Attempts() < 2"

重试表达式定义为以下函数与运算符 AND(&&)和 OR(||)的逻辑组合。 至少需要一个函数:

  • Attempts() 尝试次数(第一个计数)
  • ResponseCode() 服务的响应码
  • IsNetworkError() - 如果响应码与网络错误有关

本节翻译作者:@罗立志