前言
在前面的文章中,大家都已經熟悉了 Istio 的故障注入和流量遷移。這兩個方面的功能都是 Istio 流量治理的一部分。今天將繼續帶大家瞭解 Istio 的另一項功能,關於請求超時的管理。
首先我們可以通過一個簡單的 Bookinfo 的微服務應用程式來動手實踐一下 Istio 是如何實現請求超時的管理。看過 idou 老師前面文章的老司機應該都已經對 Bookinfo 這個例項駕輕就熟了,當然還存在部分被 idou 老師的文采剛吸引過來的新同學。
下面先簡單的介紹一下 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 微服務時,還有自己的應用級超時設定(三秒鐘)。而我們這裡用路由規則設定了一秒鐘的超時。如果把超時設定為超過三秒鐘(例如四秒鐘)會毫無效果(正如我們第三步中設定了四秒)。