共计 2961 个字符,预计需要花费 8 分钟才能阅读完成。
在本文中,学习如何实现 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 的库源代码在这里。
我一直摸索和学习新事物。如果您想理解最新趋势并进步您的软件开发技能,请 关注 我。
祝您好运!!