idou老师教你学Istio 28:istio-proxy check 的缓存

栏目: 后端 · 发布时间: 6年前

内容简介:功能概述istio-proxy主要的功能是连接istio的控制面组件和envoy之间的交互,其中check的功能是将envoy收集的attributes信息上报给mixer,在istio中有几十种attributes(官方文档中有Attribute Vocabulary的具体介绍), mixer根据自身的adapter给envoy 反馈。为了避免每次对mixer都进行远程调用,保证运行时的性能,在istio-proxy这里配置了本地缓存。具体实现

功能概述

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中:

idou老师教你学Istio 28:istio-proxy check 的缓存

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();

代码解读:

idou老师教你学Istio 28:istio-proxy check 的缓存

1.缓存命中

检查的入口在request_handler_impl.cc中,首先检查enable_mixer_check开关是否打开:

返回的值是SendCheck:

idou老师教你学Istio 28:istio-proxy check 的缓存

SendCheck的定义在client_context_base.cc中,这里通过check跳转到client_impl.cc中

idou老师教你学Istio 28:istio-proxy check 的缓存

在client_impl.cc中,首先先初始化,重置新的检查选项,将检查的计数都归为0

idou老师教你学Istio 28:istio-proxy check 的缓存

这些选项的options定义在options.h中,这里是设置了缓存的大小num_entries和network_fail_open这个开关。

idou老师教你学Istio 28:istio-proxy check 的缓存

前文提到的Check的实现是CancelFunc MixerClientImpl::Check()这个函数。

idou老师教你学Istio 28:istio-proxy check 的缓存

这里主要是调用了checkcache::check这个函数来进行检查。

idou老师教你学Istio 28:istio-proxy check 的缓存

idou老师教你学Istio 28:istio-proxy check 的缓存

idou老师教你学Istio 28:istio-proxy check 的缓存

在没有超时的情况下,如果匹配到了map的签名(signature),并且在cache中命中。那么这一条cache的elem的status会返回result.status。在client_impl.cc中,判断缓存命中,完成check。

idou老师教你学Istio 28:istio-proxy check 的缓存

CheckResponseInfo在check_response.h中定义,保存了check的结果回复。其中is_check_cache_hit是来判断这个response是否是在缓存中的,当命中时应该为true。

idou老师教你学Istio 28:istio-proxy check 的缓存

  1. 缓存没有命中

如果在之前的check本地缓存的状态中返回的是Status(Code::NOT_FOUND, ""),就需要向mixer发起请求:

idou老师教你学Istio 28:istio-proxy check 的缓存

这里是先将属性进行compress,并且将这些属性进行复制,给raw_check_result一个指针。

idou老师教你学Istio 28:istio-proxy check 的缓存

向mixer发起异步的transport check请求,这个transport的定义在environment.h中。

idou老师教你学Istio 28:istio-proxy check 的缓存

将从mixer得到的response传入到SetResponse中,得到result。

idou老师教你学Istio 28:istio-proxy check 的缓存

idou老师教你学Istio 28:istio-proxy check 的缓存

缓存mixer的返回值:

idou老师教你学Istio 28:istio-proxy check 的缓存

在前文中提到的check NOT_FOUND时候,会像mixer发起请求,这里的network_fail_open开关如果是true的话,那么对mixer请求不成功也会返回OK,如果返回状态为ok()时,证明已经得到了mixer的response,利用CacheResponse进行缓存(check_cache.cc):

idou老师教你学Istio 28:istio-proxy check 的缓存

需要先进行前置检查,确认response的合法性。

idou老师教你学Istio 28:istio-proxy check 的缓存

然后检查response得到的的map和cache中是否有重复,如果没有重复,则插入新的map和缓存元素cache_elem,返回cache_elem的状态。

  1. 签名计算

在referenced.h定义了2种key, 一种是exact_key,是请求时实际存在的key;一种是absence key,是mixer 的adapter用到envoy却没有request的key,也就是缺省的key:

idou老师教你学Istio 28:istio-proxy check 的缓存

计算签名的实现在referenced.cc中,这里首先在attributes map里检查absentkeys和exactkeys;是否都存在。

idou老师教你学Istio 28:istio-proxy check 的缓存

idou老师教你学Istio 28:istio-proxy check 的缓存

idou老师教你学Istio 28:istio-proxy check 的缓存

用函数CalculateSignature计算签名,只对实际请求使用到的exactkeys的属性进行签名。

idou老师教你学Istio 28:istio-proxy check 的缓存

计算得到的哈希值就可以用于的查找reference map。

相关服务请访问 https://support.huaweicloud.co ... _2019


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Approximation Algorithms

Approximation Algorithms

Vijay V. Vazirani / Springer / 2001-07-02 / USD 54.95

'This book covers the dominant theoretical approaches to the approximate solution of hard combinatorial optimization and enumeration problems. It contains elegant combinatorial theory, useful and inte......一起来看看 《Approximation Algorithms》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具