功能概述

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. JS实现使用Math.random()函数生成n到m间的随机数字

    Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.random()w ...

  2. Zuul1与Spring Cloud Gateway对比

    一.API网关 1.1 Zuul1简介 1.2 Spring Cloud Gateway简介 二.对比 2.0 产品对比 2.1 性能对比 2.1.1 低并发场景 2.1.2 高并发场景 2.1.3 ...

  3. python 优雅的解析 jsonp

    一段 jsonp 格式数据 mtopjsonpweexcb1({"api":"mtop.taobao.idle.recycle.nextspunav.get", ...

  4. 【CUDA开发】论CUDA和LAV解码器是否真的实用

    先说配置,我电脑E3V3+GTX780TI视频就一个普通的720P AVC1编码MP4视频,实时检测软件是CPU-Z和GPU-Z,AIDA64[全默认设置]全部用ptoplayer默认播放时候,播放3 ...

  5. python argparse库

    argparse用法总结 https://blog.csdn.net/qq_24551305/article/details/90155858 args = parse.parse_args()par ...

  6. Redis集群部署与维护

    Redis集群部署与维护 目录: 一. 集群架构 二. 集群部署 1. 创建redis-cluster目录 2. 编译redis 3. 编辑redis配置文件 4. 配置redis集群 5. redi ...

  7. java--带参方法 递归阶乘

    package com.test.day01; // public class TestParam { public void f1(int n){ n =0; } public static voi ...

  8. 人机交互技术 Week 1_人机交互概述

    HCI Week 1_Introduction 18-19学年春夏学期选修了计院万华根老师的人机交互技术课程,老师由于知识产权相关原因不能提供课件,故尽可能对课程内容做详尽的课堂笔记以供复习,如有不妥 ...

  9. MySQL之创建用户和授权

    一 权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师会创建 ...

  10. 机器学习笔记--Hoeffding霍夫丁不等式

    Hoeffding霍夫丁不等式 在<>第八章"集成学习"部分, 考虑二分类问题\(y \in \{-1, +1\}\) 和真实函数\(f\), 假定基分类器的错误率为\ ...