idou老師教你學Istio 28:istio-proxy check 的快取
功能概述
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- idou老師教你學istio 31:Istio-proxy的report流程
- idou老師教你學Istio:如何用 Istio 實現速率限制
- idou老師教你學Istio 23 : 如何用 Istio 實現速率限制
- idou老師教你學Istio 19 : Istio 流量治理功能原理與實戰
- idou老師教你學Istio 27:解讀Mixer Report流程
- idou老師教你學Istio :5分鐘簡析Istio異常檢測
- idou老師教你學Istio06: 如何用istio實現流量遷移
- idou老師教你學Istio 22 : 如何用istio實現呼叫鏈跟蹤
- idou老師教你學Istio 07: 如何用istio實現請求超時管理
- idou老師教你學Istio: 如何用Istio實現K8S Egress流量管理K8S
- idou老師教你學Istio :如何用istio實現監控和日誌採集
- idou老師教你學Istio 25:如何用istio實現監控和日誌採集
- idou老師教你學Istio05: 如何用Isito實現智慧路由配置路由
- idou老師教你學Istio 09: 如何用Istio實現K8S Ingress流量管理K8S
- idou老師教你學Istio 26:如何使用Grafana進行視覺化監控Grafana視覺化
- idou老師教你學Istio 17 : 透過HTTPS進行雙向TLS傳輸HTTPTLS
- idou老師教你學Istio 17 : 通過HTTPS進行雙向TLS傳輸HTTPTLS
- idou教你學Istio10 : 如何用Istio實現K8S Egress流量管理K8S
- 經濟學老師教你選大學專業的13個訣竅
- 老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚快取穿透
- 一份來自28歲老程式設計師的自白程式設計師
- 《老碼農教你學英語》讀者的經驗分享
- 十年經驗的老程式設計師:教你如何享受工作程式設計師
- 戴老師的學習驗收(一,二)
- 上海文華學院 Java老師Java
- 手把手教你做一個快取工具快取
- 手摸手教你解決重定向快取問題快取
- 驚喜Skr人,Istio的創始人Shriram Rajagopalan手把手教你如何使用IstioGo
- Guava學習:Cache快取Guava快取
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- Mars老師的Android學習基本路線Android
- 一個架構師的快取修煉之路架構快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 侯捷老師C++學習路線C++
- 張傳波老師Scrum學習心得Scrum
- 從CPU快取看快取的套路快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透