关于java:使用-Spring-Cloud-Jaeger-进行分布式跟踪

38次阅读

共计 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 的库源代码在这里。

我一直摸索和学习新事物。如果您想理解最新趋势并进步您的软件开发技能,请 关注 我。

祝您好运!!

正文完
 0