链路跟踪的概念
在分布式微服务系统中,一次外部请求往往需要经过多个服务、多个中间件的协同才能完成。链路追踪的目的是将一次分布式请求还原成完整的调用链路,集中展示各服务节点的耗时、请求状态、机器信息等,帮助开发者快速定位性能瓶颈和故障原因。
silky 框架通过集成 SkyAPM 实现链路追踪,支持以下维度的追踪:
| 追踪维度 | 说明 |
|---|---|
| HTTP 请求 | 网关接收到的外部 HTTP 请求 |
| RPC 调用 | 微服务之间的内部 RPC 通信 |
| TCC 分布式事务 | 各阶段(Try/Confirm/Cancel)的执行链路 |
| EFCore 数据访问 | 数据库查询链路(需引入 EFCore 诊断包) |
搭建 SkyWalking 服务
SkyWalking 服务由三个组件构成:
- Elasticsearch:存储链路数据
- skywalking-oap-server:SkyWalking 分析服务
- skywalking-ui:可视化 UI 界面
silky 提供了现成的 docker-compose 编排文件,进入 samples/docker-compose/infrastr 目录执行:
docker-compose -f docker-compose.skywalking.yml up -d
服务启动后:
- OAP gRPC 端口:
11800(用于 Agent 上报数据) - SkyWalking UI 地址:
http://127.0.0.1:8080
在 silky 应用中启用链路追踪
步骤一:注入 SkyAPM 服务
在每个微服务应用中(Web 主机、通用主机均适用),通过 IConfigureService 注册 SkyAPM 服务:
public class ConfigureService : IConfigureService
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddSilkySkyApm(); // 启用 SkyAPM 链路追踪
}
}
步骤二:添加 SkyAPM 配置文件
在项目根目录添加 skyapm.json 配置文件,并设置复制到输出目录:
{
"SkyWalking": {
"ServiceName": "DemoHost",
"Namespace": "",
"HeaderVersions": ["sw8"],
"Sampling": {
"SamplePer3Secs": -1,
"Percentage": -1.0
},
"Logging": {
"Level": "Information",
"FilePath": "logs/skyapm-{Date}.log"
},
"Transport": {
"Interval": 3000,
"ProtocolVersion": "v8",
"QueueSize": 30000,
"BatchSize": 3000,
"gRPC": {
"Servers": "127.0.0.1:11800",
"Timeout": 10000,
"ConnectTimeout": 10000,
"ReportTimeout": 600000
}
}
}
}
关键配置项说明:
| 配置项 | 说明 |
|---|---|
ServiceName | 当前服务在 SkyWalking UI 中显示的名称,建议与服务主机名一致 |
Transport.gRPC.Servers | SkyWalking OAP 服务地址,格式为 host:port |
Sampling.SamplePer3Secs | 每 3 秒采样次数,-1 表示全量采样 |
Sampling.Percentage | 采样百分比,-1.0 表示 100% 采样 |
步骤三:在 SkyWalking UI 中查看调用链路
发起 HTTP 请求后(例如调用 /api/test),打开 SkyWalking UI:http://127.0.0.1:8080,通过 普通服务 → 追踪(Trace) 即可查看完整的调用链路。

完整配置示例
以下是一个包含链路追踪的微服务完整配置示例(appsettings.yaml + skyapm.json):
appsettings.yaml:
rpc:
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW
port: 2200
registryCenter:
type: Nacos
connectionStrings: http://127.0.0.1:8848
distributedCache:
redis:
isEnabled: true
configuration: 127.0.0.1:6379,defaultDatabase=0
skyapm.json:
{
"SkyWalking": {
"ServiceName": "OrderService",
"Transport": {
"gRPC": {
"Servers": "127.0.0.1:11800"
}
}
}
}
建议
在生产环境中,可以根据流量情况调整 SamplePer3Secs 或 Percentage 来控制采样率,避免链路数据过多影响存储和查询性能。
