请求超时

本任务演示如何在使用 Istio 的情况下,在 Envoy 中设置请求超时。

开始之前

请求超时

可以使用路由规则中的超时字段指定 HTTP 请求的超时时间。默认情况下,请求超时已禁用,但在此任务中,您将 reviews 服务的超时时间覆盖为半秒。但是,为了查看其效果,您还在对 ratings 服务的调用中引入了 2 秒的人工延迟。

  1. 将请求路由到 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
  1. 向对 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
  1. 在浏览器中打开 Bookinfo URL http://$GATEWAY_URL/productpage,其中 $GATEWAY_URL 是入口的外部 IP 地址,如 Bookinfo 文档中所述。

    您应该会看到 Bookinfo 应用程序正常工作(显示评分星级),但每次刷新页面时都会延迟 2 秒。

  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
  1. 刷新 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@
  • 如果您不打算探索任何后续任务,请参阅 Bookinfo 清理 说明以关闭应用程序。
这些信息是否有用?
您对改进有什么建议?

感谢您的反馈!