功能概述

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

idou老师教你学Istio 28:istio-proxy check 的缓存的更多相关文章

  1. idou老师教你学Istio11 : 如何用Istio实现流量熔断

    在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...

  2. idou老师教你学Istio 07: 如何用istio实现请求超时管理

    在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...

  3. idou老师教你学Istio 08: 调用链埋点是否真的“零修改”?

    本文将结合一个具体例子中的细节详细描述Istio调用链的原理和使用方式.并基于Istio中埋点的原理解释来说明:为了输出一个质量良好的调用链,业务程序需根据自身特点做适当的修改,即并非官方一直在说的完 ...

  4. idou老师教你学Istio :如何用istio实现监控和日志采集

    大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...

  5. idou老师教你学istio :基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  6. idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

    众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...

  7. idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理

    本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...

  8. idou老师教你学Istio:如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

  9. idou老师教你学Istio :5分钟简析Istio异常检测

    异常检测 异常检测和踢出异常主机是一个动态检查上游主机是否正常工作,对不健康主机进行移除的过程.异常检测是一种被动健康检查,根据返回状态码来判断是否满足移除条件,最后将主机移除,首先我们来了解下驱逐算 ...

随机推荐

  1. iOS技术面试04:数据存储

    如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 编写SQL语句来操作原来表中的字段 1> 增加表字段 ALTER TABLE 表名 ADD COLUMN 字段名 字段类型 ...

  2. 2.app自动化测试--adb常用API

    adb常用API  Driver.current_activity 获取当前运行应用界面的启动名 Driver.current_package 获取当前运行应用的包名 Driver.contexts ...

  3. Python 动态规划算法

    背包问题 假设你是一个小偷,背一个可装4磅东西的背包.可盗窃的商品有如下3件: 音响,4磅,价值3000美元 笔记本电脑,3磅,价值2000美元 吉他,1磅,价值1500美元 为了让盗窃的商品价值最高 ...

  4. Windows 10 下使用 MinGW-w64 编译 OpenCV-4.1.1

    1. 下载安装 CMake 2. 下载安装 MinGW-w64,假设安装于 X:\path\to\MinGW-w64 此处注意选择 POSIX 版本而非 Win32 版本,因为 OpenCV 调用了标 ...

  5. vue告警信息:{ parser: "babylon" } is deprecated.

    告警信息: 13% building modules 28/40 modules 12 active ...dex=0!\src\App.vue{ parser: "babylon" ...

  6. Net上传文件

    Net上传文件 最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先 ...

  7. 深度学习-mnist手写体识别

    mnist手写体识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.t ...

  8. 三种redis数据导出导入方式

    推荐博客链接:https://www.cnblogs.com/hjfeng1988/p/7146009.html https://blog.csdn.net/qq_14945847/article/d ...

  9. [ZJOI2007]捉迷藏 (线段树,括号序列)

    大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...

  10. poj 3253 哈夫曼贪心

    http://poj.org/problem?id=3253 题意: FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods).开始时,FJ只有一块无限长的木板 ...