SkyWalking 是个啥?
想象一下,你家有个超级复杂的快递网络,包裹从A点到B点要经过好几个中转站。如果包裹送晚了,你咋知道是哪个环节出了问题?SkyWalking 就是干这个的!它是一个专门为分布式系统(比如微服务架构)设计的 监控工具,能帮你追踪每个请求的“旅程”,告诉你哪里卡住了、哪里出错了。
简单说,SkyWalking 是个“全能侦探”:
- 追踪请求:告诉你一个请求从前端到后端跑了哪些服务,花了多少时间。
- 监控性能:看看你的系统有多快,哪里拖后腿。
- 画关系图:自动生成一张图,告诉你服务之间咋“勾搭”的。
- 报警:系统出问题时,它会“喊”你赶紧修!
它由 Apache 基金会 开发,完全免费,还支持 Java、Python、Node.js 等多种语言,特别适合微服务、云原生这些时髦玩意儿。
SkyWalking 能帮你干啥?
SkyWalking 就像给你的系统装了个高清摄像头,以下是它的几个“绝活”:
- 追踪请求,像看侦探片
假设你在网上买了个东西,点“下单”后,请求得跑好几个服务:前端 → 订单服务 → 支付服务 → 库存服务。如果页面半天没反应,你咋知道是哪个服务“偷懒”了?SkyWalking 会把这个请求的“旅行路线”画出来,告诉你每个服务花了多久,哪个环节卡住了。比如,它会说:“嘿,支付服务用了2秒,太慢了!”
- 抓性能问题,揪出“慢吞吞”
SkyWalking 能实时盯着你的系统,告诉你:
哪个接口响应慢得像乌龟?
系统一秒能处理多少请求?
哪个服务老是报错? 这些数据都用图表展示,简单明了,找到问题就像找自家钥匙一样快。
- 画张“关系网”,看清谁靠谁
SkyWalking 还能自动生成一张“关系图”,告诉你系统里每个服务跟谁有“来往”。比如,订单服务依赖支付服务,支付服务又依赖数据库,这张图会清清楚楚画出来,连哪个环节慢了、错多了都标得明明白白。
- 出问题就喊你
你总不想半夜被老板叫起来修 Bug 吧?SkyWalking 支持设置告警,比如接口响应时间超过1秒,或者错误率飙升,它会通过邮件、钉钉啥的提醒你:“快来,系统要炸了!”
- 跟云原生“玩得转”
如果你用 Kubernetes 或者 Istio 这种云原生技术,SkyWalking 也能无缝配合,监控服务网格里的性能,简直不要太香。
SkyWalking 咋工作?
SkyWalking 就像个高效的“监控团队”,分成几部分干活:
- 探针(Agent)
探针就像装在你程序里的“小间谍”,悄悄收集数据(比如请求时间、错误信息),然后发给后端。装探针超简单,比如 Java 程序只要加个启动参数就行,基本不用改代码。
- 核心大脑(OAP)
OAP 是 SkyWalking 的“大脑”,负责处理探针传来的数据,分析、计算、存起来。它还能跟各种存储“搭伙”,比如 Elasticsearch、MySQL。
- 存储库
监控数据得有个地方存吧?SkyWalking 支持用 Elasticsearch(适合大项目)、MySQL(中小项目)甚至 H2(测试用)来存数据,随你挑。
- 炫酷界面(Web UI)
SkyWalking 提供一个网页界面,打开就能看到请求路径、性能图表、服务关系图,简直像在玩“系统监控游戏”!

SkyWalking docker 安装
下载镜像
docker pull apache/skywalking-oap-server:9.5.0 docker pull apache/skywalking-ui:9.5.0
启动skywalking-oap,这里 默认使用的H2存储,即数据存储在内存中,容器重启数据就没有了。
docker run -d --name skywalking-oap \ -p 12800:12800 -p 11800:11800 \ apache/skywalking-oap-server:9.5.0
启动skywalking-ui
docker run -d --name skywalking-ui \ --link skywalking-oap:skywalking-oap \ -e SW_OAP_ADDRESS=http://skywalking-oap:12800 \ -e TZ=Asia/Shanghai \ -p 8088:8080 \ apache/skywalking-ui:9.5.0
Node.js应用接入Skywalking实现APM监控
Node.js应用接入,Skywalking 官方提供新的库来接入,原来的模块是 SkyAPM-nodejs 已经不用了,使用新的库 skywalking-backend-js ,官方要求 SkyWalking backend (OAP) 8.0+ and NodeJS >= 10. 支持已下框架和模块,更多信息查看 README.md
// 安装 skywalking-backend-js 模块 npm install skywalking-backend-js nodejs 代码 // 引入 SkyWalking 代理 const {default: agent} = require('skywalking-backend-js'); agent.start({ serviceName: 'service-notification', collectorAddress: '192.168.3.5:11800' // SkyWalking OAP 服务地址(默认值,可根据实际修改) }) const express = require('express') const query = require('./db'); const axios = require('axios');
skywalking-ui的视图

SkyWalking k8s 安装
创建skywalking命名空间
kubectl create namespace skywalking
创建 skywalking-oap-deployment
# skywalking-oap-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: skywalking-oap namespace: skywalking labels: app: skywalking-oap spec: replicas: 1 selector: matchLabels: app: skywalking-oap template: metadata: labels: app: skywalking-oap spec: containers: - name: skywalking-oap image: apache/skywalking-oap-server:9.5.0 ports: - containerPort: 12800 name: rest - containerPort: 11800 name: grpc
kubectl apply -f skywalking-oap-deployment.yaml -n skywalking
创建 skywalking-oap-service 暴露服务
# skywalking-oap-service.yaml apiVersion: v1 kind: Service metadata: name: skywalking-oap namespace: skywalking spec: selector: app: skywalking-oap ports: - protocol: TCP port: 12800 targetPort: 12800 name: rest - protocol: TCP port: 11800 targetPort: 11800 name: grpc
kubectl apply -f skywalking-oap-service.yaml -n skywalking
创建 skywalking-ui-deployment
# skywalking-ui-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: skywalking-ui namespace: skywalking labels: app: skywalking-ui spec: replicas: 1 selector: matchLabels: app: skywalking-ui template: metadata: labels: app: skywalking-ui spec: containers: - name: skywalking-ui image: apache/skywalking-ui:9.5.0 ports: - containerPort: 8080 env: - name: SW_OAP_ADDRESS value: "http://skywalking-oap:12800" - name: TZ value: "Asia/Shanghai"
kubectl apply -f skywalking-ui-deployment.yaml -n skywalking
创建 skywalking-ui-service 暴露服务
# skywalking-ui-service.yaml apiVersion: v1 kind: Service metadata: name: skywalking-ui namespace: skywalking spec: type: NodePort selector: app: skywalking-ui ports: - protocol: TCP port: 8080 targetPort: 8080 nodePort: 30088
kubectl apply -f skywalking-ui-service.yaml -n skywalking
修改nodejs代码
nodejs 代码 // 引入 SkyWalking 代理 const {default: agent} = require('skywalking-backend-js'); agent.start({ serviceName: 'service-notification', // 跨命名空间访问时,使用 Service 的全域名(如 skywalking-oap.skywalking.svc.cluster.local:11800),这是 k8s 集群内的标准 DNS 解析方式。 collectorAddress: 'skywalking-oap.skywalking.svc.cluster.local:11800' }) const express = require('express') const query = require('./db'); const axios = require('axios');