请求超时
本任务演示如何在使用 Istio 的情况下,在 Envoy 中设置请求超时。
开始之前
请求超时
可以使用路由规则中的超时字段指定 HTTP 请求的超时时间。默认情况下,请求超时已禁用,但在此任务中,您将 reviews
服务的超时时间覆盖为半秒。但是,为了查看其效果,您还在对 ratings
服务的调用中引入了 2 秒的人工延迟。
- 将请求路由到
reviews
服务的 v2 版本,即调用ratings
服务的版本。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
EOF
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
EOF
- 向对
ratings
服务的调用添加 2 秒延迟
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
subset: v1
EOF
网关 API 尚未支持故障注入,因此目前我们需要使用 Istio VirtualService
来添加延迟。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 2s
route:
- destination:
host: ratings
EOF
在浏览器中打开 Bookinfo URL
http://$GATEWAY_URL/productpage
,其中$GATEWAY_URL
是入口的外部 IP 地址,如 Bookinfo 文档中所述。您应该会看到 Bookinfo 应用程序正常工作(显示评分星级),但每次刷新页面时都会延迟 2 秒。
现在为对
reviews
服务的调用添加半秒请求超时。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 0.5s
EOF
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
timeouts:
request: 500ms
EOF
刷新 Bookinfo 网页。
您现在应该会看到它在大约 1 秒内返回,而不是 2 秒,并且评论不可用。
了解发生了什么
在此任务中,您使用 Istio 将对 reviews
微服务的请求超时设置为半秒。默认情况下,请求超时已禁用。由于 reviews
服务在处理请求时随后会调用 ratings
服务,因此您使用 Istio 在对 ratings
的调用中注入了 2 秒的延迟,从而导致 reviews
服务完成所需的时间超过半秒,因此您可以看到超时生效。
您观察到,Bookinfo 产品页面(调用 reviews
服务以填充页面)显示消息“抱歉,此书目前无法提供产品评论”,而不是显示评论。这是由于它从 reviews
服务接收到超时错误导致的。
如果您查看 故障注入任务,您会发现 productpage
微服务也对其对 reviews
微服务的调用设置了自己的应用程序级超时(3 秒)。请注意,在此任务中,您使用 Istio 路由规则将超时设置为半秒。如果您将其超时设置为大于 3 秒(例如 4 秒),则超时将无效,因为两个超时中限制性更强的那个优先。更多详细信息,请参阅 此处。
关于 Istio 中的超时,还有一点需要注意的是,除了像在此任务中那样在路由规则中覆盖超时之外,如果应用程序在出站请求中添加了 x-envoy-upstream-rq-timeout-ms
标头,则还可以基于每个请求覆盖超时。在标头中,超时以毫秒而不是秒为单位指定。
清理
- 删除应用程序路由规则
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
$ kubectl delete virtualservice ratings
- 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理 说明以关闭应用程序。