我先把结论放前面:如果你的服务已经拆成微服务,并且你还在靠“出问题以后翻日志猜链路”这种方式排查故障,那 Skywalking 这类 APM 工具迟早要补上。不是锦上添花,是早晚要补的基本设施。下面我会从“它到底解决什么问题”开始,把 Skywalking 9.4 的安装、架构、SpringBoot 集成的完整过程,以及我实际落地时踩过的几个坑,一次性讲透。
这套内容适合谁?主要是 SpringBoot 技术栈的开发者,尤其是手上有好几个服务、已经感受过“定位一次缓慢请求要翻遍所有服务日志”这种痛苦的人。如果你现在只是写单体应用,还没到非上不可的时候,但提前理解它的工作方式也不亏,因为后面只要拆分服务,基本都会走到这一步。
1. 为什么选择Skywalking:从一次线上慢请求的排查说起
1.1 微服务排障的核心痛点不是“没有日志”,而是调用链被切碎了
有一次我在排查一个订单服务的超时问题,用户反馈下单偶尔会卡几秒钟。这个系统结构并不复杂:前端请求经过网关,网关调订单服务,订单服务要调库存服务,库存服务再去查 Redis 和 MySQL。问题就出在这里,每个服务都有自己的日志文件,单一请求在四个服务之间跳转,每条日志记录的 traceId 又对不上(老系统,当时没有埋点),结果就是四个服务各自看起来都是正常的,但链路整体就是慢。
这种排查方式非常消耗时间。后来我挨个服务去翻日志,又让运维帮忙查中间件监控,最后才发现问题出在库存服务里一个 Redis 连接池参数配置不合理。整个排查过程花了三个小时,但真正定位到问题只用了五分钟。如果当时有 Skywalking,打开拓扑图就能看到调用链上哪个节点耗时异常,可能两分钟就锁定了。
这就是 Skywalking 这类 APM 工具存在的意义。它不是替代你现有的日志系统,而是把一次请求在多个服务之间的完整调用路径串起来,每段耗时、每个参与节点、是否有异常都直观地呈现出来。它可以回答几个非常核心的问题:服务之间谁在调谁?哪一个环节最慢?某一个服务的错误率到底高不高?以及,这些问题是在什么时间段集中出现的。
1.2 Skywalking 和其他 APM 工具的定位差异
我第一次接触 APM 工具是 Zipkin,后来又用过 Jaeger,也见过一些公司自研的调用链系统。最后在项目里长期用的反而是 Skywalking,选择它的理由其实很实际:它面向 Java 技术栈的接入成本最低,而且不光是链路追踪。
我做一个比较直观的对比:
| 工具 | 接入方式 | 核心定位 | 链路之外的能力 | 适用场景 |
|---|---|---|---|---|
| Zipkin | 需要服务端埋点上报 | 纯分布式追踪 | 较弱,基本只有链路查询 | 已有监控体系,只缺 trace 数据的团队 |
| Jaeger | SDK 埋点,或配合 Agent | 分布式追踪为主 | 有部分指标能力,但不做业务拓扑和告警 | 云原生、Go Python 等多语言场景 |
| CAT | 侵入式埋点,需要改代码 | 指标监控 + 链路 | 指标能力强,但接入成本高 | 有专门团队维护美团系技术栈的公司 |
| Skywalking | Java Agent 无侵入接入 | 可观测性平台 | 拓扑、指标、告警、日志关联都内置 | Java/SpringBoot 微服务体系 |
这里我不展开说“谁更好”,因为工具的取舍要结合团队情况。但如果你的技术栈是 Java + SpringBoot 为主,Skywalking 基本是综合成本最低的选择。我见过很多初创团队直接用 Skywalking 作为第一套 APM,不需要额外研发埋点 SDK,Java Agent 往 JVM 参数里一挂就生效了。
1.3 无侵入接入背后的原理并不神秘
很多人第一次接触 Skywalking 会好奇:为什么我的 SpringBoot 代码一行没改,请求的链路数据就被采集了? 其实关键在 Java Agent 机制。
Skywalking 的 Java Agent 本质上是利用 JVM 的 -javaagent 参数,在应用启动前加载一个代理 jar。这个 jar 内部通过字节码增强技术在运行时对目标类的字节码做修改,从而把追踪逻辑织入到 HTTP 请求、数据库访问、消息发送等关键方法中。Skywalking 团队对主流开源组件做了大量插件适配,比如 SpringMVC、Dubbo、gRPC、JDBC、Redis、Kafka、RocketMQ 等,你不必自己去埋点,当请求经过这些组件时,Agent 会自动生成对应的 Span 数据。
所以无侵入不是玄学,本质是“框架帮你做好了适配”。明白了这一点,你就知道遇到 Skywalking 采集不到链路的场景时,第一反应应该去查插件是否覆盖了你用的客户端版本,而不是怀疑 Agent 坏了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装Skywalking 9.4之前:把组件角色和目录结构先弄清楚
2.1 Agent、OAP、UI、存储,一句话理解一个角色
很多人第一次在服务器上解压 Skywalking,面对一堆目录会有点懵。我建议先建立一个整体心智模型:Skywalking 部署形态上有四个角色,其中三个是进程,一个是存储。
第一个是 Agent,它不单独部署,而是寄生在你的业务应用 JVM 里。Agent 负责采集链路数据,并上报给后端的 OAP 服务。
第二个是 OAP(Observability Analysis Platform),这是 Skywalking 的核心后端。它接收 Agent 上报的数据,对链路做统计分析,把结果写入存储,同时承担告警判断等逻辑。
第三个是 UI,也就是 Skywalking 的可视化控制台,负责从 OAP 查询数据并以图表、拓扑图、链路列表等形式展示。
第四个是存储,OAP 分析完的数据最终要落到存储里。Skywalking 支持 Elasticsearch、OpenSearch、BanyanDB、MySQL、PostgreSQL,还有内置的 H2。本地体验时直接用 H2 就能跑,生产环境基本都会上 Elasticsearch 或 BanyanDB。
这三个进程加上一个存储,就组成了完整的 Skywalking。对应到安装包里,就是你解压后看到的 agent/ 目录、bin/ 目录、webapp/ 目录,以及启动后连接的存储系统。
2.2 9.4 发布包的目录结构怎么看
以我使用的 9.4 版本为例,解压后目录结构大概是这样的:
text复制apache-skywalking-apm-bin/
├── agent/ # Java Agent,稍后要挂到 SpringBoot 应用上
│ ├── config/
│ ├── plugins/
│ ├── optional-plugins/
│ └── skywalking-agent.jar
├── bin/ # OAP 和 UI 的启动脚本
│ ├── startup.sh
│ ├── shutdown.sh
│ ├── oapService.sh
│ └── webappService.sh
├── config/ # OAP 端配置文件
│ ├── application.yml
│ ├── alarm-settings.yml
│ └── component-libraries.yml
├── logs/
├── oap-libs/ # OAP 运行依赖的第三方库
└── webapp/ # SkyWalking UI 前端
└── webapp.yml # UI 的端口等配置
这里面你日常操作最频繁的其实是三个文件:agent/config/agent.config 管 Agent 行为,config/application.yml 管 OAP 后端行为,webapp/webapp.yml 管 UI 端口。我遇到很多人启动失败,就是因为改端口时找错了配置文件,后面避坑部分我会详细讲。
2.3 环境准备:JDK版本、端口、下载选择
确认服务器上已经装了 JDK,并且能执行 java -version。这里有个容易忽视的点:OAP 服务本身是用 Java 写的,Skywalking 9.x 对运行 OAP 的 JDK 版本有要求,官方推荐在 JDK 11 以上的环境启动 OAP。你被监控的业务应用跑在 JDK 8 没问题,Java Agent 对 JDK 8 的支持是完备的,但承载 OAP 的 JDK 最好不要太老。
端口方面要提前规划一下。Skywalking 组件之间有固定端口,Agent 默认通过 gRPC 上报到 OAP 的 11800 端口,OAP HTTP 端口默认是 12800,SkyWalking UI 默认跑在 8080。如果服务器上已经有服务占用这些端口,需要提前改配置。
下载版本选择上,9.4 版本是 9.x 系列里比较成熟稳定的一个。直接从 Apache SkyWalking 官网的下载页找对应版本,选择二进制 tar.gz 包即可。下载时注意区分平台,服务器是 Linux x64 就选对应的包,Mac 本地调试选 darwin 相关构建。
3. Skywalking 9.4安装实测:从解压到看到第一个页面
3.1 下载、解压,一套组合命令直接带走
安装过程并不复杂,我习惯把安装包放在 /opt/skywalking 下。如果你只是想本地体验,放在任意用户目录也行,没有强制的安装路径要求。
bash复制cd /opt/skywalking
wget https://skywalking.apache.org/downloads/
# 下载页里选择 9.4.0 的二进制 tar.gz 包
tar -zxvf apache-skywalking-apm-9.4.0*.tar.gz
cd apache-skywalking-apm-bin
如果服务器无法直接访问外网,就在本地下载好再传到服务器上。这一步遇到的坑大多集中在“下载的文件不对”,有的包是源码包,解压后没有 bin/ 目录,需要自行编译,会麻烦很多。因此我习惯下载时确认文件名里是否带 apm,并且解压后第一眼先看 bin/oapService.sh 是否存在。
3.2 用默认配置直接启动,会有什么区别
解压完成后,不需要做任何配置,直接执行启动脚本就可以把 OAP 和 UI 一起拉起来。这是 Skywalking 做得比较友好的地方,内置了 H2 存储,本地体验时开箱即用,不像某些系统必须先部署一堆中间件才能看到界面。
bash复制./bin/startup.sh
执行后脚本会同时启动两个进程:OAPServer 和 WebappServer。默认情况下 OAP 使用 H2 存储,数据写在内存里,足够你完成一次完整的接入体验,但我要强调一点:H2 存储只是让你本地验证用的,它数据不持久化,重启 OAP 后链路数据就丢了,生产环境一定不要这么用。
启动完成后,访问 http://localhost:8080,如果看到 SkyWalking UI 的首页,说明 9.4 已经安装成功了。这时候页面里大概率没有任何服务数据,因为还没有任何 Agent 接入,这个状态是正常的。
3.3 如何判断启动是否真正成功
有时候页面能打开,但 Agent 接入后数据还是进不来,这就需要判断 OAP 是否真的工作正常。我的习惯是启动后
