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
idou老师教你学Istio 28:istio-proxy check 的缓存的更多相关文章
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...
- idou老师教你学Istio 08: 调用链埋点是否真的“零修改”?
本文将结合一个具体例子中的细节详细描述Istio调用链的原理和使用方式.并基于Istio中埋点的原理解释来说明:为了输出一个质量良好的调用链,业务程序需根据自身特点做适当的修改,即并非官方一直在说的完 ...
- idou老师教你学Istio :如何用istio实现监控和日志采集
大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...
- idou老师教你学istio :基于角色的访问控制
istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...
- idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输
众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...
- idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...
- idou老师教你学Istio:如何用 Istio 实现速率限制
使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...
- idou老师教你学Istio :5分钟简析Istio异常检测
异常检测 异常检测和踢出异常主机是一个动态检查上游主机是否正常工作,对不健康主机进行移除的过程.异常检测是一种被动健康检查,根据返回状态码来判断是否满足移除条件,最后将主机移除,首先我们来了解下驱逐算 ...
随机推荐
- dede织梦5.7的安全防护设置
dede安全是一直令人堪忧的,但是其用来建网站很方便,如果我们使用dede来建站,一定要做好安全防护工作. 下面总结一下dede织梦5.7的安全防护设置 1.更改管理员名称和密码,尽可能设置的复杂一下 ...
- java中实现在线人数统计
//java 代码public class SessionCounter implements HttpSessionListener { private static int activeSessi ...
- 轮播图CSS
css3中的animation:动画名 持续时间 动画的速度曲线 动画开始之前的延迟 动画播放的次数 是否应该轮流反向播放动画 动画播放次数:n(定义应该播放多少次动画) : infinite(无限循 ...
- python之SQLite笔记
sqlite3 打开文件并创建游标 conn = sqlite3.connect('adressbook.db')c = conn.cursor() 连接对象:sqlite3.connect('数据文 ...
- scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
各位小伙伴大家好: 到上期我们学习了动作模块的全部指令.接下我们用动作模块做一个小小项目,来总结我们前面学的内容. 在做项目之前我们先来换一个背景. 在左下角舞台区,点击打开背景库,选择自己所需要的背 ...
- 基于Task的多线程
/// <summary> /// 基于Task的多线程 /// </summary> public class Tasks { public static void Task ...
- 学习嵌入式为什么要有uboot(深度解析)
ref:http://www.elecfans.com/d/617674.html 为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统. 典型的 ...
- ngix介绍
ngix能做什么? 1 反向代理 2 负载均衡 3 正向代理 4 HTTP服务器(动静分离) 1 反向代理 Reverse Proxy 是指以代理服务器来接受来自internet或者是客户端的连接请 ...
- (五)Hibernate的增删改查操作(2)
接上一章节 HQL的预编译语句 HIbernate中的预编译与Spring的预编译的处理差不多. 1:使用标准的? 2:使用命名参数 2.1:使用名称逐个设置. 2.2:使用Map(k ...
- (三)第一个 Hibernate项目
1.创建java工程,并导入hibernate所需要的jar包 2.通过IDE构建一个基础的Hibernate工程. 产生 hibernate.cfg.xml的框架总配置文件. H ...