SkyWalking从0-1部署成功实战

SkyWalking 从 0 到 1 全链路监控部署实战:20 个微服务如何告别"盲猜式排障"

线上接口偶发超时,20 个微服务互相调用,日志里找不到全局 TraceId,排查问题全靠"猜"?这篇文章带你从零落地 SkyWalking 全链路监控,涵盖架构选型、Docker Compose 一键部署、Agent 无侵入接入、日志串联 TraceId、生产级踩坑与调优,全部可直接抄作业。


一、为什么要选 SkyWalking?

我们项目是一套 Spring Cloud 微服务架构,大约 20 个服务实例。线上时不时冒出接口超时,调用链不透明,日志散落在各个服务里,没有全局 TraceId 可以串联------排障基本靠"盲猜 + 翻日志",效率极低。

技术选型时对比了三款主流方案:

维度 SkyWalking Zipkin Jaeger
代码侵入性 零侵入,字节码增强 需改代码或配 Filter 需改代码或配 Sidecar
语言生态 Java 生态最强,插件丰富 多语言支持,但 Java 插件少 多语言支持,Go 生态好
性能开销 低,官方压测 CPU < 5% 中等 中等
社区活跃度 Apache 顶级项目,国内社区强 渐弱 活跃,CNCF 项目
存储选型 ES / MySQL / BanyanDB ES / MySQL ES / Cassandra

最终选了 SkyWalking:零代码侵入、Java 生态插件最全、国内社区活跃、性能好。如果你也是 Java 微服务栈,基本可以闭眼选它。


二、核心架构:部署前先搞懂这张图

先把组件分工理清楚,部署的时候才不会踩方向性的坑:

四个核心组件,一句话记住:

  • Agent :通过 javaagent 挂载,字节码增强实现无侵入埋点,业务代码零修改
  • OAP Server:接收上报数据,聚合分析,生成服务拓扑、链路和指标
  • Storage :持久化链路、指标、日志数据,生产环境必选 Elasticsearch
  • UI:可视化控制台,查看拓扑图、慢接口、异常链路和调用详情

整理了面试真题、每日技术知识点、系统学习路线,都汇总在个人网站 [www.javadashen.com](https://link.juejin.cn?target=http%3A%2F%2Fwww.javadashen.com "http://www.javadashen.com") 有需要的同学自取。

公众号「Rain的Java大神之路」每天拆一个知识点,陪你悄悄变强,有空来坐坐。


三、从 0 到 1 部署全流程

3.1 环境选型与准备

先搞清楚生产环境和测试环境的配置差异,别等上线了才发现资源不够:

维度 生产环境建议 测试环境建议
SkyWalking 版本 9.3.0+ 稳定版 与生产大版本一致
JDK 11+(OAP 运行要求) 11+
存储选型 Elasticsearch 7.17+,3 节点集群 H2 / MySQL 8 单节点
OAP 配置 4C8G 起步,集群部署 2C4G 单节点
ES 配置 16C/64G,按需扩容 单节点 4G 即可
网络要求 Agent 与 OAP 内网互通,开放 11800 端口 同机部署即可

3.2 Docker Compose 一键拉起(推荐开发/测试环境)

为了避免环境差异带来的麻烦,开发测试环境直接用 Docker Compose 一把梭:

yaml 复制代码
version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    ports:
      - "9200:9200"
    volumes:
      - es-data:/usr/share/elasticsearch/data

  oap:
    image: apache/skywalking-oap-server:9.3.0
    environment:
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      JAVA_OPTS: "-Xms2g -Xmx2g"
    ports:
      - "11800:11800"   # gRPC,Agent 上报用
      - "12800:12800"   # HTTP,UI 查询用
    depends_on:
      - elasticsearch

  ui:
    image: apache/skywalking-ui:9.3.0
    ports:
      - "8080:8080"
    environment:
      SW_OAP_ADDRESS: http://oap:12800
    depends_on:
      - oap

volumes:
  es-data:

启动命令:

bash 复制代码
docker-compose up -d

启动后访问 http://<host>:8080,默认账号密码 admin/admin,就能看到 SkyWalking 的 Dashboard 了。

小技巧 :通过环境变量可以快速切换存储,比如测试环境把 SW_STORAGE 改成 h2 就行,不用改任何代码。

3.3 生产环境 OAP Server 部署

生产环境建议用安装包部署,更可控:

  1. 官网下载对应版本安装包,解压到 /opt/skywalking/oap
  2. 修改 config/application.yml,核心是切换存储为 Elasticsearch:
yaml 复制代码
storage:
  selector: ${SW_STORAGE:elasticsearch7}
  elasticsearch7:
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.100:9200}
    indexShardsNumber: 2
    recordDataTTL: 7   # 链路数据保留 7 天
    metricsDataTTL: 15  # 指标数据保留 15 天
  1. 启动服务:bin/oapService.sh start
  2. 验证:查看 logs/skywalking-oap-server.log 无报错,netstat -tnlp 确认 11800、12800 端口正常监听

