idou老师教你学Istio 22 : 如何用istio实现调用链跟踪
大家都知道istio可以帮助我们实现灰度发布、流量监控、流量治理等一些功能。
每一个功能都帮助我们在不同场景中实现不同的业务。那么其中比如流量监控这种复杂的功能Istio是如何让我们在不同的应用中实现呢?
因篇幅所限,我们今天重点介绍Istio里面实现这些功能的关键技术--调用链跟踪。
虽然 Istio 代理能够自动发送 Span 信息,但还是需要一些辅助手段来把整个跟踪过程统一起来。应用程序应该自行传播跟踪相关的 HTTP Header,这样在代理发送 Span 信息的时候,才能正确的把同一个跟踪过程统一起来。在Istio中的Sidecar里面已经实现了埋点的逻辑,业务代码不用调用以上这些埋点方式来创建trace,维护span等这些复杂逻辑,但是为了能真正形成一个完整的链路,业务代码在某些场景下还是需要做适当修改。
1
服务调用关系
为了便于大家理解,我们以Istio最经典的Bookinfo为例来说明。Bookinfo的4个微服务的调用关系如下图所示,在这里我们不就具体阐述了。

然后我们要弄明白几个问题:什么是调用链跟踪?为什么要用调用链跟踪?
调用链跟踪顾名思义就是服务与服务之间相互调用的时候,来记录下调用的关系。比如用户发起请求访问Ingress,这是入口。然后Ingress——>Productpage——>Reviews——>Ratings这是一个完整的调用链,而这个过程中的谁调用谁的关系就是调用链跟踪。
当我们获得了服务之间调用的关系,就可以对流量状况进行一个微观监控。比如当我们发现流量异常时,通过调用链跟踪我就可以清晰的知道流量异常出现在哪一块服务调用中,又或是提取调用中的响应时延等等。
2
如何实现
在上文中,我们说Istio要实现调用链跟踪需要去修改用户的代码,其实就是采用一种被称为埋点的方法。
在Istio中对于经过sidecar流出的流量,如例子中ingress调用productpage,或者productpage调用details和reviews的请求。如果经过sidecar时header中没有任何跟踪相关的信息,则会创建根span,并将该根span相关上下文信息放在请求头中传递给下一个调用的服务,当然调用前会被目标服务的sidecar拦截掉执行上面流入的逻辑;当存在trace信息时,sidecar从header中提取span相关信息,并基于这个span创建子span,并将新的span信息加在请求头中传递。
如下所示就是需要在请求头中传递的字段信息,包括traceid、spanid等。被调用的服务接收trace相关的header并在请求时发送出去,这样在出流量的proxy向下一跳服务发起请求前才能判断并生成子span并和原span进行关联,进而形成一个完整的调用链。否则,如果在应用容器未处理Header中的trace,则Sidecar在处理outbound的请求时会创建根span,最终会形成若干个割裂的span,并不能被关联到一个trace上。这就是为何需要部分的修改应用代码。
x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context
3
业务场景
最后让我们看一下实现了调用链跟踪的一些具体场景,如下图所示:

从上图中可以看到在某种场景下的所有应用、实例名称、状态以及总调用耗时、traceID等信息,这些信息给我们提供了最直观的调用数据,点击查看调用关系,将会看到更加详细的调用链信息。如下图:

从这张图中,我们可以监测到不同服务间更加详细的调用数据。
如该调用链包含三个应用,最大调用深度为2,不同应用直接调用的耗时以及应用状态等,这些都是在实际场景中非常具有价值的信息。设想在一个大规模高并发以及巨大访问量的业务中,如果我们可以对业务的监测可以细化到这种程度,那么我们的业务将会处于更加安全的保护中。

通过以上场景以及扩展信息我们就可以清晰的看到服务之间调用的具体信息,例如请求状态、响应时延等等,而这些信息都是通过调用链跟踪获取的。
相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019
idou老师教你学Istio 22 : 如何用istio实现调用链跟踪的更多相关文章
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...
- idou老师教你学Istio 20 : Istio全景监控与拓扑
根据Istio官方报告,Observe(可观察性)为其重要特性.Istio提供非侵入式的自动监控,记录应用内所有的服务. 我们知道在Istio的架构中,Mixer是管理和收集遥测信息的组件.每一次当请 ...
- idou老师教你学Istio 08: 调用链埋点是否真的“零修改”?
本文将结合一个具体例子中的细节详细描述Istio调用链的原理和使用方式.并基于Istio中埋点的原理解释来说明:为了输出一个质量良好的调用链,业务程序需根据自身特点做适当的修改,即并非官方一直在说的完 ...
- idou老师教你学Istio 04:Istio性能及扩展性介绍
Istio的性能问题一直是国内外相关厂商关注的重点,Istio对于数据面应用请求时延的影响更是备受关注,而以现在Istio官方与相关厂商的性能测试结果来看,四位数的qps显然远远不能满足应用于生产的要 ...
- idou老师教你学istio1:如何为服务提供安全防护能力
之前,已为大家介绍过 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”通道,确保数据运输 ...
随机推荐
- iOS笔试题04
1. Object-C有多继承吗?没有的话用什么代替? 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私 ...
- django model的update时auto_now不被更新的原因
gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...
- 使用说明(2S)
[Build Status] 功能 系统代理设置 PAC 模式和全局模式 [GFWList] 和用户规则 支持 HTTP 代理 支持多服务器切换 支持 UDP 代理 支持插件 下载 下载 [最新版]. ...
- CF C.Ivan the Fool and the Probability Theory【思维·构造】
题目传送门 题目大意: 一个$n*m$的网格图,每个格子可以染黑色.白色,问每个格子最多有一个相邻格子颜色相同的涂色方案数$n,m<=1e5$ 分析: 首先,考虑到如果有两个相邻的格子颜色相同, ...
- 移动架构-UML
UML(Unified Modeling Language),UML规范用来描述建模的概念有,类(对象的).对象.关联.职责.行为.接口.用例.包.顺序.协作,以及状态.这里对UML做一个简单介绍 前 ...
- 最新 创梦天地java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.创梦天地等10家互联网公司的校招Offer,因为某些自身原因最终选择了创梦天地.6.7月主要是做系统复习.项目复盘.Leet ...
- 【转帖】循序渐进Oracle:数据库的字符集和字符集文件
循序渐进Oracle:数据库的字符集和字符集文件 https://blog.csdn.net/Enmotech/article/details/100869162 2019年09月15日 18:23: ...
- WCF-复杂配置
两种模式,一个契约两个实现,两个契约一个实现. 服务类库 宿主 static void Main(string[] args) { ServiceHost sh1 = new ServiceHost( ...
- 【C++札记】指针函数与函数指针
指针函数 指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针. 格式: 类型名* 函数名(函数参数列表) 如下代码存在问题 void test(char *p) { p = (char*)m ...
- 【C++札记】new和delete
介绍 1.malloc,free和new,delete区别. a.malloc,free是C/C++的标准库函数.new,delete是c++的操作符. b.malloc申请的是内存,严格意义不是&q ...