1. 基本概念
超时:当你调用上游服务,如果上游服务长时间没有响应,就不用去等,直接返回了。
- 目的是控制故障的范围,避免故障的扩散
重试:不断的去重试要调用的服务
- 主要解决网络抖动,通信失败的问题
2. 实验:添加超时和重试策略
新技能:学会在VirtualService 中添加超时和重试的配置
实验目标:
将请求打向reviews服务的v2版本,在Rating服务中添加一个延迟,模拟一个故障出现的情况,最后验证配置的超时重试是否生效
第一步:给ratings 服务添加延迟
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
访问 http://192.168.61.199:32697/productpage,所有的流量都达到了v2这个版本
给rating服务注入2s的延时(在故障注入篇会详细介绍)
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
访问 http://192.168.61.199:32697/productpage,发现需等待2s
第二步:给reviews 服务添加超时策略
配置非常简单,直接加个timeout项
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 1s
测试:访问 http://192.168.61.199:32697/productpage显示如下图
第三步:给ratings 服务添加重试策略
现将timeout取消掉,
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 1s # 删除此行代码
给rating的虚拟服务配置个5s的延迟,同时给他配置一个超时(设定重试两次),
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percent: 100
fixedDelay: 5s
route:
- destination:
host: ratings
subset: v1
retries:
attempts: 2
perTryTimeout: 1s # 每次尝试需要等待的时间
验证配置是否生效
打开rating服务的SideCar log看是不是有两次的重试
kubectl logs -f ratings-v1-6c6f59c996-45qxb -c istio-proxy
(可以看到,两次的请求全都打了出来)
3. 总结
并不是说超时的时间设置越长越好,如果设置过长可能导致系统的响应时间变慢;如果过短,又起不到应有的作用。