本文内容基于 流量转移。
经过 流量转移 的配置,下面是请求的流程:
productpage → reviews:v3 → ratings
请求超时
http 请求的超时可以用路由规则的 timeout
字段来指定。默认情况下,超时是禁用的。这里把 reviews
服务的超时设置为 1 秒。为了观察效果,还需要在对 ratings
服务的调用上人为引入 2 秒的延迟。
- 将所有流量路由到各个微服务的 v1 版本:
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
此时不管刷新多少次,页面的评论部分都不会显示评级星号。因为 Istio 已经将 reviews
服务的所有流量都路由到了 reviews:v1
版本,而该版本的服务不会访问带星级的 ratings
服务。
- 将请求路由到
reviews
服务的 v2 版本,它会发起对ratings
服务的调用:
vim samples/bookinfo/networking/virtual-service-reviews-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2.yaml
可以看到,此时一直刷新页面,只会显示 v2 版本的 reviews
(黑色星型),不区分任何用户。
- 给对
ratings
服务的调用添加 2 秒的延迟:
vim samples/bookinfo/networking/virtual-service-ratings-delay-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percent: 100
fixedDelay: 2s
route:
- destination:
host: ratings
subset: v1
kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-delay-v1.yaml
此时,不管刷新多少次页面,评论部分一直是 reviews:v2
版本的效果(显示黑色星形),但每次刷新页面都会有 2 秒的延迟。因为 Istio 已经给 reviews
对 ratings
服务的调用添加了 2 秒的延迟。
- 给对
reviews
服务的调用增加一个 0.5 秒的请求超时:
vim samples/bookinfo/networking/virtual-service-reviews-delay-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 0.5s
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-delay-v2.yaml
此时再去刷新页面,可以看到 1 秒钟就会返回,而不是之前的 2 秒钟,但 reviews
是不可用的。因为 productpage
对 reviews
服务的调用的请求超时只有 0.5 秒。而 reviews
对 ratings
服务的调用有 2 秒的延迟,因此 productpage
对 reviews
服务的调用是必定超时的,此时 reviews
不可用。
即使超时配置为 0.5 秒,响应仍需要 1 秒,是因为
productpage
服务中存在硬编码重试,因此它在返回之前调用reviews
服务超时两次。
使用 Istio 为对 reviews
微服务的调用配置了 0.5 秒的请求超时。默认情况下请求超时是禁用的。reviews
服务在处理请求时会接着调用 ratings
服务,而 Istio 在对 ratings
的调用中注入了 2 秒钟的延迟,这样就让 reviews
服务要花费超过 0.5 秒的时间来完成调用,因此可以观察到超时。
可以观察到,Bookinfo 的页面(调用 reviews
服务来生成页面)没显示评论,而是显示了消息:Sorry, product reviews are currently unavailable for this book.
,这就是它收到了来自 reviews
服务的超时错误信息。