SkyWalking实战:从原理到落地的链路跟踪指南 - 详解
在微服务架构盛行的今天,一个用户请求往往要经过多个服务的协同处理才能完成。一旦出现接口响应慢、调用失败等问题,想要定位到底是哪个服务、哪个环节出了问题,就像在迷宫里找出口——难!而SkyWalking就是帮我们走出这个迷宫的“导航仪”。今天这篇博客,就带大家从原理到实战,手把手搞懂SkyWalking的链路跟踪,还会把关键参数配置讲得明明白白。
一、先搞懂:SkyWalking是什么?核心原理有哪些?
SkyWalking是一款开源的分布式链路跟踪系统,实现根因定位,不仅能追踪服务间的调用链路,还能监控服务性能、分析服务依赖关系,甚至定位代码级的问题。它之所以能做到这些,核心依赖“探针采集-数据处理-存储展示”的全流程设计。
1.1 核心组件:
SkyWalking的核心组件主要有3个:
Agent(探针):“数据采集员”,不需要修改业务代码,只需挂载到服务上就能工作。它会在服务的关键节点(比如接口调用、数据库操作)埋点,采集调用耗时、请求参数、返回结果等数据,然后把数据发给Collector。
Collector(收集器):“数据处理中心”,接收Agent发来的原始数据,进行清洗、聚合、分析(比如计算链路总耗时、错误率),然后把处理后的数据存到指定的存储介质中。
Web App(可视化界面):“结果展示屏”,通过图表的形式把链路跟踪数据、服务依赖、性能指标等展示出来,让我们能直观看到服务的运行状态。
1.2 工作原理:一条链路的“标记”
举个例子:用户发起一个“下单”请求,需要经过“订单服务”→“支付服务”→“库存服务”三个服务。SkyWalking的工作流程如下:
请求进入“订单服务”时,Agent会生成一个唯一的“链路ID”和“跨度ID”(链路ID标记整个请求,跨度ID标记每个服务的调用环节),并采集该服务的调用耗时、请求参数等数据。
“订单服务”调用“支付服务”时,Agent会把链路ID和跨度ID传递过去,“支付服务”的Agent基于这个ID继续采集数据,形成一个“子跨度”。
同理,“支付服务”调用“库存服务”时,重复步骤2,形成完整的链路数据。
所有Agent把采集到的链路数据定时发给Collector,Collector处理后存入存储(比如MySQL、Elasticsearch)。
我们通过Web App查询链路ID,就能看到整个“下单”请求的调用链路、每个服务的耗时、是否有错误等信息。
二、实战部署:手把手配置SkyWalking
本次实战基于SkyWalking 9.4.0版本,采用“MySQL存储”(适合小规模场景),以Java服务为例进行演示。
2.1 环境准备
提前准备好以下环境,版本对应关系要注意(避免兼容性问题):
JDK:1.8及以上(SkyWalking基于Java开发)
MySQL:5.7及以上(需提前创建数据库)
SkyWalking安装包:从官网下载 https://skywalking.apache.org/downloads/(选择“Apache SkyWalking APM”)
Java业务服务:本次以一个简单的Spring Boot服务为例
2.2 部署Collector(核心配置)
Collector是SkyWalking的核心,重点配置“数据存储”和“服务端口”,步骤如下:
解压安装包:把下载的安装包解压到指定目录(比如/usr/local/skywalking),解压后目录结构中,“config”目录是配置文件存放地,“bin”目录是启动脚本。
配置MySQL存储: 默认情况下,SkyWalking使用H2内存数据库(重启后数据丢失),我们需要修改为MySQL存储。第一步:进入config目录,编辑“application.yml”文件,找到“storage”节点,修改类型为mysql:
storage: selector: ${SW_STORAGE:mysql} # 改为mysql mysql: properties: jdbcUrl: jdbc:mysql://localhost:3306/skywalking?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 username: root # 你的MySQL用户名 password: 123456 # 你的MySQL密码 maxActive: 10 # 连接池最大活跃连接数 minIdle: 5 # 连接池最小空闲连接数 connectionTimeout: 30000 # 连接超时时间(毫秒) idleTimeout: 600000 # 空闲连接超时时间(毫秒)第二步:导入MySQL初始化脚本。SkyWalking提供了MySQL的表结构脚本,在“config/sql/mysql”目录下,找到“skywalking.sql”,在MySQL中执行该脚本(先创建名为skywalking的数据库)。
配置服务端口: Collector需要监听Agent发来的数据,默认端口是11800(gRPC协议),如果端口被占用,可以在application.yml的“receiver-grpc”节点修改:
receiver-grpc:selector: ${SW_RECEIVER_GRPC:default}default:host: 0.0.0.0port: 11800 # 可修改为未占用的端口,比如11801启动Collector: 进入bin目录,执行启动脚本(Windows执行startup.bat,Linux执行startup.sh)。启动成功后,查看logs目录下的“collector.log”,如果没有报错,说明Collector启动正常。
2.3 部署Web App(简单配置)
Web App主要用于展示数据,默认端口是8080,如需修改,编辑config目录下的“webapp.yml”文件:
server:
port: 8080 # 可修改为8081等未占用端口
spring:
cloud:
gateway:
routes:
- id: collector-service
uri: http://localhost:12800 # 连接Collector的地址,默认12800端口
predicates:
- Path=/graphql/**
启动Web App:和Collector一起,执行startup脚本后会自动启动,访问http://localhost:8080,能看到SkyWalking的登录界面(默认无需登录,直接进入)。
2.4 服务挂载Agent(关键步骤)
Agent不需要单独启动,只需在启动Java服务时,通过JVM参数指定Agent的路径和配置即可,核心参数要配置正确,否则Agent无法连接Collector。
找到Agent目录:SkyWalking安装包解压后,“agent”目录就是探针的存放地,里面的“skywalking-agent.jar”是核心文件。
配置Agent参数: 启动Java服务时,添加以下JVM参数(以Spring Boot的jar包启动为例)核心参数解释:javaagent:指定Agent的jar包路径,必须正确,否则Agent无法加载。
java -javaagent:/usr/local/skywalking/agent/skywalking-agent.jar \ # 服务名称(必填,要唯一,比如订单服务叫order-service) -Dskywalking.agent.service_name=order-service \ # Collector的地址和端口(必填,和前面配置的receiver-grpc端口一致) -Dskywalking.collector.backend_service=localhost:11800 \ # 采样率(可选,默认100%,生产环境可设50%减少数据量) -Dskywalking.agent.sample_rate=100 \ # Agent日志输出方式(可选,默认文件,设为console便于调试) -Dskywalking.agent.log_output_type=console \ -jar order-service.jarservice_name:服务的唯一名称,SkyWalking通过这个名称区分不同服务,比如“order-service”“pay-service”。
backend_service:Collector的地址和gRPC端口,格式为“IP:端口”,如果Collector部署在另一台机器,把IP换成Collector的地址。
sample_rate:采样率,比如设为50表示只采集50%的请求,生产环境服务流量大时建议降低,减少Collector的压力。
验证Agent连接:启动服务后,查看Agent目录下的“logs/agent.log”,如果出现“Connected to backend service successfully”,说明Agent连接Collector成功。
三、效果验证:看看链路跟踪有多好用
启动Java服务后,发起几次接口请求(比如调用订单服务的下单接口),然后打开SkyWalking的Web界面,就能看到链路跟踪的效果了。
3.1 链路追踪查看
进入Web界面后,点击左侧“追踪”菜单,就能看到所有采集到的链路数据。每个链路会显示:
链路ID:唯一标识一条请求链路。
服务名称:发起请求的服务(比如order-service)。
耗时:整个链路的总耗时。
状态:成功(绿色)或失败(红色)。
点击某条链路,能看到详细的调用链路树,比如“order-service→pay-service→stock-service”,每个服务的调用耗时、请求URL、返回码等信息都一目了然。如果某个服务调用超时,会用红色标记,直接定位问题服务。
3.2 服务依赖分析
点击左侧“拓扑图”菜单,能看到服务之间的依赖关系图,比如订单服务依赖支付服务,支付服务依赖库存服务,依赖关系和调用方向清晰可见,帮我们快速梳理微服务架构。
3.3 性能指标监控
点击左侧“仪表盘”菜单,能看到服务的性能指标,比如平均响应时间、QPS、错误率等,还能通过时间维度筛选,查看不同时间段的性能变化,便于排查性能瓶颈。
四、常见问题解决
Agent无法连接Collector:检查backend_service参数是否正确,Collector的11800端口是否开放,防火墙是否拦截。
Web界面看不到链路数据:查看Agent日志是否有数据采集记录,Collector日志是否有数据接收记录,MySQL中是否有链路数据(查trace_segment表)。
采样率过高导致Collector压力大:降低sample_rate参数,比如设为30,同时可以考虑用Elasticsearch代替MySQL存储(支持更大数据量)。
五、总结
SkyWalking的核心就是“Agent采集-Collector处理-Web展示”,部署和配置并不复杂,关键是要把Agent的服务名称、Collector地址等核心参数配置正确。通过它,我们能快速定位微服务中的调用问题、梳理服务依赖、监控性能指标,堪称微服务架构的“排障神器”。
在实际生产环境,可以结合:比如用Elasticsearch存储海量数据、配置告警规则(当响应时间超过阈值时报警)、集成日志系统等。
浙公网安备 33010602011771号