现在微服务用得越来越多,很多系统都被拆成好几个独立部署、一起协作的小服务,这样做虽然让系统变得更灵活、更容易扩展,但也会带来一个麻烦:当一个请求从头到尾经过好几个服务的时候,很难一下子看出来到底哪里慢了或者哪里出错了,而分布式追踪(Distributed Tracing)正好能帮我们解决这个问题。
Apache SkyWalking 是一个免费开源的性能监控工具,对 Java 程序支持特别好,也能很好地和 Spring Cloud Alibaba 搭配使用。这篇文章会一步一步带着你,在一个基于 Spring Cloud Alibaba 的项目里接入 SkyWalking,实现从用户发起请求到所有服务响应完成的完整调用过程追踪。
一、前期准备
开始之前,请先确认你的电脑上已经装好了下面这些东西:
- JDK 17(建议用这个版本)
- Maven(用来管理项目依赖)
- Docker(方便快速启动 SkyWalking 的后台服务)
- 一个用 Spring Boot 和 Spring Cloud Alibaba 搭起来的微服务项目(比如包含网关、用户服务、订单服务这些模块)
启动 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 的网页界面:
- 在 Services(服务) 页面,你应该能看到
gateway、user-service、order-service这三个服务都出现了; - 点进 Trace(追踪) 页面,就能看到整个请求是怎么一步步走完的,包括每一步花了多少时间、有没有报错、带了哪些额外信息;
- 如果某一步特别慢,点进去还能看到具体是哪个方法耗时长(前提是这个接口没有被配置成忽略)。
SkyWalking 会自动记录很多有用的信息,比如:
- HTTP 请求的路径、方法类型和返回的状态码;
- Spring MVC 控制器里被调用的方法;
- 通过 Feign 或 RestTemplate 发出去的远程调用;
- 使用 Nacos 做服务发现时的一些上下文;
- 数据库操作,比如 MyBatis 或 JDBC 执行的 SQL 语句。
四、进阶配置和优化建议
加入自定义业务信息
有时候你想在追踪记录里带上一些业务相关的数据,比如用户 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 占位符就可以了。
五、常见问题怎么解决
- 服务没出现在界面上:先检查 Agent 是不是真的加载成功了,再看看 OAP 的地址对不对,还要确认防火墙有没有拦住 11800 端口;
- 调用链中间断开了:确保所有涉及的服务都加了 Agent;如果用了 Feign,要确认是 Spring Cloud OpenFeign(SkyWalking 默认支持它,能自动传递追踪上下文);
- 界面一直看不到数据:稍微等几秒钟,因为默认是每 10 秒上报一次数据;也可以去看一下 OAP 容器的日志,看看有没有连接失败或者解析错误。
结语
把 SkyWalking 和 Spring Cloud Alibaba 结合起来之后,基本不用动业务代码,就能实现完整的请求追踪能力。这不仅能让你更快地定位线上问题,还能清楚地看到系统里哪些地方慢、哪些接口需要优化。在现在的微服务环境下,这种“看得见”的能力已经不是加分项,而是必须具备的基础功能。
建议你先在测试环境完整走一遍流程,确认没问题后再用到生产环境。还可以配合告警规则,比如当某个接口变慢了或者错误率突然升高时自动通知你,这样整个监控体系就更实用、更可靠了。
本文使用的版本组合是 SkyWalking 9.7、Spring Boot 3.2 和 Spring Cloud Alibaba 2022.0.0.0。如果你用的版本不一样,可能会有些小差异,建议参考官方最新文档做调整。