> 逾時是為了解決長時間或者無限期的等待造成服務不可用,通常需要在代碼中植入此類的網絡層面的彈性處理邏輯,但通過 Istio 就可以使用 Vitual Sevice來優雅的實作逾時的處理。
#### 什麼場景需要用到逾時處理
在生産環境中經常會碰到由于調用方等待下遊的響應過長,堆積大量的請求阻塞了自身服務,造成雪崩的情況,通過通過逾時處理來避免由于無限期等待造成的故障,進而增強服務的可用性。
#### 通過例子來了解
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInVGcq5SNilzMwYTYmBjZyADZllTO0QmY0EWM5QTZ1YTMzEjYi9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.jpeg)
nginx 服務設定了逾時時間為3秒,如果超出這個時間就不在等待,傳回逾時錯誤。
httpd 服務設定了響應時間延遲5秒,任何請求都需要等待5秒後才能傳回。
client 通過通路 nginx 服務去反向代理 httpd 服務,由于 httpd 服務需要5秒後才能傳回,但nginx 服務隻等待3秒,是以用戶端會提示逾時錯誤。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- image: 'nginx:latest'
name: nginx-deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: httpd-deployment
name: httpd-deployment
spec:
replicas: 1
selector:
matchLabels:
app: httpd-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: httpd-deployment
spec:
containers:
- image: 'httpd:latest'
name: httpd-deployment
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx-deployment
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: httpd-service
spec:
selector:
app: httpd-deployment
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-vs
spec:
hosts:
- nginx-service
http:
- route:
- destination:
host: nginx-service
timeout: 3s
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpd-vs
spec:
hosts:
- httpd-service
http:
- fault:
delay:
percentage:
value: 100
fixedDelay: 5s
route:
- destination:
host: httpd-service
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: client-deployment
name: client-deployment
spec:
replicas: 1
selector:
matchLabels:
app: client-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: client-deployment
spec:
containers:
- image: 'busybox:latest'
name: client-deployment
command: [ "/bin/sh", "-c", "sleep 3600"]
##### 配置 nginx 反向代理 模拟下遊調用
``kubectl exec -it nginx-deployment-56c94b9957-xgw88 -- sh``
tee /etc/nginx/conf.d/default.conf <<-'EOF'
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpd-service;
proxy_http_version 1.1;
}
}
EOF
執行 ``nginx -t ; nginx -s reload`` 重新開機服務以生效配置
##### 進入用戶端容器測試結果
``kubectl exec -it client-deployment-56c94b9957-xgw88 -- sh``
``while true; do wget -q -O - http://nginx-service; done``
每隔3秒,由于 nginx 服務的逾時時間到了而 httpd 未有響應,則提示傳回逾時錯誤。