3.4 业务服务接入 Agent(核心步骤)

这一步是重中之重。业务代码完全不用改,只需要加启动参数。

传统 Jar 包启动方式:

bash 复制代码
java -javaagent:/opt/skywalking-agent/skywalking-agent.jar \
     -Dskywalking.agent.service_name=trade-order-service-prod \
     -Dskywalking.collector.backend_service=192.168.1.100:11800 \
     -Dskywalking.agent.sample_n_per_3_secs=100 \
     -jar order-service.jar

Docker 容器化方式(Dockerfile 示例):

dockerfile 复制代码
FROM openjdk:11-jre-slim
COPY skywalking-agent/ /opt/skywalking-agent
ADD target/order-service.jar app.jar
ENTRYPOINT ["java", \
   "-javaagent:/opt/skywalking-agent/skywalking-agent.jar", \
   "-DSW_AGENT_NAME=order-service", \
   "-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=oap-host:11800", \
   "-jar", "/app.jar"]

Kubernetes 环境(推荐用环境变量 + ConfigMap 注入):

yaml 复制代码
env:
  - name: SW_AGENT_NAME
    value: "order-service"
  - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
    value: "skywalking-oap.skywalking:11800"
  - name: SW_LOGGING_LEVEL
    value: "WARN"

实战经验 :服务名建议用「项目名-模块名-环境」格式命名(如 trade-order-service-prod),后续多服务管理不容易乱。

agent.config 关键配置:

properties 复制代码
# 服务唯一标识,UI 上按此分组
agent.service_name=trade-order-service-prod
# OAP 服务地址,集群用逗号分隔
collector.backend_service=192.168.1.100:11800
# 采样率:每 3 秒采样数,-1 为全采样
agent.sample_n_per_3_secs=-1
# 排除非核心路径,减少无效上报
agent.ignore_suffix=.jpg,.png,.css,/actuator/health

3.5 效果验证

发起几次业务请求,刷新 UI 控制台:

  • 服务页:能看到注册的服务实例列表
  • 拓扑图:自动生成服务调用关系,哪个服务是瓶颈一目了然
  • 追踪页:完整请求链路、各节点耗时、异常栈信息全都有

四、技术亮点:让监控能力再上一个台阶

4.1 自定义埋点------补充自动插件的盲区

SkyWalking 的自动插件能覆盖大部分主流框架,但对于私有方法或复杂业务逻辑,可以用注解手动接入链路,还能挂载业务参数作为标签:

java 复制代码
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;

@Trace(operationName = "business_calc_order_amount")
@Tags({
    @Tag(key = "orderId", value = "arg[0]"),
    @Tag(key = "finalAmount", value = "returnedObj")
})
public BigDecimal calculateOrderAmount(String orderId, OrderDTO dto) {
    // 复杂业务计算逻辑
    return totalAmount;
}

亮点在哪? 零侵入增强,直接把业务参数和返回值打到链路上。排查问题时不用再翻日志找上下文,打开 UI 就能看到这笔订单的 ID 和最终金额。

4.2 日志集成 TraceId------排障效率翻倍的杀手锏

把 SkyWalking 的 TraceId 注入业务日志,实现链路和日志的一键关联。这是实际工作中用得最多、收益最大的功能。

第一步:引入 Maven 依赖

xml 复制代码
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>9.3.0</version>
</dependency>

第二步:配置 logback-spring.xml

xml 复制代码
<configuration>
    <!-- 引入 SkyWalking 的 tid 转换器 -->
    <conversionRule conversionWord="tid" 
        converterClass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.LogbackPatternConverter"/>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志格式中加入 %tid -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

效果 :每条日志前面会自动带上全局 TraceId,格式如 [TID:2b1c3d4e5f6a7b8c]。拿到这个 ID 去 UI 搜索,全链路所有服务的日志和调用记录全部串起来,排障时间直接缩短 70%+

4.3 自定义忽略端点------给 Agent 减负

健康检查、静态资源这些路径没必要追踪,排除掉可以显著降低 Agent 开销:

