首页 > 科技 > 微服务异常之链路跟踪APM工具

微服务异常之链路跟踪APM工具

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


目录

  1. 前言
  2. 什么是链路跟踪
  3. 技术架构
  4. 下载启动SkyWalking
  5. JavaAgent服务器探针
  6. ServiceTopology监控
  7. Trace监控
  8. Jvm监控
  9. 服务告警
  10. 总结

前言

微服务框架落地后,分布式部署架构带来的问题就会迅速凸显出来。尤其线上出现问题,不知道如何排查,问题出现在哪个服务?如何快速定位问题?如何跟踪业务调用链路?如何分析解决业务瓶颈?今天老顾来跟小伙伴们看看如何解决以上问题。

什么是链路追踪

微服务架构是通过业务来划分服务的,使用REST调用。对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。

上图中,user调用A,A会调用C,C再调用E;这条调用链路,我们还能够看清楚;但是一旦微服务很多调用依赖复杂就看不清楚了,如下图

上图是不是看到后,有密集恐惧症,像个线团,一团乱麻;如果这个时候出现了调用异常,那我们依据调用接口入口,一步步、一个服务一个服务的去跟踪调试;这个流程会把人搞疯的,也许1个小时后,也不知道什么问题;就像我们以前找线头,然后一步步的去重新卷圈。

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

什么是 SkyWalking

Skywalking是一款国内开源的应用性能监控工具,支持对分布式系统的监控、跟踪和诊断。目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking。SkyWalking也是Apache的孵化项目之一,拥有顶级二级域名

它提供了如下的主要功能特性

功能特性:

  • 多种监控手段,语言探针和服务网格(Service Mesh)
  • 多语言自动探针,Java,.NET Core 和 Node.JS
  • 轻量高效,不需要大数据
  • 模块化,UI、存储、集群管理多种机制可选
  • 支持告警
  • 优秀的可视化方案

技术架构

上图看了是不是比较乱,其实Skywalking总体可以分为四部分

1、Skywalking Agent:使用Javaagent做字节码植入,无侵入式的收集,并通过HTTP或者gRPC方式发送数据到Skywalking Collector

2、Skywalking Collector :链路数据收集器,对agent传过来的数据进行整合分析处理并落入相关的数据存储中。

3、Storage:Skywalking的存储,在6.x版本中支持以ElasticSearch(推荐)、Mysql、TiDB、H2、作为存储介质进行数据存储。

4、UI :Web可视化平台,用来展示落地的数据。

下载并启动 SkyWalking

官方已经为我们准备好了编译过的服务端版本,现在最新版本为6.4.0

下载地址为 http://skywalking.apache.org/downloads/

配置 SkyWalking

下载完成后解压缩

# tar -xvf apache-skywalking-apm-6.4.0.tar
# mv apache-skywalking-apm-bin /usr/local/skywalking
# cd /usr/local/skywalking

修改配置

# cd config

# vim application.yml@

配置存储方式,默认H2,官方推荐elasticsearch

这里需要做三件事

  1. 注释 H2 存储方案
  2. 启用 ElasticSearch 存储方案
  3. 修改 ElasticSearch 服务器地址

clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}

启动 SkyWalking

修改完配置后,进入 skywalking\bin 目录,运行startup.bat启动服务端

通过浏览器访问 http://localhost:8080 出现如下界面即表示启动成功

默认的用户名密码为:admin/admin,登录成功后,效果如下图

Java Agent 服务器探针

agent简单的理解就是放一个插件,随着应用程序启动,监控数据、收集数据、发送数据的作用。

探针文件在skywalking/agent目录下

启动方式

在以前启动应用程序时,加上一些参数

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar 
-Dskywalking.agent.service_name=shop-goods-provider
-Dskywalking.collector.backend_service=localhost:11800
-jar yourApp.jar

参数含义:

  • -javaagent:用于指定探针路径
  • -Dskywalking.agent.service_name:用于重写 agent/config/agent.config 配置文件中的服务名
  • -Dskywalking.collector.backend_service:用于重写 agent/config/agent.config 配置文件中的服务地址

启动后,访问链接,就会发现 Service 与 Endpoint 已经成功检测到了

表示 SkyWalking 链路追踪配置成功。

Service Topology监控

调用链路监控可以从两个角度去看待。我们先从整体上来认识一下我们所监控的系统。

通过给服务添加探针并产生实际的调用之后,我们可以通过Skywalking的前端UI查看服务之间的调用关系。

从图中可以看到:

有两个服务节点:provider & consumer

有一个数据库节点:localhost【mysql】

consumer消费了provider提供出来的接口。

