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”通道,确保数据运输 ...
随机推荐
- Python3之类和实例访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面的Student类定义来看,外部代码还是可以自由地修改一个实例的na ...
- MyBatis 的案例
首先我们需要先下载jar包 其次我们书写具体的内容 Student Class package entity; /* * 学生类 * */ public class Student { //学生编号 ...
- Unity3D 原来Unity比较新的版本支持中文
注意: Unity 2018.2 以上版本才可以
- 帝国cms 批量替换语句
UPDATE www_92game_net_cnys_ecms_caipu SET titlepic=REPLACE(titlepic,'http://file.92game.net', '') ; ...
- JS 报错(intermediate value)(...) is not a function
- 7个步骤让PC网站自动适配手机网页
传统的网站如何完成向移动设备的快速转型? 通过移动适配技术可以实现,切图网是国内首家基于web技术服务的公司,而移动适配主要通过底层的web技术开发手段来完成,下面切图网将从技术角度来告诉你通过7个步 ...
- GBDT笔记
GBDT笔记 GBDT是Boosting算法的一种,谈起提升算法我们熟悉的是Adaboost,它和AdaBoost算法不同: 区别如下: AdaBoost算法是利用前一轮的弱学习器的误差来更新样本权重 ...
- c++学习(二)------this指针学习
在c++中,类的不同实例有自己的数据(储存在不同地方),有很多拷贝.而类的成员函数却只有一份备份. 而不同的类的实例却可以调用同一个函数,这是通过this指针来完成的. *this代表当前类本身,th ...
- excelize
// 参考:https://gitee.com/xurime/excelize // github.com/360EntSecGroup-Skylar/excelize
- 怎样修改原型对象prototype
修改原型对象的方法分为两种情况, 一种是对原型对象的属性方法做增删改, 一种改变原型对象的指向. 第一种: 对原型对象的属性/方法做增删改 function Person(name){ this.na ...