00:00
前面我们使用sna对我们整个系统做了流量保护,熔断降级功能,那现在我们再来说s spring cloud里边我们最后一个组件slo加zip,他呢来帮我们来做分布式系统的服务链路追踪,那这个东西是什么?那现在来想象一个问题,我们这个分布式系统庞大而复杂,我们abcd服务众多,他们的调用关系网也非常复杂,那就会出现我们在服务一上线以后,如果一旦出现了某一些错误,这个错误的异常很难定位,这是第一个。第二个我们一个请求呢,可能调用了非常多的链路,哪一块到底出现了错误,我们也需要知道,从最终呢,希望有一个链路追踪系统,我们从每一个请求进来到它最终的结束,他们中间都调用了多少的微服务,包括每一个服务调用耗费了多长时间,只有我们最终结合了链路追踪系统,我们才可以做好熔断降级。我们通过链路追。
01:00
从系统发现,诶这个服务呢特别慢,但是它还正常运行着,我们就给它直接降级使用,来保证我们整个系统预防他们的血崩问题,所以谓现在呢,就非常有必要在分布式系统里边构建一个服务链路追踪系统,这个链路追踪系统呢,我们这个开源的组件也非常多,然后我们现在用的是Twitter开源的这个zip k,当然还要结合wa cloud的SLO2个一起使用,阿里的这个鹰眼也是非常优秀的。那么这个想要使用开源的服务链路追踪组件,我们先来说几个基本的术语,第一个数据span,我们称为跨度,跨度呢它是一个基本的工作端元,我们发送一个远程调度任务的时候,比如我们来A来调用B,再来调用C,那么这一个远程调度的候,那span呢,就会产生一个span span是一个64位的ID标识,T是我们的跟踪,跟踪呢又是一个64位的ID标。
02:00
标,我们说每一个调度就会产生一个span,所以ABC那就会有三个span,但是呢,Tra是一个唯一的ID标识,它呢是以V唯一的,因为它要追踪整个链路,SPA呢有三个,我们每一个SPAT这是固定的,我们通过它来跟踪我们整一系列的SPA,相当于一系列的服务,然后接下来还有一个叫noation标注,这个标注就是来及时记录一个事件,比如我们这些标注呢,相当于就给我们这个SPA打一些标签,我们这个标注呢,包括这些,第一个叫CSCS呢叫client sent,就是我们客户端发送一个请求,比如我们现在呢A。BC,我们现在呢,有三次调用构成一个完整链路,那每一次调用产生一个span,那这个span上呢,会打一些标签,而且呢,如果是同一链路,SPA的串ID是一样的,然后呢,每一次调用会打一个标签,这个标签呢有这么四个,CS是客户端发一个请求,比如我们刚发了A,那这个SPA上呢,就有一个标签叫CS,那这个CS呢,就描述的是我们开始时间,比如我们叫开始时间,还有一个SR server receive,那就是我们接收到的时间,我们要给AR请求,那肯定是浏览器在这儿来发我们这个服务呢,什么时候接收到这个请求,那就有一个SR,那大家想我们这个SR的时间,因为这是一个时间戳,请求呢发过来,他发的时候呢,我们也不管他从哪个服务过来的,反正他打了一个标,这叫CS,到我们这儿接收了,我们再打一个标志叫SSSS叫server received,我们接收了,那这两。
03:45
两个时间戳一减,那就是我们这个请求传过来的这个网络传输时间,然后呢,接下来我们这个server处理完了以后,然后又要把请求发出去,比如我们可以发给下一个链路,所以我们这个往出发的时候,又一个叫SS,诶我们之前那个叫SR server received刚收过来的时间,那SS就叫server sent,我们这个发送出去的时间,那这个发送出去的时间呢,如果我们这个时间戳减去SR的时间戳,那正好就是我们这个服务被我们这个处理了多长时间,然后我们发出去以后,我们发出去以后呢,由另外一个服务接收,或者由别人的浏览器接收也行,他只要呢,客户端收到以后,又会有一个叫CRCR呢就是我收到这个请求的时间,那这样我们的CR减去SS,那就是两个微服务之间网络传递用的这个时间。
04:45
所以呢,我们一个SPA会打印一些标签,所以我们整个的调用顺序,假设我们是这样的,那service一会调用一个SERVICE2 service2呢会调用SERVICE3,调用SERVICE4,那如果用我们以上的概念把完整的叙述出来,那就是这样,这个东西呢,我们完全可以参照spring cloudlo的这个官方文档,这个文档里边呢,也有这个高清大图,我们来看这个高清大图吧,那一直往下翻,我们来看一下它这一块的整个高清大图,那描述我们刚才的流程就是这样,首先request请求发过来,我们现在呢,这是浏览器,浏览器发给SERVICE1,我们每一个请求一进来呢,产生一个SPA,这就是我们这个SPA,然后这个span呢,记录了一下串ID,注意这个串ID呢是X,我们给这个请求给了一个标志叫X,随便可能是一串UUID,然后呢,接下来span ID是A,那我们这个请求呢,产生了一个span ID,然后还有一个我们现在呢,有一个标识。
05:45
由于我们这个是浏览器发的,他肯定不会给我们打一个什么叫CS标识,Client send客户端啥时候发的,所以现在呢,刚收到请求,有一个标识叫serve receive,就叫SR,代表我这个请求啥时候收到了,那我收到以后呢,我这个SERVICE1我就进行处理,处理完了以后,由于我要调SERVICE2,所以我请求呢再发出去,那再发出去以后呢,我们在发送请求的时候,请求只要一出去,我们产生一个span span呢现在叫B,因为我们现在两个span不一样了,只要服务不一样,那就不一样了,那这个B呢,是这个SPA,这个SPA呢。
06:22
现在有一个时间叫client sent,因为我们这个服务啊,他收到请求打了一个时间叫SR,然后呢,他发出去又打了一个请标签叫CS,它发出去的时间,然后呢,我们这个请一发出去,来到SERVICE2的时候,SERVICE2呢又会来进行处理,这个处理呢,由于请求一直传到这儿,他自己处理,那整个呢没有经过别人,所以呢,这个span还是span b span b呢就会有一个标志叫SRSR代表service receive的,我们这个SERVICE2什么时候收到这个请求,那这样我们的SR把这个CSSCS是SERVICE1打的标签两个一减,那就是我们中间的传输时间,好,那假如我们SERVICE2收到了,SERVICE2收到以后呢,它又将请求要发出去,然后呢,他发出去是两个并发发,所以我我们这个请求收到在我们这儿处理呢,生成一个span c,但是整个要发出去两个并发发就生成两个不同的SPA,一个是span d。
07:22
一个是我们将要发出去的F,这两个F呢,分别记录了每一个时间client client好,这两个请求呢,发出去第一个调了SERVICE3 service3也一样,请求进来到他他这,他呢收到请求打一个标志叫SR收到了,他要处理产生一个SPA,然后呢,他处理完了将要发出去了,那整个处理完呢,他发出去了,其实还是将原来的老请求要发出去,所以将这个SPAD那正中间的这个处理过程由为我们不进行链路的再一次派发,这个SPA我们就可以丢失了,不要了,然后呢,我们接下来。我们收到的时间SR,然后我们处理完了以后呢,我们就给它发出去叫SS,我们打一个标签server sent,我们把这个请求呢发出去了,那这两个时间一减,又是我们SERVICE3处理请求的时间,那发出去以后呢,会给我们SERVICE2给一个响应,因为请求呢刚过来是SPAD这个标签,处理完了以后呢,响应的也是这个span d标签,整个一个请求处理过程,这是一个完整的span d标签里边又打一个标识叫CRCR呢那就是客户端,那就是SERVICE2收到的这个请求时间。
08:33
好,这个请求时间一收到以后呢,我们SERVICE3这块请求就有了,我们链路呢,相当于能追踪到这几个AB-C到DC呢是直接丢弃,我们可以不用它只是一个业务处理,发出去呢才算好,我们杠DB呢,回来这是第一个链路,那第二个链路我们A呢发出去到BB呢,除了给D发外,它还掉了SERVICE4,所以呢又产生一个SPA f service4呢,我们只要请求E发给SERVICE4,我发出去这一刻打一个标签叫CS客户端的发送时间发到SERVICE4了,SERVICE4接收到了,打一个标签SR,我们服务的接收时间,两个一见又是传输时间,所以我们就可以通过这个传输时间来看是网络慢了还是我们服务慢了等等,我们都可以来判断,然后呢,我们打假设现在达到了SERVICE4,我们这个请求打到这,现在呢,开了一个SPA,叫SPAF了,我们在这处理,处理完了我们这一块标签就可以丢弃了,来到我们这一块service们整个处。
09:33
对,完了以后发出去还是我们这个F标签,我们打了一个标志,这两个一剪,如果时间超长,那就是我们服务卡了,如果这两个一剪很短,但是这两个一剪长,那就是网络卡了,所以我们就可以通过这些能快速的判断我们到底是哪一块出现故障,那么这块处理完了以后呢,它又把我们这个响应发出去,那这个SPAF整个处理流程呢,就结束了,整个这个处理流程结束呢,又回归给我们的B,所以呢,B的链路的两个流程,AB到D一个,AB到F一个,那么这两个链路呢,全部能追踪过来,包括链路中间的传输时间,每一个服务的处理时间,因为都打了标签,所以我们都能得到这些数据,这是我们整个链路的这个效果,而且呢,大家注意,这span呢,我们分为父子,也分父子关系。
10:23
这个父子关系呢,是这样子的,我们这个AB标签,由于这是一个起始的A,然后和B这两个呢,我们是一连串过来的,但在AB下呢,我们又开了个CD,而且呢,每一个下级标签,它的副标签呢,都是上级标签。所以大家注意一有这个附子以后呢,其实我们就能画出整个调用链的树形结构了,包括它的链路结构也都没问题,所以标签的父子关系就是这样按照顺序来的,大家注意一下就行,那有了这些基本概念,我们就可以来整合zip加slo来完成我们的服务链路追踪,那怎么整合呢?直接参照我们的文档,想要整合lo,我们服务的提供者和消费者都应该依赖,因为我们现在要统计A调到B,调到C,然后呢,CEO回来的B回来A,所以我们全服务都应该做链路追踪,所以我们直接就把这一块我们就导到我们的common项目里边,Conr c我复制过来,来到我们的这个common项目,因为common项目呢,我们要倒,我们这块呢,又没有spring cloud的这个版本,依赖,你就随便从一个项目里边,我们复制一个spring cloud的这个dependency,把这个复制过来,C,我们复制过来,这是我们这个spring cloud dependency这个依赖,然后我们来到common里边,那跟阿里cloud我们放在一起。
11:39
写这个版本号呢,我们也拿过来,把它这一块呢直接复制写死格林威志的这个版本,CTRLC,好,我们现在放到这儿,我们先拿到spring cloud的整个依赖管理,然后我们呢,我们现在给我们common里边先来引入我们的链路追踪,链路追踪的第一个sloth,我们来把这个依赖呢直接复制过来。
12:02
Conr c来复制过来,那么这个solution拿过来这个版本呢,就不用写了,因为我们在下边已经引了spring cloud dependency这一块的依赖,那这个S我们拿过来以后,然后呢我们还要加入这个zip,这两个是什么关系?Slo是追踪链路,而zip呢是一个可视化操作,那么现在假设那们先引入了S,我们不加zip,我们来看一下效果,为了这个效果明显,期间只要它每一次发生一个远程调用,我们这块呢都会打印相应的这个标签电路,这个电路呢,其中串ID前面这个FF5,这就是串ID,还有我们里边的整个SPA这一块呢,都会打印出来,我们现在呢,就来把它的这个debug日志的debug打开,我就能看到这一块,那我们在这儿呢,只要一加入以后,我们来到每一个微服务行,假设呢,我们就先来到我们的这个服务。商品服务,我们来商品服务呢,给它开一下日志在这儿,我来开上两个日志,我们再配置在这儿吧,好来开启debug日志,这个日志呢,是自己在控制台看一下,我们上线就关了,好开启debug咱们这个日志。
13:14
主要呢,Log log,那么这个debug呢,有两个地方要debug,一个呢,是我们来让open phone,我们粪的远程调用打一个debug,我们每一次远程调用我们就知道是什么了,它呢这个日志等级是debug模式,然后呢,第二个我们这个日志等级呢,就是我们的这一块。Solution的这一块,我们让它的日志呢,也打印为debug走,我们等于debug,这样我们把这两个呢,在每一个服务里边都复制过来,我现在就不在每一个复制了,我就直接在我们的这个秒杀里边,我复制过来,好我在这个秒杀,因为我们查看商品详情页,他呢要查我们当前商品是不是参与秒杀的,所我们能追踪到这个链路,好把这个呢也整过来,然后呢,我把秒杀项目和我们的商品服务我们全部启动起来,好,我们现在呢,商品服务已经启动成功,包括我们再来看一下我们的秒杀服务,保证这两个呢先都启动没报错,然后我们直接来查看商品详情页,我们看一下追踪的效果,我们商品详情页呢,我来查行询一号商品。
14:25
好,这个详情页呢,调用了来看我们商品服务的控制台,诶我们看到控制台呢,其实有打印我们这个链路追踪信息,那前面呢是我们的追踪ID,后边是我们的弹,所以每一个呢都有,而且呢,我们整个这个请求呢,它的这四步呢,这是同一个东西,包括如果我们这个秒杀服务,那请求要发过来,我们秒杀服务其实也应该打印那个追踪信息,因为我们远程调用的秒杀服务,当然呢,这一块呢没打印,那没打印呢,我们先不管了,我下节课直接来整合一个可视化界面,我们来运行一下。
我来说两句