一、APM

1、什么是APM

随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂

  • 不同的服务可能由不同的团队开发、甚至可能使用不同的编程语言来实现
  • 服务有可能布在了几千台服务器,横跨多个不同的数据中心

因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是APM系统,全称是(Application Performance Monitor,当然也有叫 Application Performance Management tools)

APM最早是谷歌公开的论文提到的 Google Dapper。Dapper是Google生产环境下的分布式跟踪系统,自从Dapper发展成为一流的监控系统之后,给google的开发者和运维团队帮了大忙,所以谷歌公开论文分享了Dapper。

2、原理

先来看一次请求调用示例:

  1. 包括:前端(A),两个中间层(B和C),以及两个后端(D和E)
  2. 当用户发起一个请求时,首先到达前端A服务,然后分别对B服务和C服务进行RPC调用;
  3. B服务处理完给A做出响应,但是C服务还需要和后端的D服务和E服务交互之后再返还给A服务,最后由A服务来响应用户的请求;

1-链路追踪.png

如何才能实现跟踪呢?需要明白下面几个概念:

  • 探针:负责在客户端程序运行时收集服务调用链路信息,发送给收集器
  • 收集器:负责将数据格式化,保存到存储器
  • 存储器:保存数据
  • UI界面:统计并展示
    探针会在链路追踪时记录每次调用的信息,Span是基本单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它;同时附加(Annotation)作为payload负载信息,用于记录性能等数据。

一个Span的基本数据结构:

type Span struct {
    TraceID    int64 // 用于标示一次完整的请求id
    Name       string //名称
    ID         int64 // 当前这次调用span_id
    ParentID   int64 // 上层服务的调用span_id  最上层服务parent_id为null,代表根服务root
    Annotation []Annotation // 记录性能等数据
    Debug      bool
}

一次请求的每个链路,通过spanId、parentId就能串联起来:

2-链路追踪.png

当然,从请求到服务器开始,服务器返回response结束,每个span存在相同的唯一标识trace_id。

3、技术选型

市面上的全链路监控理论模型大多都是借鉴Google Dapper论文,重点关注以下三种APM组件:

  • Zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。
  • Pinpoint:一款对Java编写的大规模分布式系统的APM工具,由韩国人开源的分布式跟踪组件。
  • Skywalking:国产的优秀APM组件,是一个对JAVA分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。现在是Apache的顶级项目之一。

选项就是对比各个系统的使用差异,主要对比项:

  1. 探针的性能
    主要是agent对服务的吞吐量、CPU和内存的影响。微服务的规模和动态性使得数据收集的成本大幅度提高。
  2. collector的可扩展性
    能够水平扩展以便支持大规模服务器集群。
  3. 全面的调用链路数据分析
    提供代码级别的可见性以便轻松定位失败点和瓶颈。
  4. 对于开发透明,容易开关
    添加新功能而无需修改代码,容易启用或者禁用。
  5. 完整的调用链应用拓扑
    自动检测应用拓扑,帮助你搞清楚应用的架构

三者对比如下:

对比项zipkinpinpointskywalking
探针性能
collector扩展性
调用链路数据分析
对开发透明性
调用链应用拓扑
社区支持

综上所述,使用skywalking是最佳的选择。

二、Skywalking

1、简介

SkyWalking创建与2015年,提供分布式追踪功能,是一个功能完备的APM系统。
官网地址:http://skywalking.apache.org/

主要的特征:

  • 多语言探针或类库
  • Java自动探针,追踪和监控程序时,不需要修改源码。
  • 社区提供的其他多语言探针
    • .NET Core
    • Node.js
  • 多种后端存储: ElasticSearch, H2
  • 支持OpenTracing
  • Java自动探针支持和OpenTracing API协同工作
  • 轻量级、完善功能的后端聚合和分析
  • 现代化Web UI
  • 日志集成
  • 应用、实例和服务的告警

3-链路追踪.png

大致分四个部分:

  • skywalking-oap-server: 就是Observability Analysis Platform的服务,用来收集和处理探针发来的数据
  • skywalking-UI: 就是skywalking提供的Web UI 服务,图形化方式展示服务链路、拓扑图、trace、性能监控等
  • agent: 探针,获取服务调用的链路信息、性能信息,发送到skywalking的OAP服务
  • Storage: 存储,一般选择elasticsearch

因此我们安装部署也从这四个方面入手,目前elasticsearch已经安装完成,只需要部署其他3个即可。

2、部署安装

  • 通过docker部署,需要部署两部分,分别是skywalking-oap-server和skywalking-UI。
#oap服务,需要指定Elasticsearch以及链接信息
docker run -d \
-e TZ=Asia/Shanghai \
--name oap \
-p 12800:12800 \
-p 11800:11800 \
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=192.168.150.101:9200 \
apache/skywalking-oap-server:9.1.0


#部署ui,需要指定oap服务
docker run -d \
--name oap-ui \
-p 48080:8080 \
-e TZ=Asia/Shanghai \
-e SW_OAP_ADDRESS=http://192.168.150.101:12800 \
apache/skywalking-ui:9.1.0

4-链路追踪.png

3、微服务探针

现在,Skywalking的服务端已经启动完成,我们还需要在微服务中加入服务探针,来收集数据。

5-探针.png

将skywalking-agent解压到非中文目录。
在微服务中设置启动参数,以work微服务为例:

6-启动参数.png
输入如下内容:

-javaagent:F:\code\sl-express\docs\resources\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=ms::sl-express-ms-work
-Dskywalking.collector.backend_service=192.168.150.101:11800

参数说明:

  • javaagent: 将skywalking-agent以代理的方式整合到微服务中
  • skywalking.agent.service_name:指定服务名称,格式:[{group name}::]{logic name}
  • skywalking.collector.backend_service:指定oap服务,注意端口要走11800

设置完成后,重新启动work微服务,多请求几次接口,即可自oap-ui中看到数据。

7-链路追踪.png

8-链路追踪.png

查看链路:

9-链路追踪.png

服务关系拓扑图:

10-链路追踪.png