前言
在前面的文章中,大家都已經熟悉了Istio的故障注入和流量遷移。這兩個方面的功能都是Istio流量治理的一部分。今天將繼續帶大家瞭解Istio的另一項功能,關於請求超時的管理。
首先我們可以通過一個簡單的Bookinfo的微服務應用程式來動手實踐一下Istio是如何實現請求超時的管理。
下面先簡單的介紹一下Bookinfo這個樣例應用整體架構,以便我們更好地理解Istio是如何實現請求超時,對於老司機可以直接跳過這部分。
Bookinfo應用由四個單獨的微服務構成,用來演示多種 Istio 特性。這個應用模仿線上書店的一個分類,顯示一本書的資訊。頁面上會顯示一本書的描述,書籍的細節,以及關於這本書的一些評論。講道理,Bookinfo這個例項確實比較輕量級,但是麻雀雖小五臟俱全。
瞭解完樣例應用以後,我們就可以動手實踐了。當前的實驗環境是基於已經提前安裝好Kubernetes和Istio。請求超時的管理我們主要可以用來對一些特殊場景進行測試,比如故障注入等。
第一步:首先我們到reviews元件中定義一個VirtualService的路由
第二步:在對ratings服務的呼叫中加入四秒鐘的延遲
第三步:我們需要給productpage配置一個對外訪問方式,然後用瀏覽器開啟productpage對應的訪問方式即可在頁面看到Bookinfo的樣例。這時應該能看到 Bookinfo 應用在正常執行(顯示了評級的星形符號)。很多同學可能會好奇為什麼我們明明設定了四秒鐘的延時卻沒有出現跟自己設想的情況出現,別急讓我們再接著往下走。
第四步:我們重新再給ratings服務的呼叫中修改成2秒延時
第五步:這個時候我們再重新重新整理Bookinfo的應用頁面,將會看到出現的情況正如我們預想的那樣,頁面右側顯示評級的星形符號將會在整個頁面非同步延時大約2s的時間重新整理出來,很多同學可能會思考是不是Istio的延時管理出了bug?莫慌,在本文的最後將會給您揭曉答案。
第六步:我們繼續嘗試在reviews服務的請求加入一秒鐘的請求超時
第七步:我們繼續去重新整理Bookinfo的web頁面看看即將會發生什麼?這時候應該就會看到reviews去呼叫ratings一秒鐘就會返回,而不是之前的兩秒鐘,但是reviews的顯示消失了。
通過上面的實踐,我們使用Istio為呼叫reviews的微服務的請求中加入了一秒鐘的超時控制,覆蓋了本身預設的15秒鐘設定。頁面重新整理時,reviews 服務後面會呼叫 ratings 服務,使用 Istio 在對 ratings 的呼叫中注入了兩秒鐘的延遲,這樣就讓 reviews 服務要花費超過一秒鐘的時間來呼叫 ratings 服務,從而觸發了我們加入的超時控制。這樣就會看到 Bookinfo 中由reviews生產的頁面上沒有出現 reviews 服務的顯示內容,並且出現一串異常資訊,出現這一資訊的原因就是因為來自 reviews 服務的超時錯誤
到這裡,今天的請求超時管理是不是就結束了?當然沒有,idou老師還記得第三步中的問題還沒有給大家解答。這是因為Istio內部的服務中設定了更為嚴格的超時要求,如果有同學看了之前的文章測試了故障注入,就會發現 productpage 微服務在呼叫 reviews 微服務時,還有自己的應用級超時設定(三秒鐘)。而我們這裡用路由規則設定了一秒鐘的超時。如果把超時設定為超過三秒鐘(例如四秒鐘)會毫無效果(正如我們第三步中設定了四秒)。