SkyWalking - Spring Cloud Alibaba 全链路追踪实战

· 后端开发教程

现在微服务用得越来越多,很多系统都被拆成好几个独立部署、一起协作的小服务,这样做虽然让系统变得更灵活、更容易扩展,但也会带来一个麻烦:当一个请求从头到尾经过好几个服务的时候,很难一下子看出来到底哪里慢了或者哪里出错了,而分布式追踪(Distributed Tracing)正好能帮我们解决这个问题。

Apache SkyWalking 是一个免费开源的性能监控工具,对 Java 程序支持特别好,也能很好地和 Spring Cloud Alibaba 搭配使用。这篇文章会一步一步带着你,在一个基于 Spring Cloud Alibaba 的项目里接入 SkyWalking,实现从用户发起请求到所有服务响应完成的完整调用过程追踪。

一、前期准备

开始之前,请先确认你的电脑上已经装好了下面这些东西:

启动 SkyWalking 后端组件

我们可以用 Docker 很快地把 SkyWalking 的数据处理服务(OAP)和网页界面跑起来,只需要执行下面这两条命令:

docker run -d --name skywalking-oap \
  -p 11800:11800 -p 12800:12800 \
  apache/skywalking-oap-server:9.7.0

docker run -d --name skywalking-ui \
  --link skywalking-oap:oap \
  -p 8080:8080 \
  apache/skywalking-ui:9.7.0

等容器启动成功后,打开浏览器访问 http://localhost:8080,就能看到 SkyWalking 的操作界面了。

二、接入 SkyWalking Agent

SkyWalking 要监控 Java 应用,是通过一个叫 Java Agent 的东西来实现的,你完全不需要改任何业务代码,只要在启动程序的时候带上它就行。

获取 SkyWalking Agent

先去 SkyWalking 官方下载页面 下载对应版本的压缩包(比如 apache-skywalking-java-agent-9.7.0.tgz),解压之后你会得到一个名字叫 skywalking-agent 的文件夹。

修改 agent.config 配置

打开里面的 skywalking-agent/config/agent.config 文件,重点看一下这两个地方:

# 这个名字会显示在网页界面上
agent.service_name=${SW_AGENT_NAME:your-service-name}

# 告诉 Agent 把数据发到哪里
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

推荐用环境变量来设置服务名,这样不同的服务就不会混在一起。

启动应用并挂载 Agent

举个例子,如果你要启动用户服务(user-service),可以这样写启动命令:

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
     -DSW_AGENT_NAME=user-service \
     -jar user-service.jar

其他服务比如网关(gateway)、订单服务(order-service)也要用同样的方式启动,并且每个都要给一个不一样的名字。

小提示:开发的时候可以在 IDE 的虚拟机参数里加上 -javaagent:...;上线的时候最好用启动脚本或者容器来加,这样更稳定。

三、验证分布式追踪效果

假设你的请求流程是这样的:客户端先打到网关,网关再调用户服务,用户服务又去调订单服务。

当你发起一次完整的请求之后,打开 SkyWalking 的网页界面:

  1. Services(服务) 页面,你应该能看到 gatewayuser-serviceorder-service 这三个服务都出现了;
  2. 点进 Trace(追踪) 页面,就能看到整个请求是怎么一步步走完的,包括每一步花了多少时间、有没有报错、带了哪些额外信息;
  3. 如果某一步特别慢,点进去还能看到具体是哪个方法耗时长(前提是这个接口没有被配置成忽略)。

SkyWalking 会自动记录很多有用的信息,比如:

四、进阶配置和优化建议

加入自定义业务信息

有时候你想在追踪记录里带上一些业务相关的数据,比如用户 ID 或订单编号,可以用 SkyWalking 提供的 ContextManager 来加标签:

import org.apache.skywalking.apm.agent.core.context.ContextManager;

// 在请求入口的地方加上
ContextManager.activeSpan().setTag("userId", "12345");

不过更推荐的做法是把这些信息放在 HTTP 请求头里传下去,SkyWalking 会自动把它抓取下来,并和当前的追踪记录关联起来。

忽略没用的接口

/actuator/health 这种健康检查接口,调用非常频繁,但对我们排查问题没什么帮助,可以把它排除掉,避免产生大量无用数据:

trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/actuator/**,/health}

和日志联动(可选)

SkyWalking 还支持和 Logback 或 Log4j2 配合使用,可以把当前请求的 TraceID 自动写进日志里,这样你在查日志的时候就能直接对应到具体的调用链。你需要额外加一个叫 apm-toolkit-logback-1.x 的依赖,然后在日志格式里加上 %tid 占位符就可以了。

五、常见问题怎么解决

结语

把 SkyWalking 和 Spring Cloud Alibaba 结合起来之后,基本不用动业务代码,就能实现完整的请求追踪能力。这不仅能让你更快地定位线上问题,还能清楚地看到系统里哪些地方慢、哪些接口需要优化。在现在的微服务环境下,这种“看得见”的能力已经不是加分项,而是必须具备的基础功能。

建议你先在测试环境完整走一遍流程,确认没问题后再用到生产环境。还可以配合告警规则,比如当某个接口变慢了或者错误率突然升高时自动通知你,这样整个监控体系就更实用、更可靠了。

本文使用的版本组合是 SkyWalking 9.7、Spring Boot 3.2 和 Spring Cloud Alibaba 2022.0.0.0。如果你用的版本不一样,可能会有些小差异,建议参考官方最新文档做调整。