Istio-proxy的report主要是将envoy采集到的连接attributes的信息上报给控制面的mixer,它的入口在request_handler_impl.cc文件中,这里需要打开enable_mixer_report开关,提取出report_data中的attribute信息,调用SendReport发送出去。

SendReport的实现在client_context_base.cc中,跳转到client_impl中。

client_impl.cc跳转到report_batch中。

report_batch.cc中会在batch_compresser中添加attributes作为向mixer发起的请求report,这里的Add是一个bool,判断是否所有的上次请求所用的attributes都在本次的report的请求中。

attribute_compressor.cc中定义了Add的方法,利用CompressByDict更新压缩过的attributes &pb,如果在这一步压缩的变量全部都在,那么compressbydict的返回值是true,会更新pb。如果有的attributes的变量不存在,那么返回值为false,不更新pb,回到上一张图。

Compress是否成功在下图的函数中判断,这里用到的是delta_update,在delta_update.cc中,也就是增量更新:

具体是最先Start(),这里会设置set变量prev_set_,将之前一次report的map中的index存入,然后调用Check,利用MessageDifferencer::Equals比较同一个index的值是否更新,如果更新就会刷新prev_map_中index对应的value。如果是新的index,那么会作为一个新的元素插入prev_map_,每次执行一次index的比较,就会删去prev_set_中当前的index值,直到执行完成所有的当前上报的attributes的index:

对于index的对应的value有更新,或者新的index的情况,Check返回false,会根据对应的值的属性添加到对应的map中,更新pb的值。

当所有的attributes都for循环完成之后,这个函数会返回delta_update.Finish(),也就是prev_set_中的index是否全部存在。如果全部存在都会被erase掉,此时set为空,返回true,证明CompressByDict完成。如果有值没有上报,那么返回值为false。

现在我们会回到report_batch.cc中,现在request已经压缩完成如果Add值为true,这时会判断compressor的尺寸是否大于等于预设的batch的大小,或是否超过了上报的max_batch_time,如果两者其中一个满足条件,就会调用FlushWithLock()像mixer发送report。

如果add的值为false,那么会将这条request之前的已经压缩好的信息调用FlushWithLock()先发送出去,然后再执行一遍Add操作,本次的request会在下一次report中发送出去。

max_batch_entries和max_batch_time_ms的默认值在options.h中,分别为1000条和1000ms。

在FlushWithLock中:

attribute_compressor.cc中用Finish()把dictionary中的message_words_添加上。

需要report的信息完整之后,reset_compressor,调用transport_把report的request发送给mixer,并且删除response。

如果发送的信息状态!ok,返回ERROR提示"Mixer Report failed with: ",并且将GlobalDictionary()重置大小。

相关服务请访问:https://support.huaweicloud.com/cce/index.html?utm_content=cce_helpcenter_2019

idou老师教你学istio 31:Istio-proxy的report流程的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    功能概述 istio-proxy主要的功能是连接istio的控制面组件和envoy之间的交互,其中check的功能是将envoy收集的attributes信息上报给mixer,在istio中有几十种a ...

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

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

随机推荐

  1. 【linux基础】ubuntu实现双屏显示

    前言 之前博主没有使用NVIDIA时候已经可以实现双屏显示(拼接类型),但是,安装NVIDIA驱动使用CUDA之后这个功能就消失了,需要重新配置. 实现方式 1. 使用Intel集成显卡时实现双屏拼接 ...

  2. 【机器学习之二】python开发spark案例

    环境 spark-1.6 python3.5 一.wordcount # -*- coding:utf-8 -*- ''' Created on 2019年5月13日 @author: Adminis ...

  3. IntellJ idea maven打包——项目带有第三方jar包

    今天用maven打包时,提示程序包com.aspose.slides不存在 原来第三方jar是直接导入的,打包时没找到 那项目中带有第三方jar包,怎么打包? 方法: 1.根路径建立lib包,将第三方 ...

  4. 使用memcpy函数时要注意拷贝数据的长度

    memcpy函数简介 memcpy函数是C/C++语言中的一个用于内存复制的函数,声明在 string.h 中(C++是 cstring).其原型是: void *memcpy(void *desti ...

  5. PHP 23种设计模式

    学习PHP,对设计模式永远是逃不掉的:今天把php23种设计模式及其demo好好整理如下: 记录PHP关于23种设计模式的简单Demo. Demo地址:https://segmentfault.com ...

  6. Java设计模式--代理模式+动态代理+CGLib代理

    静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...

  7. MySql 、Oracle 获取表结构和字段信息

    1.MySql获取表结构信息 SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.`TABLES` WHERE TABLE_SCHEMA ...

  8. linux net通信 基于密钥

    配置SSHD服务 SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式.在此之前,一般使用 FTP 或 Telnet 来进行远程登录 ...

  9. xorm -Get方法实例

    查询单条数据使用Get方法,在调用Get方法时需要传入一个对应结构体的指针,同时结构体中的非空field自动成为查询的条件和前面的方法条件组合在一起查询 package main import ( & ...

  10. jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例

    Jwt客户端存储状态可行性分析 1.前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorizat ...