1. 准备工作
- 运行以下命令初始化版本的路由
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
2. 请求超时
针对http的请求超时,可以使用路由规则中的timeout字段。默认timeout是关闭的。但是在此任务中,设置reviews服务的超时时间为1秒。为了查看它的影响,我们还可以在调用ratings服务的时候引进一个2秒的延迟。
- 路由请求到
reviews的v2版本。
kubectl apply -f - <<EOFapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: reviewsspec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v2EOF
- 路由请求到
ratings服务,添加2秒的延迟。
kubectl create -f - <<EOFapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: ratingsspec:hosts:- ratingshttp:- fault:delay:percent: 100fixedDelay: 2sroute:- destination:host: ratingssubset: v1EOF
打开浏览器
http://$GATEWAY_URL/productpage,应该能看到Bookinfo的应用工作正常,但你刷新页面时,它会有2秒的延迟。现在针对调用
reviews服务添加0.5秒的延迟。
kubectl apply -f - <<EOFapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: reviewsspec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v2timeout: 0.5sEOF
现在,您应该看到它在大约1秒(而不是2秒)后返回,并且reviews不可用
即使超时配置为半秒,响应也需要1秒,这是因为在productpage服务中有一个硬编码的重试,所以它在返回之前会两次调用计时的 reviews服务。

3. 理解发生了什么?
在此任务中,使用istio针对调用reviews微服务的请求超时时间设置为半秒。 但是默认的请求超时是关闭的。 因此当reviews服务去调用ratings服务时,而我们设置的调用超时时间为2秒。这就导致了reviews的微服务超时,因为2秒大于它本身设置的0.5秒。
仔细观察reviews服务页面显示,你就会发现Sorry, product reviews are currently unavailable for this book..这其实就是从reviews服务收到的结果。
如果你要仔细检查故障注入,你会发现productpage微服务去调用reviews微服务也有它相应的应用级别超时。
4. 清除本实验
$ kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml
