1 分布式追踪系统

随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了。架构更复杂、应用更多,要从中快速诊断出问题、找到性能瓶颈,并不是一件容易的事。因此,也随着诞生了一系列面向DevOps的诊断与分析系统,主要是以下三个系统:

  • 集中式日志系统(Logging)
  • 集中式度量系统(Metrics)
  • 分布式追踪系统(Tracing)

三者相互交织重叠如下:

技术栈上的成熟框架有,

Logging:Log4j、ELK等,

Metrics:Prometheus、InfluxDB、Grafana等

Tracing:Jaeger和Zipkin等。

分布式追踪系统在Google发表一篇文章Dapper, a Large-Scale Distributed Systems Tracing Infrastructure后快速发展。Tracing系统一般核心步骤有三个:代码埋点、数据存储、查询展示。

历史洪流滚滚向前,大浪淘沙,现在比较流行的有JaegerZipkin

2 OpenTracing

由于Tracing的技术发展迅速,为了解决兼容性问题,有了OpenTracing规范。它是一个轻量级的标准化层,连接应用、类库和追踪系统。

OpenTracing的优势:

(1)OpenTracing已经进入CNCF(云原生计算基金会,口号是坚持和整合开源技术来编排容器作为微服务架构的一部分),正在为全球的分布式追踪,提供统一的概念和数据标准。

(2)OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便添加和更换追踪系统的实现。

2.1 相关概念

Trace:贯穿一个分布式系统的事务追踪描述,其实就是由许多个Span组成的有向无环图。

Span:被命名的与记录时间的调用操作,如一个Http GET请求;Span有嵌套关系,如果一个请求会调用其它服务,就会生成子Span

Tag:一组由键值对构成的标签集合,键值类型必须为字符串。它可以带上许多有用信息,如请求方法、请求URL、返回状态码等。

Log:一组Span的日志集合。

2.2 OpenTracing的实现

JaegerUber推出的一款开源分布式追踪系统,兼容OpenTracing API。架构如下:

Zipkin是由Twitter推出的开源的分布式追踪系统,架构图如下:

3 实战整合

本文以Springboot为Web项目,分别整合JaegerZipkin

3.1 Springboot项目准备

项目中的Controller,提供了两个Endpoint,tracingopen;在访问open时,代码会调用tracing

@RestController
public class TracingController {
@Autowired
private RestTemplate restTemplate; @Value("${server.port}")
private int port; @RequestMapping("/tracing")
public String tracing() throws InterruptedException {
Thread.sleep(100);
return "tracing";
} @RequestMapping("/open")
public String open() throws InterruptedException {
ResponseEntity<String> response =
restTemplate.getForEntity("http://localhost:" + port + "/tracing",
String.class);
Thread.sleep(200);
return "open " + response.getBody();
}
}

为了能够方便看出调用时长信息,特别在代码中增加了延时Thread.sleep()

配置Web应用的端口和服务名字:

server.port=80
spring.application.name=opentracing-demo

3.2 整合Jaeger

3.2.1 Springboot整合

引用依赖:

<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-web-starter</artifactId>
<version>3.1.1</version>
</dependency>

配置连接属性:

opentracing.jaeger.enabled=true
opentracing.jaeger.udp-sender.host=localhost
opentracing.jaeger.udp-sender.port=6831

3.2.2 Docker运行Jaeger

为了方便,使用docker来运行Jaeger

# 拉取jaeger镜像
docker pull jaegertracing/all-in-one:1.17
# 运行jaeger实例,
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.17

以上端口的信息如下:

3.2.3 运行与访问UI

启动Web应用和Jaeger后,访问服务:

http://localhost/open

http://localhost/tracing

访问Jaeger UI界面http://localhost:16686/,设置好查询条件后点击Find Traces,就能查看到Trace信息了,具体如下:

选择一条Trace点进去后,可以看到详细信息,非常有利于我们分析,具体如下:

3.3 Zipkin

3.3.1 Springboot整合

引用相关依赖:

<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-zipkin-web-starter</artifactId>
<version>0.1.4</version>
</dependency>

配置相关连接信息:

opentracing.zipkin.enabled=true
opentracing.zipkin.http-sender.base-url=http://localhost:9412/

3.3.2 Docker运行Zipkin

通过Docker运行Zipkin实例:

