设置请求超时

本任务用于示范如何使用 Istio 在 Envoy 中设置请求超时。

开始之前

Zip

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

请求超时

可以在路由规则timeout 字段中来给 http 请求设置请求超时。缺省情况下,超时被设置为 15 秒钟,本文任务中,会把 reviews 服务的超时设置为一秒钟。为了能观察设置的效果,还需要在对 ratings 服务的调用中加入两秒钟的延迟。

  • reviews:v2 服务的路由定义:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: reviews
  6. spec:
  7. hosts:
  8. - reviews
  9. http:
  10. - route:
  11. - destination:
  12. host: reviews
  13. subset: v2
  14. EOF
  • 在对 ratings 服务的调用中加入两秒钟的延迟:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: ratings
  6. spec:
  7. hosts:
  8. - ratings
  9. http:
  10. - fault:
  11. delay:
  12. percent: 100
  13. fixedDelay: 2s
  14. route:
  15. - destination:
  16. host: ratings
  17. subset: v1
  18. EOF

这时应该能看到 Bookinfo 应用在正常运行(显示了评级的星形符号),但是每次刷新页面,都会出现两秒钟的延迟。

  • 接下来在目的为 reviews:v2 服务的请求加入一秒钟的请求超时:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: reviews
  6. spec:
  7. hosts:
  8. - reviews
  9. http:
  10. - route:
  11. - destination:
  12. host: reviews
  13. subset: v2
  14. timeout: 0.5s
  15. EOF
  • 刷新 Bookinfo 的 Web 页面。

这时候应该看到一秒钟就会返回,而不是之前的两秒钟,但 reviews 的显示已经不见了。

即使超时配置为半秒,响应需要 1 秒的原因是因为 productpage 页面服务中存在硬编码重试,因此它在返回之前调用 reviews 服务超时两次。

理解原理

上面的任务中,使用 Istio 为调用 reviews 微服务的请求中加入了一秒钟的超时控制,覆盖了缺省的 15 秒钟设置。页面刷新时,reviews 服务后面会调用 ratings 服务,使用 Istio 在对 ratings 的调用中注入了两秒钟的延迟,这样就让 reviews 服务要花费超过一秒钟的时间来调用 ratings 服务,从而触发了我们加入的超时控制。

这样就会看到 Bookinfo 的页面( 页面由 reviews 服务生成)上没有出现 reviews 服务的显示内容,取而代之的是错误信息:Sorry, product reviews are currently unavailable for this book ,出现这一信息的原因就是因为来自 reviews 服务的超时错误。

如果测试了故障注入任务,会发现 productpage 微服务在调用 reviews 微服务时,还有自己的应用级超时设置(三秒钟)。注意这里我们用路由规则设置了一秒钟的超时。如果把超时设置为超过三秒钟(例如四秒钟)会毫无效果,这是因为内部的服务中设置了更为严格的超时要求。更多细节可以参见故障处理 FAQ 的相关内容。

还有一点关于 Istio 中超时控制方面的补充说明,除了像本文一样在路由规则中进行超时设置之外,还可以进行请求一级的设置,只需在应用的外发流量中加入 x-envoy-upstream-rq-timeout-ms Header 即可。在这个 Header 中的超时设置单位是毫秒而不是秒。

清理

  • 移除应用的路由规则:

Zip

  1. $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  • 如果不准备继续探索后续任务,根据 Bookinfo 清理内容来关停示例应用。