SkyWalking
一、项目概述
Apache SkyWalking 是一款专为微服务、云原生及容器化架构设计的开源可观测性平台,提供分布式追踪、服务网格遥测分析、度量聚合与可视化的一体化解决方案。在传统单体应用向分布式架构演进的过程中,系统复杂度呈指数级增长,传统的日志监控与指标监控已无法满足故障定位与性能诊断的需求。SkyWalking 的核心价值在于填补了这一技术空白,通过全链路追踪能力,将原本黑盒化的跨服务调用过程转化为可视化的调用链,使开发运维人员能够快速定位性能瓶颈与故障根因。
与传统APM工具相比,SkyWalking 具备三大差异化优势:第一,无侵入式探针设计,通过字节码增强技术实现监控数据采集,无需修改业务代码;第二,高性能通信架构,采用gRPC协议进行数据传输,大幅降低监控开销;第三,跨语言生态支持,覆盖Java、.NET Core、PHP、Node.js、Go、Python等主流编程语言,完美适配异构技术栈的微服务体系。
主要功能特性
SkyWalking 的功能矩阵围绕可观测性的三大支柱(指标、日志、追踪)构建:
- 分布式追踪:自动采集服务间调用链路,生成端到端的Trace记录,支持跨进程、跨语言的调用关系还原。每个Trace包含完整的Span层级结构,可精确到方法级别的耗时分析。
- 服务拓扑发现:基于调用关系数据自动绘 制服务依赖图谱,直观展示微服务间的调用流向与依赖强度,识别关键路径与单点故障风险。
- 应用性能指标监控:采集JVM内存、CPU使用率、GC频率、线程状态等运行时指标,提供多维度的性能基线分析与异常检测。
- 告警与通知:支持基于阈值、同比环比、异常检测等多种规则的告警配置,可通过Webhook、邮件、钉钉、企业微信等渠道实时通知。
- 日志关联分析:将业务日志与Trace ID自动关联,实现日志上下文与调用链路的双向跳转,加速故障排查过程。
- 服务网格集成:原生支持Envoy + Istio构建的Service Mesh架构,可监控服务网格内的流量路由、负载均衡与安全策略执行情况。
适用场景
SkyWalking 的适用场景覆盖从开发测试到生产运维的全生命周期:
- 微服务性能诊断:当接口响应时间异常时,通过调用链分析快速定位慢查询服务、数据库瓶颈或第三方API延迟。
- 容量规划与优化:基于历史性能数据识别服务资源瓶颈,为弹性伸缩与资源分配提供数据支撑。
- 故障根因定位:结合链路、指标与日志三要素,在服务异常时迅速缩小排查范围,确定故障发生的具体服务与方法。
- 架构演进验证:在服务拆分、技术栈迁移等架构变更后,验证新架构的性能表现与稳定性。
- SLA合规监控:监控关键业务接口的可用性与响应时间,确保服务等级协 议(SLA)的持续达标。
二、SkyWalking架构详解
四大核心组件
SkyWalking 采用四层架构设计:探针(Agent) 部署于应用实例,负责无侵入采集追踪数据;后端服务(OAP Server) 接收、聚合、分析数据;存储(Storage) 持久化处理结果至Elasticsearch、MySQL等数据库;UI界面 提供可视化展示与查询功能。
数据流转机制
探针通过HTTP/gRPC将Trace Segment协议数据发送至OAP Server,OAP进行流式分析后写入存储层,UI从存储读取数据生成拓扑图与性能仪表盘。跨语言调用通过标准化Sw8 Header传递上下文,确保异构服务链路完整拼接。
三、本地部署方法详解
环境准备与依赖检查
在开始部署 SkyWalking 之前,请确保您的系统满足以下最低要求:
操作系统:Linux(CentOS 7+/Ubuntu 18.04+)、macOS 10.14+、Windows 10(WSL2推荐)
内存:至少 4GB RAM(生产环境建议 8GB+)
磁盘空间:至少 10GB 可用空间
核心依赖版本:
- Java 8 或更高版本(推荐 OpenJDK 11)
- MySQL 5.7+ 或 Elasticsearch 7.x(用于数据存储)
- 网络端口:11800(gRPC)、12800(HTTP)、8080(UI,可自定义)
可在此处配一张终端检查Java版本的截图,显示 java -version 命令输出
快速验证命令:
# 检查Java版本
java -version
# 检查MySQL状态(如使用MySQL存储)
systemctl status mysql
# 检查端口占用情况
netstat -tlnp | grep -E '11800|12800|8080'
手动部署步骤
1. 下载与解压
从 Apache SkyWalking 官网下载最新版本(当前稳定版为 9.7.0):
# 下载压缩包
wget https://dlcdn.apache.org/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz
# 解压到指定目录
tar -zxvf apache-skywalking-apm-9.7.0.tar.gz -C /opt/
cd /opt/apache-skywalking-apm-9.7.0
解压后的目录结构:
bin/:启动脚本(oapService.sh、webappService.sh)config/:配置文件目录agent/:Java Agent 探针webapp/:UI 前端资源
2. MySQL存储配置详解
SkyWalking 默认使用 H2 内存数据库,适合测试环境。生产环境推荐使用 MySQL 或 Elasticsearch。以下以 MySQL 为例:
步骤一:创建数据库与用户
-- 登录MySQL
mysql -u root -p
-- 创建数据库(字符集必须为utf8)
CREATE DATABASE IF NOT EXISTS `skywalking`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
-- 创建专用用户
CREATE USER 'skywalking'@'%' IDENTIFIED BY 'YourPassword123!';
GRANT ALL PRIVILEGES ON skywalking.* TO 'skywalking'@'%';
FLUSH PRIVILEGES;
步骤二:修改 OAP 配置文件编辑 config/application.yml,找到 storage 配置段:
storage:
selector: ${SW_STORAGE:mysql} # 指定使用MySQL
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking?rewriteBatchedStatements=true"}
dataSource.user: ${SW_DATA_SOURCE_USER:skywalking}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:YourPassword123!}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
关键配置说明:
rewriteBatchedStatements=true:启用批量写入优化,提升数据入库性能cachePrepStmts系列参数:预编译语句缓存,减少数据库连接开销- 生产环境建议将密码通过环境变量传入,避免硬编码
步骤三:初始化数据库表结构SkyWalking 会自动创建所需表,首次启动时会执行初始化脚本。无需手动建表。
步骤四:启动 OAP 服务
# 启动后端服务(默认端口11800/12800)
./bin/oapService.sh start
# 查看启动日志
tail -f logs/skywalking-oap-server.log
步骤五:配置并启动 Web UI修改 webapp/webapp.yml:
server:
port: 8080 # UI访问端口
oap:
host: ${SW_OAP_HOST:localhost}
port: ${SW_OAP_PORT:12800}
启动UI服务:
./bin/webappService.sh start
访问 http://localhost:8080 即可进入监控控制台。
Docker快速部署方案
对于追求部署效率的场景,Docker 是最佳选择。SkyWalking 提供官方镜像,支持一键部署完整监控栈。
单机部署(开发测试)
1. 使用 Docker Compose创建 docker-compose.yml:
version: '3.8'
services:
oap:
image: apache/skywalking-oap-server:9.7.0
container_name: skywalking-oap
restart: always
ports:
- "11800:11800" # gRPC端口
- "12800:12800" # HTTP端口
environment:
SW_STORAGE: elasticsearch
SW_ES_USER: elastic
SW_ES_PASSWORD: your_password
SW_ES_URL: http://elasticsearch:9200
depends_on:
- elasticsearch
ui:
image: apache/skywalking-ui:9.7.0
container_name: skywalking-ui
restart: always
ports:
- "8080:8080"
environment:
SW_OAP_ADDRESS: http://oap:12800
depends_on:
- oap
elasticsearch:
image: elasticsearch:7.17.0
container_name: elasticsearch
restart: always
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
es_data:
2. 启动服务
docker-compose up -d
3. 验证部署
# 检查容器状态
docker-compose ps
# 查看OAP日志
docker logs -f skywalking-oap
# 访问UI
curl http://localhost:8080
生产环境优化配置
生产环境需考虑高可用与性能优化:
1. 集群模式部署修改 OAP 环境变量:
environment:
SW_CLUSTER: kubernetes # 或zookeeper、nacos
SW_CLUSTER_K8S_NAMESPACE: skywalking
SW_CLUSTER_K8S_LABEL: app=skywalking
SW_CLUSTER_K8S_SERVICE_NAME: skywalking-oap
2. 资源限制
deploy:
resources:
limits:
memory: 2G
cpus: '2'
reservations:
memory: 1G
cpus: '1'
3. 数据持久化
volumes:
- ./data/oap:/skywalking/logs
- ./data/config:/skywalking/config
与现有监控体系集成
SkyWalking Docker 部署可轻松对接现有基础设施:
1. 对接外部 Elasticsearch
environment:
SW_STORAGE: elasticsearch
SW_ES_URL: http://your-es-cluster:9200
SW_ES_USER: ${ES_USER}
SW_ES_PASSWORD: ${ES_PASSWORD}
2. 配置反向代理(Nginx)
location /skywalking/ {
proxy_pass http://skywalking-ui:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
3. 监控数据导出通过 OAP 的 Prometheus 插件,将指标数据导出至现有监控系统:
environment:
SW_TELEMETRY_PROMETHEUS_HOST: 0.0.0.0
SW_TELEMETRY_PROMETHEUS_PORT: 1234