专栏首页CodeSheep的技术分享微服务调用链追踪中心搭建

微服务调用链追踪中心搭建

一个完整的微服务系统包含多个微服务单元,各个微服务子系统存在互相调用的情况,形成一个 调用链。一个客户端请求从发出到被响应 经历了哪些组件哪些微服务请求总时长每个组件所花时长 等信息我们有必要了解和收集,以帮助我们定位性能瓶颈、进行性能调优,因此监控整个微服务架构的调用链十分有必要,本文将阐述如何使用 Zipkin 搭建微服务调用链追踪中心。


概述

一个完整的微服务系统包含多个微服务单元,各个微服务子系统存在互相调用的情况,形成一个 调用链。一个客户端请求从发出到被响应 经历了哪些组件哪些微服务请求总时长每个组件所花时长 等信息我们有必要了解和收集,以帮助我们定位性能瓶颈、进行性能调优,因此监控整个微服务架构的调用链十分有必要,本文将阐述如何使用 Zipkin 搭建微服务调用链追踪中心。


Zipkin初摸

正如 Ziplin官网 所描述,Zipkin是一款分布式的追踪系统,其可以帮助我们收集微服务架构中用于解决延时问题的时序数据,更直白地讲就是可以帮我们追踪调用的轨迹。

Zipkin的设计架构如下图所示:

要理解这张图,需要了解一下Zipkin的几个核心概念:

  • Reporter

在某个应用中安插的用于发送数据给Zipkin的组件称为Report,目的就是用于追踪数据收集

  • Span

微服务中调用一个组件时,从发出请求开始到被响应的过程会持续一段时间,将这段跨度称为Span

  • Trace

从Client发出请求到完成请求处理,中间会经历一个调用链,将这一个整个过程称为一个追踪(Trace)。一个Trace可能包含多个Span,反之每个Span都有一个上级的Trace。

  • Transport

一种数据传输的方式,比如最简单的HTTP方式,当然在高并发时可以换成Kafka等消息队列


看了一下基本概念后,再结合上面的架构图,可以试着理解一下,只有装配有Report组件的Client才能通过Transport来向Zipkin发送追踪数据。追踪数据由Collector收集器进行手机然后持久化到Storage之中。最后需要数据的一方,可以通过UI界面调用API接口,从而最终取到Storage中的数据。可见整体流程不复杂。

Zipkin官网给出了各种常见语言支持的OpenZipkin libraries:

本文接下来将 构造微服务追踪的实验场景 并使用 Brave 来辅助完成微服务调用链追踪中心搭建!


部署Zipkin服务

利用Docker来部署Zipkin服务再简单不过了:

完成之后浏览器打开:localhost:9411可以看到Zipkin的可视化界面:


模拟微服务调用链

我们来构造一个如下图所示的调用链:

图中包含 一个客户端 + 三个微服务

  • Client:使用/servicea接口消费ServiceA提供的服务
  • ServiceA:使用/serviceb接口消费ServiceB提供的服务,端口8881
  • ServiceB:使用/servicec接口消费ServiceC提供的服务,端口8882
  • ServiceC:提供终极服务,端口8883

为了模拟明显的延时效果,准备在每个接口的响应中用代码加入3s的延时。

简单起见,我们用SpringBt来实现三个微服务。

ServiceA的控制器代码如下:

ServiceB的代码如下:

ServiceC的代码如下:

我们将三个微服务都启动起来,然后浏览器中输入localhost:8881/servicea来发出请求,过了9s之后,将取到ServiceC中提供的微服务接口所返回的内容,如下图所示:

很明显,调用链可以正常work了!

那么接下来我们就要引入Zipkin来追踪这个调用链的信息!

编写与Zipkin通信的工具组件

从Zipkin官网我们可以知道,借助OpenZipkin库Brave,我们可以开发一个封装Brave的公共组件,让其能十分方便地嵌入到ServiceA,ServiceB,ServiceC服务之中,完成与Zipkin的通信。

