# 超时

在你开始之前 按照安装指南中的说明安装Istio 。

部署包括默认目标规则在内的Bookinfo示例应用程序 。

通过运行以下命令来初始化应用程序版本路由:

$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

请求超时 可以使用路由规则的超时字段指定HTTP请求的超时。默认情况下,请求超时是禁用的,但是在此任务中,您将服务超时重写为1秒。但是,要查看其效果,您还会在对服务的调用中引入人为的2秒延迟。reviewsratings

将请求路由到reviews服务的v2 ,即调用该ratings服务的版本:

$ kubectl apply -f - <\<EOF apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts:

*   reviews

    http:

    * route:
*   destination:

    &#x20; host: reviews

    &#x20; subset: v2

    EOF

给ratings服务调用增加2秒的延迟:

$ kubectl apply -f - <\<EOF apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts:

*   ratings

    http:
*   fault:

    &#x20; delay:

    ```
    percent: 100
    fixedDelay: 2s
    ```

    route:

    *   destination:

        &#x20; host: ratings

        &#x20; subset: v1

        EOF

[http://$GATEWAY\_URL/productpage在浏览器中打开Bookinfo](http://$gateway_url/productpage%E5%9C%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E6%89%93%E5%BC%80Bookinfo) URL 。

您应该看到Bookinfo应用程序正常运行(显示评级星标),但是刷新页面会有2秒的延迟。

现在,为reviews服务调用添加半秒请求超时:

$ kubectl apply -f - <\<EOF apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts:

*   reviews

    http:
* route:
  *   destination:

      &#x20; host: reviews

      &#x20; subset: v2

      timeout: 0.5s

      EOF

刷新Bookinfo网页。

现在,您应该看到它在大约1秒钟内返回,而不是2秒钟,并且评论不可用。

即使将超时配置为半秒,响应仍需要1秒的原因是因为服务中存在硬编码重试productpage,因此它reviews在返回之前调用两次超时服务。 了解发生了什么 在此任务中,您使用Istio将对reviews 微服务的调用的请求超时设置为半秒。默认情况下,请求超时是禁用的。由于该reviews服务随后ratings在处理请求时调用该服务,因此您使用Istio注入了2秒的延迟,ratings以使该 reviews服务花费超过半秒的时间才能完成,因此您可以看到超时情况。

您观察到,Bookinfo产品页面(通过调用该reviews服务填充页面)没有显示评论,而是显示了以下消息:很抱歉,该书当前没有产品评论。这是它从reviews服务接收到超时错误的结果。

如果检查故障注入任务,您会发现productpage 微服务还具有自己的应用程序级超时(3秒),用于调用reviews微服务。请注意,在此任务中,您使用了Istio路由规则将超时设置为半秒。相反,如果您将超时设置为大于3秒(例如4秒)的时间,则该超时将无效,因为两者中限制性较大的优先。可以在此处找到更多详细信息。

关于Istio中超时的另一件事要注意的是,除了在路由规则中覆盖它们之外(如您在本任务中所做的那样),如果应用程序x-envoy-upstream-rq-timeout-ms在出站请求上添加标头,则它们也可以基于每个请求被覆盖。在标头中,以毫秒(而不是秒)指定超时。

清理 删除应用程序路由规则:

$ kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml

如果您不打算探索任何后续任务,请参阅 Bookinfo清理说明以关闭应用程序。
