云计算百科
云计算领域专业知识百科平台

SkyWalking 微服务全链路追踪

一、前言:为什么ELK日志之外,还需要链路追踪?

在上一篇博客中,我们完整搭建了 Elastic Stack 8.x(Filebeat+Logstash+ES) 分布式日志收集体系,解决了微服务日志分散、无法统一检索、日志无留存的问题,实现了日志可查。

但纯日志系统存在致命短板:只能看结果,看不到过程。

在复杂微服务调用链路中,一次前端请求可能贯穿网关、用户服务、订单服务、支付服务、库存服务,一旦出现接口超时、500报错、响应缓慢等问题:

  • ELK 只能查到某一个服务报错日志,无法定位故障发生在哪个调用节点

  • 无法统计各服务、各接口耗时,不知道是网络卡顿、代码慢还是第三方接口超时

  • 无全局请求ID,无法串联跨服务日志,排查故障只能逐服务翻日志,效率极低

  • 无法监控服务健康状态、吞吐量、异常率,只能事后救火,无法事前预警

因此,微服务可观测体系必须双引擎搭配:ELK 负责日志存储检索,SkyWalking 负责链路追踪、指标监控、拓扑分析,二者联动实现「链路定位+日志溯源」的完整可观测闭环。

二、SkyWalking 核心介绍与技术定位

Apache SkyWalking是 Apache 顶级开源的零侵入、轻量级、高性能微服务可观测性分析平台,专为分布式系统设计,支持链路追踪、服务指标监控、拓扑可视化、日志关联、告警通知等能力,是目前国内微服务最主流的链路追踪方案。

本文全程采用 SkyWalking 最新稳定版 10.x,适配 Spring Boot3、Spring Cloud 最新生态,兼容 Elasticsearch 8.x 存储,完美对接上一篇 ELK8.x 技术栈,摒弃老旧版本废弃配置。

2.1 核心组件架构

  • Agent(探针):客户端采集组件,JavaAgent 机制,零代码侵入,无需修改业务代码,仅启动挂载即可自动采集调用链路、耗时、异常、JVM指标

  • OAP Server:后端核心服务,默认监听 11800(gRPC)、12800(HTTP),接收 Agent 上报数据,完成数据聚合、计算、存储、分析

  • UI 控制台:可视化界面,提供服务拓扑、链路详情、接口耗时、指标看板、告警配置等能力,默认端口 8080

  • 存储层:支持 Elasticsearch、MySQL、H2,生产环境首选 ES8.x,与 ELK 共用 ES 集群,降低运维成本

2.2 完整可观测联动链路(与ELK关联)

业务请求 -> SkyWalking Agent 采集链路信息、生成全局 TraceId -> OAP 存储链路指标 & 调用链 -> Filebeat 采集业务日志、携带 TraceId 上报 Logstash -> ES 统一存储链路数据+日志数据 -> SkyWalkingUI+Kibana 双向溯源排查

三、SkyWalking 核心优缺点分析

3.1 核心优势(生产首选原因)

  • 零代码侵入:基于 JavaAgent 字节码增强,无需埋点、无需改代码、无需引入SDK,接入成本极低,适配新旧项目

  • 性能损耗极低:官方实测性能损耗<5%,轻量级探针,不影响业务吞吐量和响应耗时,适配高并发生产环境

  • 自动适配中间件:原生自动拦截 SpringMVC、Dubbo、Feign、Redis、MySQL、MQ 等常用中间件调用链路,无需额外配置

  • 完美兼容ELK体系:支持 TraceId 日志透传,可通过链路ID直接跳转对应报错日志,实现链路+日志联动排查

  • 功能全面:集链路追踪、服务拓扑、JVM监控、接口QPS、异常率、慢接口统计、告警预警于一体,无需多组件拼接

  • 国产开源友好:中文文档完善、社区活跃、迭代稳定,适配国内微服务技术栈,无国外组件适配坑

3.2 局限性与短板

  • 复杂自定义链路支持弱:高度自定义的业务分段链路,无法自动采集,需要手动注解增强

  • 精准日志联动需适配:默认不自动关联日志,需要业务日志打印时手动输出 TraceId 才能与 ELK 日志联动

  • 轻量级监控,精细化指标不如Prometheus:侧重链路追踪与服务宏观监控,细粒度业务指标监控不如 Prometheus+Grafana

  • 集群部署有运维成本:单机可快速入门,生产高可用集群需要优化配置、调优采样率、清理历史数据