为此我们需要建立一个新的基于Maven的Java项目:ZipkinTool

  • pom.xml中加入如下依赖:
  • 编写ZipkinProperties类

其包含endpoint和service两个属性,我们最后是需要将该两个参数提供给ServiceA、ServiceB、ServiceC微服务作为其application.properties中的Zipkin配置

用了lombok之后,这个类异常简单!

【注意:关于lombok的用法,可以看这里

  • 编写ZipkinConfiguration类

这个类很重要,在里面我们将Brave的BraveClientHttpRequestInterceptor拦截器注册到RestTemplate的拦截器调用链中来收集请求数据到Zipkin中;同时还将Brave的ServletHandlerInterceptor拦截器注册到调用链中来收集响应数据到Zipkin中

上代码吧:

ZipkinTool完成以后,我们需要在ServiceA、ServiceB、ServiceC三个SpringBt项目的application.properties中加入Zipkin的配置:

以ServiceA为例:

我们最后依次启动ServiceA、ServiceB、和ServiceC三个微服务,并开始实验来收集链路追踪数据 !


## 实际实验

1. 依赖分析

浏览器打开Zipkin的UI界面,可以查看 依赖分析

图中十分清晰地展示了ServiceA、ServiceB和ServiceC三个服务之间的调用关系! 注意,该图可缩放,并且每一个元素均可以点击,例如点击 ServiceB这个微服务,可以看到其调用链的上下游!


2. 查找调用链

接下来我们看一下调用链相关,点击 服务名,可以看到Zipkin监控到个所有服务:

同时可以查看Span,如以ServiceA为例,其所有REST接口都再下拉列表中:

以ServiceA为例,点击 Find Traces,可以看到其所有追踪信息:

点击某个具体Trace,还能看到详细的每个Span的信息,如下图中,可以看到 A → B → C 调用过程中每个REST接口的详细时间戳:

点击某一个REST接口进去还能看到更详细的信息,如查看/servicec这个REST接口,可以看到从发送请求到收到响应信息的所有详细步骤:

后记

作者一些其他容器化应用方面的文章:

作者更多的原创文章:在此

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用Zipkin追踪Mysql数据库调用链

    CodeSheep
  • SpringBoot应用Docker化

    CodeSheep
  • Java编程思想学习录(连载之:一切都是对象)

    CodeSheep
  • CNN卷积神经网络的改进(15年最新paper)

    回归正题,今天要跟大家分享的是一些 Convolutional Neural Networks(CNN)的工作。大家都知道,CNN 最早提出时,是以一定的人眼生...

    深度学习思考者
  • [android] surfaceview的生命周期

    SurfaceView控件在内部维护了一个双缓冲的技术,使用两个线程进行解析帧和显示到界面上

    陶士涵
  • Python——量化分析常用命令介绍(一)

    当然也有对代码感兴趣的小伙伴,本来量化投资分析想告一段落,学个皮毛感觉已经收获匪浅。毕竟从头到尾捋一遍,然后到部署,估计也要三两个月的时间,万一中途碰到几个深坑...

    Ed_Frey
  • web桌面程序之锁屏功能分析

      第一点,“如何真正的实现锁屏”,浏览器有个特性,就是可以多开窗口(或tab标签页),这就意味着单纯的靠js和css进行html对象的操作,实现隐藏是不够的,...

    胡尐睿丶
  • Linux电源驱动-Linux Cpuidle Framework

    现如今,Linux处理器电源管理重点聚焦在处理器处于运行状态时对其进行电源管理,主要的技术是Cpufreq: 根据cpu的负载,实时的改变cpu的频率或这电压...

    DragonKingZhu
  • 深入理解浏览器:Chromium 多进程架构详解

    构建一个从不崩溃或挂掉的渲染引擎几乎是不可能的,构建一个完全安全的渲染引擎也几乎是不可能的。

    疯狂的技术宅
  • Linux上安装NTP SERVER实现时间校正

    配置时间源 vi /etc/ntp.conf server 210.72.145.44 server ntp.api.bz server 2.cento...

    菲宇

扫码关注云+社区

领取腾讯云代金券