idou老師教你學Istio 28:istio-proxy check 的快取

CCE_huawei發表於2019-02-26

功能概述


istio-proxy主要的功能是連線istio的控制面元件和envoy之間的互動,其中check的功能是將envoy收集的attributes資訊上

報給mixer,在istio中有幾十種attributes(官方文件中有Attribute Vocabulary的具體介紹), mixer根據自身的adapter

給envoy 反饋。為了避免每次對mixer都進行遠端呼叫,保證執行時的效能,在istio-proxy這裡配置了本地快取。


具體實現


在proxy這裡配置了兩層快取,分別是referenced map和LRUcache,定義在check_cache.h中:


Referenced map是用來儲存envoy check之後mixer的返回的屬性,也就是mixer的adapter所使用到的所有屬性。


LRUCache是用來儲存每次對mixer請求之後所得到的check的結果。


步驟簡析


快取檢查


     cache->Check(attributes, result);


     if (result->IsCacheHit()) return result->Status();


未命中快取,發起遠端連線並且接受mixer回覆.


     result->SetReponse(status, response);


     return result->Status();


程式碼解讀:


1.快取命中


檢查的入口在request_handler_impl.cc中,首先檢查enable_mixer_check開關是否開啟:


返回的值是SendCheck:


SendCheck的定義在client_context_base.cc中,這裡透過check跳轉到client_impl.cc中


在client_impl.cc中,首先先初始化,重置新的檢查選項,將檢查的計數都歸為0


這些選項的options定義在options.h中,這裡是設定了快取的大小num_entries和network_fail_open這個開關。


前文提到的Check的實現是CancelFunc MixerClientImpl::Check()這個函式。


這裡主要是呼叫了checkcache::check這個函式來進行檢查。


在沒有超時的情況下,如果匹配到了map的簽名(signature),並且在cache中命中。那麼這一條cache的elem的status會

返回result.status。在client_impl.cc中,判斷快取命中,完成check。


CheckResponseInfo在check_response.h中定義,儲存了check的結果回覆。其中is_check_cache_hit是來判斷這個

response是否是在快取中的,當命中時應該為true。


2. 快取沒有命中


如果在之前的check本地快取的狀態中返回的是Status(Code::NOT_FOUND, ""),就需要向mixer發起請求:


這裡是先將屬性進行compress,並且將這些屬性進行復制,給raw_check_result一個指標。


向mixer發起非同步的transport check請求,這個transport的定義在environment.h中。


將從mixer得到的response傳入到SetResponse中,得到result。


快取mixer的返回值:


在前文中提到的check NOT_FOUND時候,會像mixer發起請求,這裡的network_fail_open開關如果是true的話,那麼

對mixer請求不成功也會返回OK,如果返回狀態為ok()時,證明已經得到了mixer的response,利用CacheResponse進行緩

存(check_cache.cc):


需要先進行前置檢查,確認response的合法性。


然後檢查response得到的的map和cache中是否有重複,如果沒有重複,則插入新的map和快取元素cache_elem,返

回cache_elem的狀態。


3. 簽名計算


在referenced.h定義了2種key, 一種是exact_key,是請求時實際存在的key;一種是absence key,是mixer 的adapter用

到envoy卻沒有request的key,也就是預設的key:


計算簽名的實現在referenced.cc中,這裡首先在attributes map裡檢查absentkeys和exactkeys;是否都存在。


用函式CalculateSignature計算簽名,只對實際請求使用到的exactkeys的屬性進行簽名。


計算得到的雜湊值就可以用於的查詢reference map。


相關服務請訪問https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908804/viewspace-2636997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章