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

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

内容简介:功能概述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


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

查看所有标签

猜你喜欢:

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

敏捷软件开发

敏捷软件开发

马丁 / 邓辉、孙鸣 / 人民邮电出版社 / 2008-01-01 / 69.00元

《敏捷软件开发:原则模式和实践(C#版)》不仅是一部深入浅出、生动易懂的面向对象原则与设计模式著作。而且还是一部通俗的敏捷方法导引书和快速实用的LJML教程。通过《敏捷软件开发:原则模式和实践(C#版)》你会发现,许多以前看起来非常枯燥费解的概念,忽然间都豁然开朗。变得鲜活生动起来。 C#版与此前的Java版相比,主要的更新包括加强了UML的介绍章节。使其更加贴近实战;增加了对MVP模式的介......一起来看看 《敏捷软件开发》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具