使用 Spring Cloud Jaeger 进行分布式跟踪
在本文中,学习如何实现 Jaeger(基于 OpenTracing 和 Spring Boot 应用程序)以及如何使用 Jaeger UI 可视化跟踪。
介绍
在本文中,我们将探讨如何使用 Jaeger 实现分布式跟踪以及如何使用 Jaeger UI 可视化跟踪。
Jaeger 是一种开源分布式跟踪机制,有助于跟踪分布式系统中的请求。它基于OpenTracing规范,是云原生计算基金会 (CNCF)的一部分。
有了这个,让我们看一些代码。
实施 Jaeger 跟踪
我们从https://start.spring.io创建一个只有一个“Spring Web”依赖项的应用程序。
生成并下载代码后,我们会将以下 Jaeger 依赖项添加到 pom 文件中,这将有助于在服务之间生成和传播跟踪。
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.3.1</version>
</dependency>
有了这个,让我们添加一个带有一些路径的控制器。
@RestController
@RequestMapping("/service")
public class Controller {
private static final Logger logger = LoggerFactory.getLogger(Controller.class);
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String applicationName;
public Controller(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/path1")
public ResponseEntity path1() {
logger.info("Incoming request at {} for request /path1 ", applicationName);
String response = restTemplate.getForObject("http://localhost:8090/service/path2", String.class);
return ResponseEntity.ok("response from /path1 + " + response);
}
@GetMapping("/path2")
public ResponseEntity path2() {
logger.info("Incoming request at {} at /path2", applicationName);
return ResponseEntity.ok("response from /path2 ");
}
}
在这里,我们有两个端点:/path1和/path2。这里的想法是使用同一应用程序的两个实例,以便在固定端口 8090/path1调用另一个服务。/path2
为了使跨度连接到相同的跟踪 ID,我们需要创建一个 RestTemplate bean 以允许 Jaeger 包含一个拦截器。然后,这有助于向传出请求添加跟踪,这将有助于跟踪整个请求。
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
完成后,让我们使用 Docker 在本地启动 Jaeger 服务器。为此,我创建了一个带有端口映射的 Docker Compose 文件。
version: "3.3"
services:
jaeger-allinone:
image: jaegertracing/all-in-one:1.25
ports:
- 6831:6831/udp
- 6832:6832/udp
- 16686:16686
- 14268:14268
我们可以通过 UDP 或 TCP 与 Jaeger 进行通信。使用 启动 Docker 映像后docker-compose up,我们可以使用 URL http://localhost:16686/访问 UI 。
现在,让我们添加一些属性以允许应用程序将跟踪发送到 Jaeger 服务器。我们将通过 TCP 进行通信,因此请确保我们将跟踪发送到另一个 TCP 端口,即 14268
opentracing:
jaeger:
http-sender:
url: http://localhost:14268/api/traces
让我们使用以下命令启动“服务器 1”。
java -jar
target/Distributed-Service-0.0.1-SNAPSHOT.jar
--spring.application.name=Service-1
--server.port=8080
然后在不同的终端上,运行与“服务 2”相同的应用程序的新实例,如下所示
java -jar
target/Distributed-Service-0.0.1-SNAPSHOT.jar
--spring.application.name=Service-2
--server.port=8090
应用程序启动后,调用“Service 1”,/path1如下所示
curl -i http://localhost:8080/service/path1
让我们看一下“服务1”的日志。
INFO 69938 --- [nio-8080-exec-1] i.j.internal.reporters.LoggingReporter : Span reported: ed70bbaa2bd5b42f:c7c94163fc95fc1e:ed70bbaa2bd5b42f:1 - GET
跟踪的格式为 [Root Span ID, Current Span ID, Parent Span ID]。在这种情况下,由于“服务 1”是发起服务,因此父跨度 IDed70bbaa2bd5b42f也是根跨度 ID。
现在,让我们看一下“服务 2”的日志。
INFO 69885 --- [nio-8090-exec-1] i.j.internal.reporters.LoggingReporter : Span reported: ed70bbaa2bd5b42f:e9060cb1d5336c55:c7c94163fc95fc1e:1 - path2
从这里我们看到中间值是当前 span ID,父 span ID(即第三个值c7c94163fc95fc1e)是“Service 1”的 span ID。
现在,如果您打开 UI,您将看到以下内容:
当我们深入挖掘时,我们会看到每个跨度的更多细节。
在这里,根跨度 IDed70bbaa2bd5b42f跨越整个请求。其他两个跨度 ID 指的是单个服务。
结论
今天我们探讨了如何将基于 OpenTracing 的 Jaeger 与 Spring Boot 应用程序集成。您可以点击这里更深入地了解 OpenTracing 的规范。此外,使用 Spring Cloud Jaeger 的库源代码在这里。
我不断探索和学习新事物。如果您想了解最新趋势并提高您的软件开发技能,请关注我。
祝您好运!!
使用 Spring Cloud Jaeger 进行分布式跟踪的更多相关文章
- Spring Cloud第九篇 | 分布式服务跟踪Sleuth
本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- Spring Cloud异步场景分布式事务怎样做?试试RocketMQ
一.背景 在微服务架构中,我们常常使用异步化的手段来提升系统的 吞吐量 和 解耦 上下游,而构建异步架构最常用的手段就是使用 消息队列(MQ),那异步架构怎样才能实现数据一致性呢?本文主要介绍如何使用 ...
- 【Spring Cloud】Spring Cloud Config 实现分布式配置中心
Spring Cloud Config 实现分布式配置中心 一.分布式配置中心 分布式系统中,往往拥有大量的服务应用,而每个应用程序都需要有对应的配置文件来协助完成服务环境初始化.运行.因此生产了大量 ...
- 【Spring Cloud】Spring Cloud之Spring Cloud Sleuth,分布式服务跟踪(1)
一.Spring Cloud Sleuth组件的作用 为微服务架构增加分布式服务跟踪的能力,对于每个请求,进行全链路调用的跟踪,可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等. 二 ...
- Spring Cloud(九):分布式配置中心和消息总线
我们在Spring Cloud(七):使用SVN存储分布式配置中心文件和实现refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码 ...
- Spring Cloud同步场景分布式事务怎样做?试试Seata
一.概述 在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用Seata的AT模式来解决一致性问题. Sea ...
- 构建Spring Cloud微服务分布式云架构
大型企业分布式微服务云架构服务组件 实现模块化.微服务化.原子化.灰度发布.持续集成 commonservice zipkinSpring 日志收集工具包,封装了Dapper和log-based追踪以 ...
- Spring Cloud(八):分布式配置中心服务化和高可用
在前两篇的介绍中,客户端都是直接调用配置中心的server端来获取配置文件信息.这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,serve ...
- Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
Zipkin 是一个开放源代码分布式的跟踪系统,由 Twitter 公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集.存储.查找和展现.它的理论模型来自于Google ...
随机推荐
- nginx代理图片上传以及访问 nginx 图片上传完整版
nginx代理图片上传 首先需要利用nginx代理图片访问参考 https://www.cnblogs.com/TJ21/p/12609017.html 编写接受文件的controller 1 @Po ...
- RDA5807M开发指南 & 开源库函数
文档标识符:RDA5807M_T-D-P16 作者:DLHC 最后修改日期:2022.1.14 最后修改内容:修改.添加内容 发布状态:已发布 本文链接:https://www.cnblogs.com ...
- XRecyclerView:实现下拉刷新、滚动到底部加载更多以及添加header功能的RecyclerView
介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. ...
- 在KALI以外的Linux上安装KALI上的工具(ubuntu,debian)
添加KALI源 vim /etc/apt/sources.list 在sources.list中加入 deb http://http.kali.org/kali kali-rolling main c ...
- MRCTF2020 套娃
MRCTF2020套娃 打开网页查看源代码 关于$_SERVER['QUERY_STRING']取值,例如: http://localhost/aaa/?p=222 $_SERVER['QUERY_S ...
- winform GDI+ 抗锯齿
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
- 1011day-人口普查系统
1.Browse.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 【分享代码】bash中对一个逗号分隔的列表去重
直接上代码: #!/bin/bash dedup_list(){ v_list=$(echo "$1" | sed "s/,/\n/g" | sort -u | ...
- echarts的通用属性的介绍
通常做数据可视化时,会用到统计图,这里我使用的是Echarts,对于第一次用的人来说,还是有点难度的,主要是里面的属性太多,看的头痛,这里我自己做个笔记 这里的配置项手册里面就是查找各种属性了,在Ec ...
- Vue3 框架基础随笔 (一)
VUE框架基础部分随笔 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. Vue可以使用简单的代码实现一个单页面应用. 基本格式 Vue通过模板语法来声明式的将数 ...