一个系统的拓扑图让我们清晰的认识到系统之间的应用的依赖关系以及当前状态下的业务流转流程。

细心的小伙伴们可能发现图示节点consumer上有一部分是红色的,红色是什么意思呢?

红色代表当前流经consumer节点的请求有一断时间内是响应异常的。当节点全部变红的时候证明服务现阶段内就彻底不可用了。运维人员可以通过Topology迅速发现某一个服务潜在的问题,并进行下一步的排查并做到预防。

Skywalking Trace监控

Skywalking通过业务调用监控进行依赖分析,提供给我们了服务之间的服务调用拓扑关系、以及针对每个endpoint的trace记录。

我们在之前看到consumer节点服务中发生了错误,让我们一起来定位下错误是发生在了什么地方又是什么原因呢?

在每一条trace的信息中都可以看到当前请求的时间、GloableId、以及请求被调用的时间。我们分别看一看正确的调用和异常的调用。

Trace调用链路监控

上图展示的是一次正常的响应,这条响应总耗时19ms;可以详细点击每个span查看详细信息

Service JVM信息监控

Skywalking还可以监控到Service运行时的CPU、堆内存、非堆内存使用率、以及GC情况。这些信息来源于JVM

Skywalking 服务告警

上面我们提到了通过查看拓扑图以及调用链路可以定位问题,可是运维人员又不可能一直盯着这些数据,那么我们就需要告警能力,在异常达到一定阈值的时候主动的提示我们去查看系统状态。

在Sywalking 6.x版本中新增了对服务状态的告警能力。它通过webhook的方式让我们可以自定义我们告警信息的通知方式。诸如:邮件通知、微信通知、短信通知等。

告警的规则配置。在alarm-settings.xml中可以配置告警规则,告警规则支持自定义。

1、service_resp_time_rule:告警规则名称 ***_rule (规则名称可以自定义但是必须以’_rule’结尾

2、indicator-name:指标数据名称: 定义参见http://t.cn/EGhfbmd

3、op: 操作符: > , < , = 【当然你可以自己扩展开发其他的操作符】

4、threshold:目标值:指标数据的目标数据 如sample中的1000就是服务响应时间,配合上操作符就是大于1000ms的服务响应

5、period: 告警检查周期:多久检查一次当前的指标数据是否符合告警规则

6、counts: 达到告警阈值的次数

7、silence-period:忽略相同告警信息的周期

8、message:告警信息

文件结尾有最后一个webhooks属性:服务告警通知服务地址

webhooks:
# - http://127.0.0.1/notify/
# - http://127.0.0.1/go-wechat/

总结

本文简单了介绍了Skywalking简单的知识,可以通过Skywalking,可以让我们方便的查看微服务架构中系统瓶颈以及性能问题等。小伙伴们可以去尝试操作一下哦,谢谢!!!


---End---

最近老顾上传了微服务网关的分享课程,请大家多多支持

推荐阅读

1、面试必备:网关异常了怎么办?如何做全局异常处理?

2、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则

3、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍

4、API网关在微服务架构中的应用,这一篇就够了

5、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)

6、Lambda用在哪里?几种场景?

7、为什么会出现Lambda表达式,你知道吗?

8、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用

9、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构

10、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足

11、阿里P7二面:聊聊零拷贝的原理

12、秒杀系统的核心点都在这里,快来取

13、你了解如何利用token方式实现分布式Session吗?

14、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂

15、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调

16、企业实战Redis全方面思考,你思考了吗?

17、面试题:Thread的start和run的区别

18、面试题:什么是CAS?CAS的作用以及缺点

19、如何访问redis中的海量数据?避免事故产生

20、如何解决Redis热点问题?以及如何发现热点?

21、如何设计API接口,实现统一格式返回?

22、你真的知道在生产环境下如何部署tomcat吗?

23、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

24、分享大厂分布式唯一ID设计方案,快来围观

25、你想了解一线大厂的分布式唯一ID生成方案吗?

26、你知道如何处理大数据量吗?(数据拆分篇)

27、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

28、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

29、你了解大型网站的页面静态化吗?

30、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

31、你知道怎么解决DB读写分离,导致数据不一致问题吗?

32、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

33、你真的知道怎么使用缓存吗?

34、如何利用锁,防止缓存击穿?重构思想的重要性

35、海量订单产生的业务高峰期,如何避免消息的重复消费?

36、你知道如何保障生产端100%消息投递成功吗?

37、微服务下的分布式session该如何管理?

38、阿里二面:filter、interceptor、aspect应如何选择?很多人中招

39、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里

40、阿里二面:CDN缓存控制原理,看看能不能难住你

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/232434.html