设置请求超时

这个任务用于展示如何使用Istio在Envoy中设置请求超时。

开始之前

  • 遵循安装指南 的指导安装Istio。
  • 部署BookInfo 示例程序。
  • 执行如下命令,初始化基于应用版本的路由。

    1. istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml

注意:本任务假设在Kubernetes上部署这一应用。所有涉及的命令都使用的是Kubernetes版本的yaml文件(例如samples/bookinfo/kube/route-rule-all-v1.yaml)。如果要在不同环境运行这一任务,则需要把路径中的kube替换成对应的环境(例如samples/bookinfo/consul/route-rule-all-v1.yaml)。

请求超时

http的请求超时可以在路由规则中的httpReqTimeout字段来设置。缺省的超时时间是15秒,在下面我们会把reviews服务的超时时间设置为一秒钟。为了展示效果,我们还需要在调用ratings服务的时候加入两秒钟的延迟。

  1. 路由请求到reviews服务的v2版本,例如,这个版本的reviews服务会调用ratings服务

    1. cat <<EOF | istioctl replace -f -
    2. apiVersion: config.istio.io/v1alpha2
    3. kind: RouteRule
    4. metadata:
    5. name: reviews-default
    6. spec:
    7. destination:
    8. name: reviews
    9. route:
    10. - labels:
    11. version: v2
    12. EOF
  2. ratings服务的调用加入两秒钟的延迟

    1. cat <<EOF | istioctl replace -f -
    2. apiVersion: config.istio.io/v1alpha2
    3. kind: RouteRule
    4. metadata:
    5. name: ratings-default
    6. spec:
    7. destination:
    8. name: ratings
    9. route:
    10. - labels:
    11. version: v1
    12. httpFault:
    13. delay:
    14. percent: 100
    15. fixedDelay: 2s
    16. EOF
  3. 在浏览器中打开 BookInfo 的网址(http://$GATEWAY_URL/productpage)。

    会看到BookInfo应用在正常运行(并且显示了评级的星星),但是你也会注意到,每次刷新页面的时候会有两秒钟的延迟。

  4. 接下来我们给对reviews的调用加入一秒钟的请求超时

    1. cat <<EOF | istioctl replace -f -
    2. apiVersion: config.istio.io/v1alpha2
    3. kind: RouteRule
    4. metadata:
    5. name: reviews-default
    6. spec:
    7. destination:
    8. name: reviews
    9. route:
    10. - labels:
    11. version: v2
    12. httpReqTimeout:
    13. simpleTimeout:
    14. timeout: 1s
    15. EOF
  5. 刷新BookInfo页面

    现在会看到,只有一秒钟就刷新完成(而不是之前的两秒钟),但是Reviews部分不再可用。

幕后故事

这一任务中,使用Istio为reviews服务设置了一秒钟的请求超时(而不是缺省的 15 秒)。由于reviews服务在处理请求的时候会调用下游的ratings服务,而ratings服务已经被我们利用Istio注入了两秒钟的延迟,这一变动会让reviews服务的处理时间超过一秒,故而引发了超时。

你会看到BookInfo productpage(需要调用reviews服务来生成页面)不会显示 review信息,而是显示为:“Sorry, product reviews are currently unavailable for this book. ”,这是reviews服务的超时引发的错误造成的结果。

如果检查一下错误注入任务,会发现productpage服务在调用reviews的时候,也有自己的应用级别的超时(三秒钟)。我们前面的测试中使用了一秒钟的超时,如果我们把下游服务的超时时间设置为大于三秒钟的值(例如四秒),由于三秒钟的限制更为严格,会被优先处理,因此过大的超时时间就不会生效了。参看错误处理一节会有更详细的信息。

还需要注意的就是,除了在路由规则中设置超时之外,还可以在请求中加入“x-envoy-upstream-rq-timeout-ms”头来设置超时,在这一设置中的时间单位是毫秒而不是秒。

清理

  • 删除应用路由规则。

    1. istioctl delete -f samples/bookinfo/kube/route-rule-all-v1.yaml
  • 如果没有计划进一步运行下面的任务,可以参照BookInfo 清理 中的介绍来关闭这一应用。

延伸阅读