公司线上服务跑了一堆微服务,测试环境经常出现“接口偶尔超时”的告警,生产环境一压测就有人喊“订单服务又卡了”。过去排查问题,只能一台台服务器登录上去查日志,靠肉眼把分散在十几个服务里的调用日志“拼”起来,耗时几小时是常事。后来把SkyWalking用起来,整个分布式系统的调用链路、性能瓶颈、服务拓扑一眼就能看全,排查问题从小时级别降到了分钟级别。这篇教程我就把SkyWalking从零到一装起来、用起来的完整过程写出来,希望能帮你少踩一些坑。
这篇文章适合刚接触分布式监控、被微服务排查折磨过、想快速把链路追踪落地的人。内容覆盖组件原理、部署方案、Java服务接入、链路查询、告警配置、常见问题六个板块,按操作顺序来,照做就能跑通。
1. 先搞懂SkyWalking是什么、解决什么问题
1.1 核心定位:APM与分布式链路追踪
SkyWalking是一个开源的可观测性分析平台,核心能力是链路追踪、服务拓扑分析、服务/实例/端点级性能指标监控,同时支持日志与告警。它的定位非常清晰:面向分布式系统,帮助开发运维人员回答“一个请求从入口进来,经过了哪些服务、每个服务耗时多少、哪里最慢、哪里报错”。
日常开发中最常遇到的一种场景:用户反馈下单很慢,但你在订单服务本地压测又没问题。这种问题往往是某个上游接口在高并发下变慢,或者某个中间件连接池被打满,又或者是跨服务的网络抖动。没有链路追踪工具时,你只能猜,或者靠日志时间去硬拼。而SkyWalking会把一次完整请求的调用链自动串起来,从网关到订单服务、再到MySQL、Redis,每一步都能看到耗时和状态。
1.2 和其他监控工具的对比,为什么我选它
开源领域APM工具不少,常见的有Zipkin、Pinpoint、Jaeger、Cat等。我在选型时最看重三点:
- 接入成本低:SkyWalking采用Java Agent方式,不需要改动业务代码,通过
-javaagent参数就能实现字节码增强植入探针。这对老项目特别友好,不用为接入监控去改框架代码。 - 功能完整:链路追踪、拓扑图、JVM监控、告警、日志关联一套全带,不用再拼凑多个工具。
- 社区活跃:SkyWalking是Apache顶级项目,更新节奏快,插件覆盖了市面上主流框架(Spring Cloud、Dubbo、gRPC、MQ等),未来遇到新框架也有保障。
对比一下:Zipkin偏轻量,但监控面板功能较弱;Pinpoint界面不错,但Agent侵入性较强且偏重;Jaeger是CNCF项目,链路追踪做得很好,但指标和告警需要额外搭Prometheus。综合来看,SkyWalking在“开箱即用”和“全家桶能力”之间是最均衡的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整体架构与部署方案选型
2.1 三个核心组件各司其职
SkyWalking的部署结构分为三个部分:
- Agent(探针):部署在业务服务中,负责采集Trace、指标、日志等信息,通过gRPC协议上报给OAP Server。
- OAP Server(可观测性分析平台):接收Agent上报的数据,进行聚合分析和存储,同时提供查询API。它是整个系统的“大脑”。
- Web UI:一个Web前端界面,通过API和OAP Server交互,展示拓扑图、链路详情、指标数据、告警信息。
数据流向就是:微服务 -> Agent -> OAP Server -> 存储器 -> Web UI展示。这个链路里Agent是嵌入到业务进程的,所以选型时必须注意Agent和OAP的版本兼容性,这个后面我会重点说。
2.2 存储层选型:H2、Elasticsearch、MySQL怎么选
OAP Server本身不存数据,数据落在存储层。SkyWalking原生支持多种存储:
| 存储方式 | 适用场景 | 优缺点 |
|---|---|---|
| H2(内置) | 本地快速演示、测试环境 | 零配置启动最快,但性能有限,不适合生产 |
| Elasticsearch | 大规模生产环境 | 查询性能强,是官方最推荐的方案,但要额外维护ES集群 |
| MySQL/PostgreSQL | 数据量中等场景 | 方便复用现有数据库运维体系,适合量级不高的中小团队 |
我个人的经验是:第一次上手用默认的H2最省事,解压即用,先跑通链路再说。等正式部署环境,如果团队规模不大、调用量每天几百万以下的,可以先用MySQL,省去维护ES的成本。如果量级再往上,或者需要长时间保存数据做分析,就上ES。
如果你之前没接触过Elasticsearch,我最开始的建议是先别碰ES版本。SkyWalking和ES之间存在兼容性矩阵,版本选错了直接启动报错,新手很容易在这里卡住。
3. 保姆级安装部署实操:从下载到跑起来
3.1 环境准备与下载
要准备的环境很简单:一台Linux服务器(Windows也行,但生产基本都是Linux),JDK版本建议8到11。SkyWalking OAP Server本身是Java程序,所以先确认服务器上Java环境可用。
code复制java -version
接下来下载SkyWalking的发行包。这里有个关键细节:官方发行包分为“包含UI”和“不包含UI”两种,一定要下载带有apm字样的完整包,一般是apache-skywalking-apm-版本号.tar.gz,里面包含bin、config、oap-libs、webapp、agent等目录。
我用的是9.x系列版本,举个例子:
bash复制cd /opt
wget https://dlcdn.apache.org/skywalking/9.6.0/apache-skywalking-apm-9.6.0.tar.gz
tar -zxvf apache-skywalking-apm-9.6.0.tar.gz
mv apache-skywalking-apm-bin skywalking
如果下载慢,记得找国内镜像源。解压之后看一下目录结构,agent目录是给业务服务用的,bin目录下是OAP和UI的启动脚本。
3.2 修改配置:先了解OAP的核心参数
启动前先打开OAP的配置文件,路径是config/application.yml,这个文件很长,但新手只需要关注几个关键项。
默认存储是H2,如果你是快速体验,什么都不用改。如果要使用MySQL存储,在storage段做如下调整:
yaml复制storage:
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking?useUnicode=true&characterEncoding=utf8"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
JDBC连接串里的skywalking数据库需要提前建好。这里注意MySQL驱动默认是8.x版本,如果你的数据库是5.7以下,需要替换驱动包。
另外还要认识三个端口:
| 端口 | 用途 |
|---|---|
| 11800 | gRPC端口,Agent通过这个端口上报数据 |
| 12800 | HTTP端口,Web UI和外部系统查询用 |
| 8080 | Web UI页面端口,在webapp/webapp.yml里配置 |
3.3 启动OAP Server和Web UI
在bin目录下执行启动脚本:
bash复制cd /opt/skywalking/bin
./startup.sh
这个脚本会同时启动OAP Server和Web UI。启动过程需要十几秒,可以用日志确认是否成功:
bash复制tail -f ../logs/skywalking-oap-server.log
看到类似OAP server started就说明OAP启动成功了。再确认Web UI,浏览器访问http://服务器IP:8080,能看到SkyWalking的登录界面就说明整个服务端已经就绪。注意服务器安全组和防火墙要放行这三个端口。
Docker方式部署可以快速创建一个测试环境,但Docker方式的版本匹配、数据持久化、网络配置容易把人绕晕,我的建议是新手先用官方tar包二进制方式跑通一次,理解整个流程后再玩Docker Compose。
4. 核心接入环节:Java服务接入Agent
4.1 Agent放置与版本匹配
服务端跑起来之后,所有业务服务就需要接入Agent了。找到SkyWalking目录下的agent文件夹,里面就是探针的所有文件。如果你的服务在另外一台机器上,把整个agent目录复制过去,和业务代码放在同一台机器上就行。
这里有一个我在实际操作中踩过的大坑:服务端版本和Agent版本必须匹配。如果OAP Server用了9.6.0,Agent最好是同版本的,大版本至少也要一致。不然Agent上报的数据OAP解析不了,日志里会报一堆gRPC call failed,界面上一片空白。
4.2 JVM参数接入:一种零侵入的接入方式
Agent接入采用的是“改启动参数、不改业务代码”的方式。在启动Java服务时,加一个-javaagent参数,告诉JVM在加载类时使用SkyWalking的探针。
假设我的Spring Boot应用启动命令是这样的:
bash复制java -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=order-service \
-Dskywalking.collector.backend_service=127.0.0.1:11800 \
-jar order-service.jar
参数解释:
-javaagent:指定Agent的jar包路径。-Dskywalking.agent.service_name:注册到SkyWalking里的服务名,这个名字会显示在拓扑图上。-Dskywalking.collector.backend_service:OAP Server的gRPC地址(IP和端口11800)。
在IDEA里本地调试时,也可以把这段参数配置到VM options里,方便本地联调链路。
4.3 关键配置项与排查方法
agent/config/agent.config文件里还有很多参数,常用的有:
code复制agent.namespace=default
agent.instance_name=当前实例名称
agent.sample_rate=1
agent.sample_rate是采样率,默认是1,表示全量采样。生产环境在高并发下全量采样会有一定性能开销,我的经验是调到0.5或按需调整,一般压测数据表明,采样率50%对于排查大多数问题都够了。
配置好之后,重启业务服务,观察OAP日志有没有新数据接入。如果看不到数据,先到OAP日志里搜gRPC或者trace关键字,确认Agent是否成功上报,再用下面的命令测试Agent到OAP的连通性:
bash复制telnet 127.0.0.1 11800
如果端口不通,多半是网络或防火墙问题。
4.4 微服务全链路接入的注意事项
接入Agent时,最忌讳的是只接一个服务。链路追踪的意义在于“全链路”,如果你只给订单服务加了Agent,那么它调用用户服务时,链路就断了,拓扑图显示不出来完整的调用关系。
所以在微服务架构里,网关、所有业务服务、依赖的中间件(如果原生支持)都应该尽量接入。Spring Cloud Gateway、Spring Boot WebFlux这些框架都有官方插件支持,不需要额外处理。Dubbo、RocketMQ这类框架也有对应插件,一般的插件在Agent启动时会自动加载,这也是SkyWalking好用的一个重要原因。
5. 使用实操:从拓扑图到链路查询
5.1 服务列表和拓扑图怎么看
服务接入后稍等一两分钟,打开SkyWalking UI,在“通用”菜单里就能看到注册上来的服务。点击“拓扑图”,页面会把服务间的调用关系画成一张图,箭头表示调用方向,颜色和数字表示健康状态和调用量。
我日常排查问题时最常用的就是第一眼扫拓扑图:哪个服务节点的颜色不对,说明那里有异常;箭头上的耗时数字如果明显偏大,说明这个调用环节存在问题。然后点进具体服务,能看到服务实例的JVM堆内存、CPU信息,通过曲线判断是否内存泄漏或者线程池打满。
5.2 查询链路定位慢请求
定位慢请求是链路追踪最核心的价值。在UI的“追踪”页面,可以选择服务名、时间范围、最小耗时进行查询。比如我要找“耗时超过2秒的请求”,设置Min Duration=2000,排序后点进某条Trace,页面会展示完整的调用瀑布图。
每个Span都能看到对应的服务、操作名、开始时间、耗时和状态。如果慢在数据库调用上,Span上会直接显示SQL语句和数据库地址。我有一次就是通过这种方式找到一条慢SQL,发现开发环境一个查询没走索引,导致整个下单接口在高峰期都卡住。
5.3 告警规则配置
SkyWalking内置了一套告警规则,文件在config/alarm-settings.yml。里面有服务响应时间、成功率、实例异常等默认规则。例如默认的“服务响应时间超过1000ms持续3分钟”就会触发告警。
告警可以配置Webhook方式通知到钉钉或企业微信。OAP的application.yml里找到receiver-receiver段,配置Webhook地址:
yaml复制receiver-receiver:
default:
alarmHooks:
- http://你的回调地址
这样当规则触发时,OAP会把告警信息POST到这个地址,收到后就能推送到IM群了。告警触发之后,在UI的“告警”菜单里能看到历史告警记录,点进去还能直接跳转到相关的链路信息,排查效率极高。
5.4 和日志平台联动:TraceId贯穿日志
链路追踪和日志系统结合,才能真正提升排错效率。SkyWalking的Agent内置了日志增强能力:配合logback或log4j2,在日志里自动输出traceId,这样我在ELK里查日志时,只要搜traceId,就能把同一个请求在多个服务里的日志全部捞出来。
接入方式很简单,以logback为例,引入apm-toolkit-logback-1.x依赖,然后在logback的pattern里加上%tid占位符,日志就会自动打印traceId。配合SkyWalking的“日志”菜单,还能直接按服务+时间检索上报的日志内容,做到“一屏全览”。
6. 常见问题与排查技巧实录
6.1 Agent接入后UI看不到数据
这是最多人遇到的问题。检查顺序按照“Agent进程是否启动 -> 网络是否通 -> 服务名是否正确 -> 版本是否匹配”来:
- 先看业务服务启动日志里有没有报错,比如找不到Agent Jar路径、JVM参数格式错误。
- 再测试11800端口连通性,
telnet一下。 - 然后看OAP日志里有没有
gRPC相关的ERROR。 - 如果上述都没问题,多半就是Agent和OAP版本不匹配,换同版本Agent试试。
6.2 UI能启动但页面空白或图表不显示
这种情况通常有两个原因:一是OAP Server存储初始化失败,比如MySQL的库没建好或连接被拒,需要去OAP日志里找SQL报错信息;二是浏览器访问的OAP Server地址配置不对,打开webapp/webapp.yml,确认oapServices指向的IP和端口是否正确。
6.3 性能开销太大
Agent的性能损耗主要来自采样率和Span上报频率。如果压测发现响应时间明显变长,优先调低采样率agent.sample_rate,比如0.5甚至0.1。另外,在Agent配置里可以关闭一些不需要的插件,agent/plugins目录下不需要的插件可以直接移走。
6.4 常见问题速查表
我整理了一张表,可以当排查手册用:
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| 页面全空 | OAP存储配置错误或库存失败 | 查看OAP日志,修正存储配置 |
| 无Trace数据 | Agent未接入或端口不通 | 确认-javaagent参数、连通性、版本匹配 |
| 拓扑图缺少节点 | 部分服务未接入Agent | 检查所有服务是否加上Agent参数 |
| 告警不触发 | Webhook地址未生效或规则阈值过高 | 检查告警配置文件和OAP日志 |
| 启动报端口占用 | 11800或8080被占用 | 修改application.yml或webapp.yml端口 |
| 数据量增长过快 | 采样率过高、存储空间不足 | 调低采样率,配置存储清理策略 |
6.5 两个独家经验
说两个我在实际运维里总结的技巧。
第一,存储清理策略尽早配置。默认H2短期没事,但你一直跑着不干预,数据文件会越滚越大。用MySQL/ES的话,官方支持基于TTL的数据保留配置,在application.yml里设置recordDataTTL和metricsDataTTL,比如保存7天。这能避免磁盘被撑爆。
第二,给每个服务规范命名。agent.service_name千万别随便起,要统一规范,比如订单系统-订单服务这样清晰的名字。否则排查问题时会发现一大片服务都叫default,根本分不清是哪个业务系统。
写在最后的一个经验
SkyWalking部署起来其实不难,官方文档也写得比较全,但真正顺手是要在项目里跑上一阵子、踩过几次坑才有的感觉。最开始接的时候别追求大而全,先在一两个核心服务上接入Agent,把拓扑图和数据看懂了,再逐步推广到全量服务。顺带提一下,如果你的技术栈里还有Kubernetes,SkyWalking对K8s环境也有完善的接入方案,后续想扩展监控面也会顺畅很多。