properties 复制代码
# agent/config/agent.config 追加配置
plugin.springmvc.collect_http_params=true
# 排除不需要追踪的路径
trace.ignore_path=/health,/metrics,/actuator/**,/static/**

五、生产踩坑实录:6 大难点与解决方案

这部分是实战中最容易卡壳的地方,也是面试时的加分项,整理出来帮大家避坑。

序号 踩坑场景 根因分析 解决方案
1 服务启动后 UI 无数据,链路断连 网络不通、Agent 与 OAP 版本不匹配、插件类冲突 telnet 验证 11800 端口连通性;严格保持 Agent 与 OAP 大版本一致;用 exclude_plugins 排除冲突插件
2 全采样导致 OAP/ES 压力飙升 大流量下全量上报,计算与存储资源扛不住 配置动态采样率,高峰期降采样;过滤静态资源和健康检查路径;OAP 集群部署 + ES 分片扩容
3 异步线程/MQ 调用后链路断链 @Async、线程池、RocketMQ 消费等场景跨进程上下文传递失败 使用 SkyWalking 插件自动传播;自定义线程池用 @TraceCrossThreadContextManager 手动传递;引入 apm-toolkit-traceTracerRunnable 包装 Runnable
4 ES 索引膨胀,磁盘几天就满 链路、指标、日志数据量大,默认保留周期长 调小 recordDataTTLmetricsDataTTL;开启 ES 索引生命周期管理(ILM)按天滚转;冷热数据分离,历史归档
5 K8s 环境 Agent 注入成本高 每个业务镜像都打包 Agent,维护迭代成本高 用 InitContainer 挂载 Agent 目录,业务镜像零改造;用 skywalking-swck 的 Java Agent 注入器,Admission Webhook 自动注入 Sidecar
6 UI 暴露公网无认证 UI 无默认认证机制,直接暴露风险大 前面挡一层 Nginx 反向代理 + auth_basic,或接入 OAuth2 网关,加 IP 白名单

六、整体部署架构总览

最后用一张图总结完整的部署架构,方便大家有个全局视角:


七、经验总结

整套 SkyWalking 落地下来,提炼几条核心经验:

  1. 先跑通最小闭环:单 OAP + 单服务 + ES,验证通了再扩集群、优化采样、对接告警
  2. 存储规划一定要先行:ES 的磁盘、分片、TTL 策略提前规划好,否则运维成本会飙升
  3. 善用 apm-toolkit 打通日志与 Trace:这是 1+1 > 2 的组合,排障效率直接翻倍
  4. 容器化部署用 Operator 或 Helm 管理 :否则 Agent 升级会变成灾难,推荐 skywalking-swck
  5. 先小范围试点,再全量推广:先在一个服务上验证性能损耗和业务影响,没问题再铺开

SkyWalking 最大的优势是 Java 生态无侵入接入,对业务代码零改动。配合自定义埋点和日志 TraceId 集成,能很好地解决微服务排障难、定位慢的痛点。如果你的团队还在"盲猜式排障",是时候行动了。


如果这篇文章对你有帮助,欢迎点赞、收藏、转发,你的支持是我持续输出优质技术内容的最大动力。有任何问题欢迎评论区交流,我们下期见!

别走,交个朋友

我是 Rain ,一个喜欢把复杂技术讲透、让代码落地的实践者。

如果你厌倦了四处收集碎片化的八股文,想看看一线项目里真实的架构决策和踩坑记录,欢迎来我的公众号「Rain 的 Java 大神之路 」坐坐。 在这里,我会把每一次技术复盘、每一个项目的设计源码,毫无保留地分享给你。

个人博客:[www.javadashen.com](https://link.juejin.cn?target=http%3A%2F%2Fwww.javadashen.com "http://www.javadashen.com")

🔥 技术这条路很酷,我们结伴同行。

🚀Keep Coding, Keep Loving ------ 与所有 Java 同路人共勉。

相关推荐
高频因子挖掘机42 分钟前
Python批量获取1000只ETF 5分钟K线:从分页到吞吐量优化的QuantDash实践
后端·算法·github
就叫飞六吧43 分钟前
Spring 动态注册与移除 Bean 科普
java·后端·spring
用户81818706274644 分钟前
第11章 一次线上Full GC频繁的完整排查记录:从监控告警到根因定位
后端
IMPYLH1 小时前
HTML 的 <legend> 元素
java·前端·html
NJCloud1 小时前
Openstack(一)——基础环境配置与依赖服务安装
linux·架构·openstack
围炉聊科技1 小时前
OpenAdapt:录制一次,确定性回放
人工智能·后端·架构
运行时异常1 小时前
WMS 仓储系统集成 AI Agent 实战】第 1 讲:从零搭建开发环境——pgvector 装不上、模型选错、依赖冲突,一天踩完三个大坑
java
夕除1 小时前
redis--008
java·jvm·数据库
SkyStream1 小时前
AI Agent 三件套:Skill、Tool、MCP 到底啥区别?我拆了一个真实部署技能给你看
后端