SkyWalking 分布式追踪系统

随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响,所以会深深的感受到 “银弹” 这个词是不存在的,每种架构都有其优缺点 。

service map

面对以上情况, 我们就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是所谓的APM(应用性能管理)。

目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking,这里主要介绍一下 SkyWalking ,它是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。

下面是 SkyWalking 5.x 的架构图,6.x 会有些变化,目前还没有 Release。

5.x architecture

说明:通过在应用程序中添加 SkyWalking Agent,就可以将接口、服务、数据库、MQ等进行追踪,将追踪结果通过 HTTP 或 gRPC 发送到 SkyWalking Collecter,SkyWalking Collecter 经过分析和聚合,将结果存储到 Elasticsearch 或 H2,SkyWalking 同时提供了一个 SkyWalking UI 的可视化界面,UI 以 GraphQL + HTTP 方式获取存储数据进行展示。

上面的架构图看似模块有点多,但在实际使用时我们并不需要关注太多的实现方式,HTTP、gRPC 、GraphQL 这些都是其内部架构使用到的技术,我们只需安装 SkyWalking Collecter、Elasticsearch 或 H2,然后在需要追踪的服务内配置少量的代码(Java 项目通过修改 JVM 参数即可),最后通过 SkyWalking UI 查看结果。

下面基于 Windows 环境使用 SkyWalking-netcore 来介绍一下 SkyWalking,SkyWalking-netcore 是 SkyWalking 的 .NET Core Agent。

环境要求

  1. JDK8+
  2. Elasticsearch 5.x
  3. 8080,10800,11800,12800 端口不被占用

Elasticsearch下载安装 参考官方教程, 安装完成后需要对 config/elasticsearch.yml 做如下修改:

1
2
3
4
5
6
# 修改
# 如果 cluster.name 不设置为 CollectorDBCluster ,则需要修改 SkyWalking 的配置文件
cluster.name: CollectorDBCluster
network.host: 0.0.0.0
# 增加
thread_pool.bulk.queue_size: 1000

如果是 linux 环境,Elasticsearch 安装可能没有那么顺利,请参考 Linux 环境下安装 Elasticsearch 5.x、6.x 问题汇总

下载 SkyWalking

SkyWalking 个人建议直接下载官方编译好的,下载地址

启动 SkyWalking

skywalking config

config/application.yml 内有所有的默认配置,可以发现默认是使用 Elasticsearch 进行数据存储的,所以在启动 SkyWalking 之前,确保 Elasticsearch 已启动。

SkyWalking 的启动包括两部分,一个是 SkyWalking Collector ,一个是 SkyWalking UI,SkyWalking 解压后的 bin 目录:

skywalking bin

bat 为 windows 环境使用,sh 为 linux 环境使用,我们可以分别其他 collectorService 和 webappService,也可以通过 startup 一次性全部启动,从 startup 中的命令可以知道其实就是分别启动 collectorService 和 webappService。

如果一切顺利(不顺利请多看几遍 快速入门),这时候就可以通过 http://localhost:8080 来查看 SkyWalking UI 了(默认全是0,截图是测试效果),默认账号/密码:admin/admin。

skywalking ui

Java 项目接入

参考 部署 skywalking javaagent,skywalking-agent.jar 位于下载包的 agent 目录下,具体效果这里就不测试了
skywalking java agent

.NET Core 项目接入

参考 skywalking-netcore

新建一个.NET Core API 项目,安装 Nuget 包:

1
Install-Package SkyWalking.AspNetCore

修改 Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    //......
    services.AddSkyWalking(option =>
    {
        option.ApplicationCode = "WebAPIService1";
        option.DirectServers = "localhost:11800";
    });
}

这时候启动程序,请求的追踪结果就会被记录下来,通过 SkyWalking UI 查看

skywalking ui request log

单个服务的效果并不明显,看不出请求跨度、链路关系,下面是一个多服务的例子(下载源码),依赖关系图如下:

service request map

目前 SkyWalking 的 .NET Core Agent 支持通过 HttpClient 发送的请求和 通过 EntityFramework 进行数据库操作的跟踪,其他的作者在支持的路上。根据以上的关系图搭建好项目后,访问接口后结果如下:

skywalking ui spans

一共有4各跨度,先访问 WenAPIService1,然后发送 HttpClient 请求,转到 WenAPIService2,WenAPIService2 执行操作 DB 的命令,每个跨度的耗时一目了然。

skywalking ui topology map

服务关系的拓扑图,调用链路径也非常清晰。

SkyWalking UI 使用上并不复杂,搭建好之后每个操作使用一下就了解了。

参考链接

Apache SkyWalking
SkyWalking-github
SkyWalking-netcore
SkyWalking-sample

如果对你有帮助就好