笔者目前工作中就负责某电商系统的设计和开发,前端 Angular,后端 Java.
在基于微服务架构的电商系统中,用户下单后订单状态未更新,这算是一个常见问题,背后往往涉及多个微服务的协作。
为了有效地定位问题所在,我们可以利用 Jaeger 进行链路追踪。本文通过一个具体案例,分享详细的排查步骤,包括源代码和配置细节。
1. 部署 Jaeger
首先,需要在系统中部署 Jaeger,以便收集和可视化链路追踪数据。Jaeger 是一个开源的分布式追踪系统,能够帮助我们监控和故障排除基于微服务的分布式系统。其架构主要包括:
在本地环境中,可以使用 Jaeger 的 All-in-One Docker 镜像进行快速部署:
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>上述代码中,"ecommerce-service"
是服务的名称,withSender
中的 endpoint
是 Jaeger Collector 的地址。
3. 在代码中添加追踪
在微服务的关键业务逻辑中,添加追踪信息,以便在 Jaeger 中查看调用链路。例如,在订单创建的服务方法中:
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
来传递追踪信息:
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 删除。