前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >探索 Jaeger 在微服务中的应用

探索 Jaeger 在微服务中的应用

原创
作者头像
编程扫地僧
发布2025-02-28 09:48:59
发布2025-02-28 09:48:59
8100
代码可运行
举报
文章被收录于专栏:后端开发后端开发
运行总次数:0
代码可运行

笔者目前工作中就负责某电商系统的设计和开发,前端 Angular,后端 Java.

在基于微服务架构的电商系统中,用户下单后订单状态未更新,这算是一个常见问题,背后往往涉及多个微服务的协作。

为了有效地定位问题所在,我们可以利用 Jaeger 进行链路追踪。本文通过一个具体案例,分享详细的排查步骤,包括源代码和配置细节。

1. 部署 Jaeger

首先,需要在系统中部署 Jaeger,以便收集和可视化链路追踪数据。Jaeger 是一个开源的分布式追踪系统,能够帮助我们监控和故障排除基于微服务的分布式系统。其架构主要包括:

  • Jaeger Agent:作为宿主机上的一个守护进程,用于监听从服务端发出的追踪数据包,然后批量地发往 Jaeger Collector。
  • Jaeger Collector:负责接收 Jaeger Agent 上报的追踪数据,并进行处理,最终存储到后端存储系统。
  • Jaeger Query:提供可视化的查询服务,从数据库检索数据并通过 UI 展示。
  • Jaeger UI:用于展示 Jaeger Query 检索出的数据。

在本地环境中,可以使用 Jaeger 的 All-in-One Docker 镜像进行快速部署:

代码语言:javascript
代码运行次数:0
复制
docker run -d \
  --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775 \
  -p 6831:6831 \
  -p 6832:6832 \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14250:14250 \
  -p 14267:14267 \
  -p 14268:14268 \
  -p 14275:14275 \
  -p 14276:14276 \
  -p 14278:14278 \
  -p 14279:14279 \
  -p 5778:5778 \
  jaegertracing/all-in-one:1.51

上述命令会启动 Jaeger 的各个组件,并将其暴露在相应的端口上。其中,16686 端口用于访问 Jaeger 的 Web UI。

2. 集成 Jaeger 客户端

在微服务应用中,需要集成 Jaeger 客户端,以便在代码中生成和传播追踪信息。以 Java 为例,使用 OpenTracing 和 Jaeger 的 Java 客户端库:

  • 添加依赖:在 pom.xml 中添加以下依赖: <dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-core</artifactId> <version>1.5.0</version> </dependency>
  • 初始化 Tracer:在应用启动时,初始化 Jaeger Tracer: import io.jaegertracing.Configuration; import io.jaegertracing.internal.JaegerTracer; import io.opentracing.Tracer; public class TracingConfig { public static Tracer initTracer() { return new Configuration("ecommerce-service") .withSampler(new Configuration.SamplerConfiguration("const", 1)) .withReporter(new Configuration.ReporterConfiguration() .withLogSpans(true) .withSender(new Configuration.SenderConfiguration() .withEndpoint("http://localhost:14268/api/traces"))) .getTracer(); } }

上述代码中,"ecommerce-service" 是服务的名称,withSender 中的 endpoint 是 Jaeger Collector 的地址。

3. 在代码中添加追踪

在微服务的关键业务逻辑中,添加追踪信息,以便在 Jaeger 中查看调用链路。例如,在订单创建的服务方法中:

代码语言:javascript
代码运行次数:0
复制
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;

public class OrderService {
    private final Tracer tracer = GlobalTracer.get();

    public void createOrder(Order order) {
        try (Scope scope = tracer.buildSpan("createOrder").startActive(true)) {
            // 业务逻辑
            // ...
        }
    }
}

在上述代码中,buildSpan("createOrder") 创建了一个新的 Span,表示订单创建的操作。

4. 配置服务间的追踪传播

在微服务之间的调用中,需要确保追踪信息能够正确传播。以 HTTP 调用为例,可以使用 OpenTracing 的 HttpHeaders 来传递追踪信息:

代码语言:javascript
代码运行次数:0
复制
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMapInject;

public class HttpClient {
    private final Tracer tracer = GlobalTracer.get();

    public void sendRequest(String url) {
        try (Scope scope = tracer.buildSpan("sendRequest").startActive(true)) {
            // 构建请求头
            Map<String, String> headers = new HashMap<>();
            tracer.inject(scope.span().context(), Format.Builtin.HTTP_HEADERS, new TextMapInject(headers));
            // 发送 HTTP 请求,并将 headers 添加到请求中
            // ...
        }
    }
}

在上述代码中,tracer.inject 将当前 Span 的上下文信息注入到 HTTP 请求的头部,以便接收方能够获取到追踪信息。

5. 使用 Jaeger UI 进行排查

完成上述配置后,启动微服务应用,并访问 Jaeger 的 Web UI(默认地址为 http://localhost:16686)。在 UI 中,可以通过 Trace ID 查询特定的请求链路,查看各个微服务的调用情况。例如,查询订单创建的 Trace ID,查看从前端到订单服务、库存服务等的调用链路,分析各个服务的响应时间和状态码,定位问题。

以上算是笔者在工作中使用 Jaeger 来排查微服务应用中模型状态没能按照系统设计来进行迁移时的标准操作,希望对各位同仁有所帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档