四、适用场景与落地边界

4.1 适配场景(必落地场景)

  • Spring Cloud、Dubbo 微服务集群项目,跨服务调用频繁、链路复杂

  • 线上偶发超时、偶发报错、间歇性卡顿,纯日志无法定位问题根源

  • 需要统计接口耗时、慢接口优化、服务吞吐量、异常率等运维指标

  • 已经搭建 ELK 日志体系,需要补齐链路追踪能力,形成完整可观测闭环

  • 生产环境需要事前告警、故障快速定位、线上问题复盘的中大型项目

4.2 不适配场景

  • 单体架构项目,无跨服务调用,无需链路追踪能力

  • 小型测试项目、临时演示项目,无线上故障排查需求

  • 极致轻量化工具项目,无需可观测体系,追求最简部署

五、最新稳定版 SkyWalking 零基础安装实战

环境统一适配:Linux CentOS7.9+/Ubuntu20.04+,存储复用 Elasticsearch8.15.x(与上篇ELK版本完全统一,版本兼容无冲突)

组件版本:SkyWalking 10.4.0(最新稳定版)、ES8.15.x、Filebeat8.15.x

5.1 服务端(OAP+UI)安装部署

5.1.1 下载安装包

# 下载最新稳定版 SkyWalking APM
wget https://archive.apache.org/dist/skywalking/10.4.0/apache-skywalking-apm-10.4.0-linux-x86_64.tar.gz

# 解压至 /opt 目录
tar -zxvf apache-skywalking-apm-10.4.0-linux-x86_64.tar.gz -C /opt/
mv /opt/apache-skywalking-apm-10.4.0 /opt/skywalking

5.1.2 配置ES8.x存储(核心适配)

10.x 版本默认支持 ES8.x,无需兼容旧版配置,修改核心配置文件 /opt/skywalking/config/application.yml

storage:
selector: elasticsearch
elasticsearch:
# 对接本机ES8.x,复用ELK集群
clusterNodes: https://127.0.0.1:9200
# ES账号密码(8.x默认开启认证)
user: elastic
password: 你的ES密码
# 关闭证书校验(测试环境),生产配置合法CA证书
sslVerification: false
# 索引分片与副本配置
indexShardsNumber: 1
indexReplicasNumber: 0
# 数据保存天数,按需调整
recordDataTTL: 7
metricsDataTTL: 7

5.1.3 启动服务端

# 后台启动OAP核心服务
nohup /opt/skywalking/bin/oap.sh start &

# 启动UI控制台
nohup /opt/skywalking/bin/ui.sh start

5.1.4 验证启动成功

# 查看端口监听
netstat -tulpn | grep 11800
netstat -tulpn | grep 8080

浏览器访问:http://服务器IP:8080,成功打开SkyWalking控制台即为部署完成。

5.2 客户端Agent探针部署(零侵入接入)

Agent 无需安装,直接挂载使用,所有微服务统一使用同一个探针包。

5.2.1 获取Agent探针

# 单独下载对应版本Agent
wget https://archive.apache.org/dist/skywalking/10.4.0/apache-skywalking-java-agent-10.4.0.tgz
tar -zxvf apache-skywalking-java-agent-10.4.0.tgz -C /opt/

5.2.2 核心探针配置(agent.config)

修改 /opt/skywalking-java-agent/config/agent.config,适配生产环境:

# 服务名称(自定义,UI展示)
agent.service_name=${SW_AGENT_NAME:micro-service-order}
# OAP服务端地址
collector.backend_service=127.0.0.1:11800
# 生产环境采样率,避免数据量过大(测试1.0,生产0.1-0.5)
agent.sample_n_per_3_secs=2
# 打印SQL参数,方便问题排查
plugin.jdbc.trace_sql_parameters=true
# 开启日志TraceId透传,对接ELK关键配置
plugin.log.logback.enable=true

六、微服务接入与调用链路采集实战

6.1 SpringBoot微服务挂载探针

无需改代码,启动脚本添加 -javaagent 参数即可,适配 SpringBoot3.x 最新版本