# 拉取Zipkin镜像
docker pull openzipkin/zipkin:2.21
# 运行Zipkin实例
docker run -d -p 9412:9411 openzipkin/zipkin:2.21

因为本机的端口9411已经被Jaeger的docker实例占用,所以改为9412。

3.3.3 运行与访问UI

启动Web应用和Zipkin后,访问服务:

http://localhost/open

http://localhost/tracing

访问Zipkin UI界面http://localhost:9412/zipkin/,设置好查询条件后点击查询,就能查看到Trace信息了,具体如下:

选择一条Trace点击进去,同样可以看到许多详细信息,这里不在展示。

4 总结

本文通过代码案例详细讲解了Springboot整合OpenTracing的两个实现(JaegerZipkin),demo的代码可关注公众号后台回复”OpenTracing“获取。

参考链接:

OpenTracing概念:https://opentracing.io/docs/overview/tags-logs-baggage/

Jaeger架构图:https://www.jaegertracing.io/docs/1.17/architecture/

Zipkip架构图:https://zipkin.io/pages/architecture.html

Jaeger Docker信息:https://www.jaegertracing.io/docs/1.17/getting-started/

Zipkin Docker信息:https://hub.docker.com/r/openzipkin/zipkin

Jaeger Spring整合项目:https://github.com/opentracing-contrib/java-spring-jaeger

Zipkin Spring整合项目:https://github.com/opentracing-contrib/java-spring-zipkin


欢迎关注公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)的更多相关文章

  1. 分布式链路追踪系统Sleuth和ZipKin

    1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...

  2. Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈

    导读 微服务架构中,是否遇到过这种情况,服务间调用链过长,导致性能迟迟上不去,不知道哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶 ...

  3. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

    对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...

  4. SkyWalking+SkyApm-dotnet分布式链路追踪系统

    SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...

  5. 基于zipkin分布式链路追踪系统预研第一篇

    本文为博主原创文章,未经博主允许不得转载. 分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Infras ...

  6. zipkin分布式链路追踪系统

    基于zipkin分布式链路追踪系统预研第一篇   分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...

  7. 使用Skywalking分布式链路追踪系统

    使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...

  8. Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

    分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢 ...

  9. Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)

    技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...

随机推荐

  1. 7-10 jmu-python-异常-学生成绩处理基本版 (15 分)

    小明在帮老师处理数据,这些数据的第一行是n,代表有n行整数成绩需要统计.数据没有错误,则计算平均值(保留2位小数)并输出.数据有错误,直接停止处理,并且不进行计算. 注:该程序可以适当处理小错误,比如 ...

  2. 使用web写UI, 使用js对接C++项目, 提高开发效率

    ppt资源下载地址https://www.slidestalk.com/s/webui_nodejs_cmdlrx

  3. Java基础--选择排序

    每一趟从待排序的数据元素中选出最小(或最大的)一个元素, 顺序放在已排好的序的数列的最后,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法. 选择排序的时间复杂度为 O(n^2). 第一次需 ...

  4. python之函数介绍

    # 函数 # 什么是函数: 能完成特定功能的工具,在Python中表示能完成特定功能的代码块.(函数定义) # 为什么要用函数 :①函数可以重复调用出来,效率高,而且维护成本低 ②使程序结构看起来清晰 ...

  5. cmd 输入输出

    cmd 输入输出 首先在编写如: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> vo ...

  6. javascript中的中介者模式——迪米特法则

    ”迪米特法则“——最少知识原则,不和陌生人说话,就是说,一个对象应当对其他对象有尽可能少的了解.talk only to your immediate friends.初衷是:降低对象之间的耦合度. ...

  7. 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库

    一.题目来源     题目来源:XCTF app3题目 二.解题过程     1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示:     2.什么是.ab文件?.ab后缀名的文件是Andr ...

  8. Git使用ssh公钥

    Git使用ssh公钥 一.  何谓公钥 1.很多服务器都是需要认证的,ssh认证是其中的一种.在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名和密码了. 2.很多gi ...

  9. scrapy-redis分布式爬取知乎问答,使用docker布置多台机器。

    先上结果: 问题: 答案: 可以看到现在答案文档有十万多,十万个为什么~hh 正文开始: 分布式爬虫应该是在多台服务器(A B C服务器)布置爬虫环境,让它们重复交叉爬取,这样的话需要用到状态管理器. ...

  10. TCP数据报结构以及三次握手(图解)

    简要介绍 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.客户端在收发 ...