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 = 2000000http:
middlewares:
limit:
buffering:
maxRequestBodyBytes: 2000000memRequestBodyBytes¶
您可以使用 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 = 2000000http:
middlewares:
limit:
buffering:
memRequestBodyBytes: 2000000maxResponseBodyBytes¶
使用 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 = 2000000http:
middlewares:
limit:
buffering:
maxResponseBodyBytes: 2000000memResponseBodyBytes¶
您可以使用 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 = 2000000http:
middlewares:
limit:
buffering:
memResponseBodyBytes: 2000000retryExpression¶
您可以在 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()- 如果响应码与网络错误有关
本节翻译作者:@罗立志