# 微服务启动命令示例
java -javaagent:/opt/skywalking-java-agent/skywalking-agent.jar \\
-jar order-service.jar \\
–spring.profiles.active=prod

6.2 模拟业务调用,生成链路数据

启动网关、用户、订单、库存微服务,通过前端或Postman发起完整业务请求,调用完成后等待10秒数据聚合。

6.3 控制台核心使用方式

6.3.1 服务拓扑查看

UI首页【Service Map】可查看所有微服务调用关系、依赖组件、在线状态,直观发现服务离线、异常服务。

6.3.2 链路追踪详情查询

点击【Trace】模块,可查看所有请求链路:

  • 完整调用堆栈:网关→服务A→服务B→数据库

  • 每一段调用耗时、状态码、异常信息

  • 精准定位慢接口、超时节点、报错节点

6.3.3 服务指标监控

【Service】模块查看单服务QPS、响应耗时、异常率、JVM内存、GC次数、线程数,实时监控服务健康状态。

七、与ELK8.x日志体系联动(核心关联能力)

这是两大技术栈联动的核心价值,实现「链路定位问题,日志佐证细节」。

7.1 核心联动原理

SkyWalking 每次请求都会生成唯一 TraceId,通过日志插件将 TraceId 打印到业务日志中;Filebeat+Logstash 采集日志并带入 TraceId 存入 ES,排查问题时:

  • SkyWalking 找到报错链路、获取 TraceId

  • 复制 TraceId 到 Kibana 检索

  • 一键查询该请求全链路所有服务日志,完整复盘故障

  • 7.2 快速接入配置

    项目引入 skywalking-logback 依赖(适配日志透传),日志格式增加 %tid 即可打印全局链路ID,无缝对接ELK检索体系。

    八、生产环境优化方案(10.x版本专属)

    8.1 采样率优化(关键)

    测试环境采样率1.0(全采集),生产高并发环境必须调低,避免海量数据压垮ES:

    • 普通业务:采样率 0.2(每3秒采集2条)

    • 核心支付、订单业务:采样率 0.5

    • 故障频发环境:临时全开采样排查问题

    8.2 存储优化(对接ES8.x)

    • 配置数据TTL,自动清理7天前历史链路数据,释放ES磁盘空间

    • 合理设置分片数、副本数,适配ES集群性能

    • 区分指标数据、链路数据存储周期,精细化管理

    8.3 性能优化

    • 关闭无用插件,仅开启MVC、JDBC、Dubbo、Feign核心插件,减少探针开销

    • OAP服务调整JVM参数,适配服务器配置,避免内存溢出

    • 探针异步上报数据,不阻塞业务线程

    8.4 运维优化

    • 配置邮件、钉钉告警,服务下线、异常率飙升、接口超时自动预警

    • 统一管理Agent探针版本,所有微服务版本一致,避免兼容问题

    • 与ELK共用ES集群,减少中间件部署成本,统一运维

    九、常见线上问题排错

    • 服务启动无链路数据:检查OAP端口连通性、防火墙11800端口是否开放、探针serviceName是否配置正确

    • 链路有报错,无详细日志:未开启日志TraceId透传,需配置logback插件并重启服务

    • ES写入失败:核对ES8.x账号密码、HTTPS证书配置,关闭测试环境证书校验

    • 高并发下数据丢失:调大采样率、开启批量上报、优化OAP线程池参数

    • UI加载缓慢:清理过期链路数据、优化ES查询、调整JVM堆内存

    十、全文总结:ELK+SkyWalking 完整可观测闭环

    1、ELK技术栈(Filebeat+Logstash+ES8.x):解决日志采集、存储、检索、统计问题,负责「事后细节溯源」;

    2、SkyWalking10.x链路追踪:解决服务调用链路、故障定位、性能监控、异常预警问题,负责「事前监控、事中定位」;

    3、二者联动是目前微服务最优可观测落地方案,零侵入接入、性能损耗低、运维成本可控,完全适配最新SpringCloud、ES8.x生态,是中大型微服务项目必备的基础运维基建。

    相比传统Sleuth+Zipkin方案,SkyWalking无需手动埋点、功能更全面、运维更简单,结合ELK日志体系,彻底解决微服务「故障难查、性能难优、状态难控」的行业痛点。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » SkyWalking 微服务全链路追踪
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!