0.前言
微服务架构,给服务带来很多优秀特性的同时,也给服务的维护带来了挑战。过去单体架构的服务,服务请求慢等异常问题的排查相对简单,但是微服务架构下服务的治理难度就会加大很多,特别是微服务数量众多的情况下,当服务响应变慢,要想知道哪一段请求慢有时候是非常棘手的问题,这个时候就需要用到全链路监控了。目前比较受欢迎的全链路监控方案有:
- opentelemetry+jaeger;
- skywalking; 今天我们就来部署并测试下skywalking的基础功能,看下到底好不好用。
1.SkyWalking简介
1.1 介绍
SkyWalking开源项目由吴晟2015年创建,同年10月在GitHub上作为个人项目开源。SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控和分布式调用链追踪能力。 目前已加入Apache孵化器。目前支持链路追踪和监控应用组件如下,基本涵盖主流框架和容器,如国产PRC Dubbo和motan等,国际化的spring boot,spring cloud。
1.2 主要功能
- 分布式追踪和上下文传输
- 应用、实例、服务性能指标分析
- 根源分析
- 应用拓扑分析
- 应用和服务依赖分析
- 慢服务检测
- 性能优化
1.3 优势
- 国内开源项目,社区成熟,且可与作者直接沟通
- 支持语言更多:Java、.NET Core、PHP、Node.JS、Golang
- 支持java自动探针,代码无侵入,只要简单配置,就可以自动实现各种指标、调用链的埋点
- 众多存储选择:Banyandb、ElasticSearch、MySql、TiDB、Sharding Sphere
- 扩展性:支持模块、插件的可拔插
- 支持java语言的几十种插件,例如:Tomcat、RabbitMq、Kafka,且易于二次开发
1.4 架构图
2.资源准备
本次测试需要部署skywalking,banyandb,skywalking-go-agent,测试程序(golang编写),只需要一台服务器即可,服务器配置如下:
操作系统 | ip地址 | CPU | 内存 | 磁盘空间 |
---|---|---|---|---|
rocky8 linux | 10.173.100.46 | 4核 | 8G | 200G磁盘 |
操作系统和服务器配置可以根据需要自行选择,服务器上还需要准备好go和java环境,保证skywalking和我们用于测试的go程序可以正常运行。
3.skywalking部署
3.1 安装包准备
本次部署的skywalking服务、agent和banyandb均为当前最新版本:
(1)skywalking
- 包名:apache-skywalking-apm-10.2.0.tar.gz
- 版本号:10.2.0
- 下载地址:https://skywalking.apache.org/downloads/
(2)banyandb
- 包名:skywalking-banyandb-0.8.0-banyand.tgz
- 版本号:0.8.0
- 下载地址:https://skywalking.apache.org/downloads/
(3)skywalking-go-agent
- 包名:apache-skywalking-go-0.6.0-bin.tgz
- 版本号:0.6.0
- 下载地址:https://skywalking.apache.org/downloads/
准备好安装包之后,可以将其上传到服务器指定目录,我这里是/root/install目录:
ls /root/install
-rw-r--r--. 1 root root 155705870 Aug 25 17:02 apache-skywalking-apm-10.2.0.tar.gz
-rw-r--r--. 1 root root 59612480 Aug 25 17:27 apache-skywalking-go-0.6.0-bin.tgz
-rw-r--r--. 1 root root 141379837 Aug 25 17:00 skywalking-banyandb-0.8.0-banyand.tgz
3.2 安装banyandb
因为我们下载的是已经编译好的安装包,所以只需要将程序解压到指定目录即可,命令如下:
mkdir -p /usr/local/banyandb
cd /root/install
tar xf skywalking-banyandb-0.8.0-banyand.tgz -C /usr/local/banyandb
mv /usr/local/banyandb/bin/banyand-server-static-linux-amd64 /usr/local/banyandb/bin/banyand
部署完成之后,就可以启动banyanddb了,命令如下:
cd /usr/local/banyandb/bin && ./banyand standalone
启动后输出如下信息:
{"level":"info","time":"2025-08-26T14:01:34+08:00","message":"maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined"}
{"level":"debug","module":"STANDALONE","name":"metadata","registered":1,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"metric-service","registered":2,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"memory-protector","registered":3,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"property","registered":4,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"measure","registered":5,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"stream","registered":6,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"query","registered":7,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"grpc","registered":8,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"liaison-http","registered":9,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"STANDALONE","name":"pprof-service","registered":10,"total":10,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
{"level":"debug","module":"DATA","name":"metadata","registered":1,"total":9,"time":"2025-08-26T14:01:34+08:00","message":"register flags"}
....................
banyandb使用的端口是17912,查看下该端口是否正常监听,命令如下:
ss -ntlp |grep 17912
LISTEN 0 2048 *:17912 *:* users:(("banyand",pid=25221,fd=163))
可以看到banyandb已经正常运行了。
3.3 安装skywalking
skywalking的安装也很简单,同样是将安装包解压到指定目录,然后启动服务即可,安装命令如下:
cd /root/install
tar xf apache-skywalking-apm-10.2.0.tar.gz
mv apache-skywalking-apm-bin /usr/local/skywalking
启动命令如下:
cd /usr/local/skywalking/bin
./startup.sh
该命令会同时启动oapService(后端服务,端口号:11800)和webappService(前端服务,端口号8080)
查看服务运行情况:
ss -ntlp |grep -E '11800|8080'
LISTEN 0 2048 *:8080 *:* users:(("java",pid=12648,fd=63))
LISTEN 0 2048 *:11800 *:* users:(("java",pid=12647,fd=2787))
可以看到skywalking的前后端服务均正常运行,我们访问下skywalking的前端页面,揭开他的庐山真面目,访问地址为:http://10.173.100.46:8080,可以看到如下界面:
3.4 安装go-agent
go-agent主要是用来编译go程序的,只需要安装即可,命令如下:
cd /root/install/
tar xf apache-skywalking-go-0.6.0-bin.tgz
mv apache-skywalking-go-0.6.0-bin /usr/local/skywalking-go
mv /usr/local/skywalking-go/bin/skywalking-go-agent-0.6.0-linux-amd64 /usr/local/skywalking-go/bin/go-agent
4.链路监控测试
skywalking是支持go语言gin框架的,我们这里就编写一个基于gin框架的web服务,通过go-agent编译运行,再看下skywalking上服务的链路情况。
代码如下:
package main
import (
"github.com/gin-gonic/gin"
"time"
_ "github.com/apache/skywalking-go"
)
func main() {
r := gin.Default()
view := r.Group("/users")
{
view.GET("", func(c *gin.Context) {
time.Sleep(100 * time.Millisecond)
c.JSON(200, gin.H{
"data": "get users",
})
})
view.POST("", func(c *gin.Context) {
time.Sleep(30 * time.Millisecond)
c.JSON(200, gin.H{
"data": "create user", })
})
view.PUT("", func(c *gin.Context) {
time.Sleep(20 * time.Millisecond)
c.JSON(200, gin.H{
"data": "update user",
})
})
view.DELETE("", func(c *gin.Context) {
time.Sleep(10 * time.Millisecond)
c.JSON(200, gin.H{
"data": "delete user",
})
})
}
r.Run(":9096")
}
可以看到包括GET,POST,PUT和DELETE四种请求,并且为了避免响应太快,还设置了休眠时间。
通过go-agent编译程序,命令如下:
go build -toolexec="/usr/local/skywalking-go/bin/go-agent -config=/usr/local/skywalking-go/config/config.yaml" -a -o test .
(注意:安装包里面并没有agent的配置文件,需要自行添加,配置文件模板地址:https://github.com/apache/skywalking-go/blob/654a5930e77dcbcfb37800e134b0b8651a1e1c61/tools/go-agent/config/agent.default.yaml) 编译完成之后,会生成一个可运行的test文件,之后运行test,命令如下:
./test
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /users --> main.main.func1 (3 handlers)
[GIN-debug] POST /users --> main.main.func2 (3 handlers)
[GIN-debug] PUT /users --> main.main.func3 (3 handlers)
[GIN-debug] DELETE /users --> main.main.func4 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9096
可以看到监听端口为9096,我们再发送四个请求到web服务,命令如下:
curl -X GET 10.173.100.46:9096/users
curl -X POST 10.173.100.46:9096/users
curl -X PUT 10.173.100.46:9096/users
curl -X DELETE 10.173.100.46:9096/users
web服务响应如下:
[GIN] 2025/08/26 - 14:11:10 | 200 | 100.45117ms | 10.173.100.46 | GET "/users"
[GIN] 2025/08/26 - 14:12:00 | 200 | 30.280279ms | 10.173.100.46 | POST "/users"
[GIN] 2025/08/26 - 14:12:05 | 200 | 20.191316ms | 10.173.100.46 | PUT "/users"
[GIN] 2025/08/26 - 14:12:11 | 200 | 10.209714ms | 10.173.100.46 | DELETE "/users"
因为设置了睡眠时间,所以每个请求的响应时间是不一样的。
现在我们再到skywalking上去看下链路监控情况如何,如下图所示:
可以看到请求的成功率和时延等信息,说明skywalking成功采集到了web接收到的请求时延指标。
5.总结
整个部署和指标采集的过程还是比较简单的,当然skywalking的功能还远不止我们展示的这样,想了解更多详情的,可以查看官方给出的文档,当然skywalking主要是针对微服务的,在微服务时延采集上效果更加明显,大家有兴趣也可以尝试下。