当你的系统从单体架构拆分成微服务后,最直观的感受就是"找问题变难了"。想象一下,一个用户请求从前端到订单服务,再到支付服务、库存服务,最后还要调用第三方物流接口——这条链路上任何一个环节出问题,都可能导致整个请求失败。而传统的方式是登录每台服务器查日志,这就像在黑夜里摸象,效率极低。
链路追踪就是为解决这个问题而生。它能完整记录一个请求在各个服务间的流转路径,精确到每个方法调用和数据库查询。而SkyWalking作为Apache顶级项目,提供了从埋点采集到存储分析再到可视化展示的全套解决方案。我亲测在百节点规模的微服务集群中,排查问题的平均时间从小时级缩短到分钟级。
建议生产环境至少准备:
bash复制# 快速检查环境
java -version
mysql --version
free -h
从官网下载时有个小技巧:带-es7后缀的版本表示内置Elasticsearch客户端支持。如果准备用MySQL存储,直接下普通版即可:
bash复制wget https://archive.apache.org/dist/skywalking/8.6.0/apache-skywalking-apm-8.6.0.tar.gz
tar -zxvf apache-skywalking-apm-8.6.0.tar.gz
cd apache-skywalking-apm-bin
解压后的目录结构特别重要:
agent/:要挂载到各个微服务的探针bin/:启动脚本(注意oapService.sh和webapp.sh)config/:核心配置文件所在oap-libs/:运行时依赖库默认的H2只适合测试,生产环境一定要换存储。以MySQL为例,先创建空数据库(字符集用utf8mb4):
sql复制CREATE DATABASE skywalking CHARACTER SET utf8mb4;
然后修改config/application.yml,找到storage段:
yaml复制storage:
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking?rewriteBatchedStatements=true&useSSL=false"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123456}
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}
踩坑提醒:
oap-libs/下&serverTimezone=Asia/ShanghairewriteBatchedStatements=true当需要横向扩展OAP服务时:
cluster.yml配置:yaml复制standalone:
selector: ${SW_CLUSTER:standalone}
# 改为zookeeper/k8s等实现服务发现
zookeeper:
hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181}
sessionTimeout: ${SW_CLUSTER_ZK_SESSION_TIMEOUT:100000}
IDEA开发环境:
在Run/Debug Configurations的VM options中添加:
code复制-javaagent:/path/to/agent/skywalking-agent.jar
-DSW_AGENT_NAME=user-service
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
JAR包启动:
bash复制java -javaagent:/path/to/agent/skywalking-agent.jar \
-DSW_AGENT_NAME=order-service \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=oap-server:11800 \
-jar your-app.jar
Docker容器:
dockerfile复制FROM openjdk:11-jre
COPY skywalking-agent /usr/local/skywalking-agent
ENTRYPOINT java -javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=${SW_AGENT_NAME} \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=${SW_OAP_SERVER} \
-jar /app.jar
Gateway不显示:
把agent/optional-plugins/apm-spring-cloud-gateway-2.1.x-plugin.jar
复制到agent/plugins/下,并删除其他网关插件
Dubbo链路不完整:
检查是否同时存在dubbo和dubbo-3.x插件冲突
Redis监控缺失:
确认是否使用了lettuce客户端(jedis需要额外插件)
在需要监控的方法上添加注解:
java复制@Trace
@Tag(key = "queryUser", value = "returnedObj")
public User getUserById(@Tag(key = "userId") Long id) {
// 业务代码
}
这样在UI上能看到:
在logback-spring.xml中添加TID追踪:
xml复制<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>[%tid] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
日志示例:
code复制[TID:1a418fc3c3b94aa6949800cc67191854.136.16529817427060001] 2023-05-20 14:30:45.123 [http-nio-8080-exec-1] INFO c.e.user.controller.UserController - 查询用户ID=1001
修改config/alarm-settings.yml示例:
yaml复制rules:
service_sla_rule:
metrics-name: service_sla
op: "<"
threshold: 0.8 # 成功率低于80%触发
period: 10
count: 2 # 连续2个周期
silence-period: 5
message: 服务{name}的成功率低于80%
slow_endpoint_rule:
metrics-name: endpoint_avg
op: ">"
threshold: 1000 # 响应时间超过1秒
period: 5
count: 3
message: 端点{name}平均响应时间超过1秒
JVM参数调优:
在bin/oapService.sh中添加:
bash复制export JAVA_OPTS="-Xms4G -Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
存储分表策略:
对于大流量系统,修改config/application.yml:
yaml复制recordDay: ${SW_STORAGE_DAY:3} # 数据保留天数
superDatasetDay: ${SW_SUPERDATASET_STORAGE_DAY:7} # 超长链路保留
Agent采样控制:
在agent/config/agent.config中设置:
properties复制agent.sample_n_per_3_secs=10 # 每秒最多采样10条
agent.force_sample_error=true # 错误请求全采样
UI安全加固:
修改webapp/webapp.yml:
yaml复制server:
port: 8080
# 增加基础认证
auth:
username: admin
password: $2a$10$NVM/n6WnXKJXqKX3XU8xQeX9vjZrZ6Ql1dJv6QY6b5Qd6QY6b5Qd