专栏首页架构专题这一轮,skywalking胜出

这一轮,skywalking胜出

了解xjjdog的都知道,在微服务trace方面,我在两家公司实施了uber的jaeger。但是,jaeger虽然可以搜集调用链信息并查询,但统计图表相对欠缺,尤其对于服务间调用关系部分,不够直观。

今天,我们来看一下skywalking,以及和它很像的pinpoint。说它们是近亲,是因为它们都是基于agent探针技术进行实施的。

如果你不了解探针是何方神圣,xjjdog以前也普及过一篇文章。

《冷门instrument包,功能吊炸天》

一、概述

引入微服务虽然解决了一部分问题,但大大增加了系统维护难度及复杂度。而调用链监控正是解决微服务复杂性所带来的一系列问题的强效手段。

那么问题来了:调用链有啥用?为什么上调用链?不上隔壁产品会不会来打我?

答:

1.解决出现问题后,难以定位。——对整个调用链路有个完善的监控

2.解决链路复杂。——清晰的链路图谱反映服务之间的依赖、调用关系

3.整体系统性能及运行情况,需要明确的体现,才能根据实际情况调整资源

目前市面面上主流的调用链有:jaeger,pinpoint,Zipkin,CAT,skywalking等等,本次仅针对需求进行介绍。

二、对比(skywalking&pinpoint)

以上提到的调用链监控功能都大差不差,那关键就在于我们想要的——服务拓扑,以及更加直观的展示。

于是其他选手被一波带走,这样场上就只剩两位参赛者了。到底谁nb,且听我慢慢道来。

PinPoint

Skywalking

项目发起人

Woonduk Kang (韩囯)

吴晟(中囯)

性能损耗

用户

非常多

非常多

社区

非 apache + —般

apache孵化+ QQ官方交流群+活跃

文档

详细

详细

跟踪粒度

一般

代码侵入性

告警

支持

支持

JVM监控

支持

支持

UI丰富度

很高

一般

实现方式

字节码注入

字节码注入

兼容 OpenTracing

扩展性

Traceld 查词

不支持

支持

发布包

war

jar

协议

thrift

gRPC

支持语言

Java, PHP

Java, C#, PHP, Node.js

存储

HBase+MySQL

ES, H2, MySQL, TiDB, Sharding-Sphere

过滤追踪

filter配置

agent.config + apm-trace-ignore-plugin

组件

collector+Web+agent+存储

OAP+Web+agent+存储+zk

GitHub Star

9.4k

10.8k+

当看到Hbase……唔……嗯。走好……不送……告辞…… 胜者——skywalking! 这么草率当然有人不服,放出pinpoint的ui,诸位感受一下。

坐标: https://naver.github.io/pinpoint/ 感兴趣的小伙伴可私下尝试。

三、skywalking

不要问为啥是它,问就是信仰!就像装机用asus一样。但姑且还是介绍一下……

skywalking是一个开源的观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合以及可视化数据,它提供了一种简便的方式来清晰地观测分布式系统, 甚至可以观测横跨不同云的系统.

名词解释

服务(Service): 表示对请求提供相同行为的一系列或一组工作负载. 在使用打点代理或 SDK 的时候, 你可以定义服务的名字. 如果不定义的话, SkyWalking 将会使用你平台上定义的名字

服务实例(Service Instance): 上述的一组工作负载中的每一个工作负载称为一个实例. 就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程. 但当你在使用打点代理的时候, 一个服务实例实际就是操作系统上的一个真实进程

端点(Endpoint): 对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名.

架构

SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储用户界面

探针基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式

平台后端是一个支持集群模式运行的后台, 用于数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程. 平台后端还提供了各种可插拔的能力, 如不同来源数据(如来自 Zipkin)格式化, 不同存储系统以及集群管理. 你甚至还可以使用观测分析语言来进行自定义聚合分析

存储是开放式的. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理), 也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现

用户界面对于 SkyWalking 的最终用户来说非常炫酷且强大. 同样它也是可定制以匹配你已存在的后端的

四、限制

那么skywalking是否真的就天下无敌呢?成也探针,败也探针,限制就在它身上。

进程内传播在大多数情况下成为可能。许多高级编程语言(如 Java, .NET)都是用于构建业务系统. 大部分业务逻辑代码对于每一个请求来说都运行在同一个线程内, 这使得传播是基于线程 ID 的, 以确保上下文是安全的.

仅仅对某些框架和库奏效。因为是代理来在运行时修改代码的, 这也意味着代理插件开发者事先就要知道 所要修改的代码是怎么样的. 因此, 在这种探针下通常会有一个已支持的列表清单.支持服务列表:

https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Supported-list.md

跨线程可能并非总是奏效 如上所述, 每个请求的代码大都运行在一个线程之内, 对于业务代码来说尤其如此. 但是在其他一些场景下, 它们也会在不同线程下工作, 比如指派任务到其他线程, 任务池, 以及批处理. 对于一些语言, 可能还提供了协程或类似的概念如 Goroutine, 使得开发者可以低开销地来执行异步操作, 在这些场景下, 自动打点可能会遇到一些问题。

五、使用

主界面

除一些图表、top榜之外。还可查看全局 或 某个服务 或某个节点的详细信息。(如 请求、JVM等)

拓扑图

如下图所示,为当前服务调用关系拓扑。但存在一定局限性,具体说明如下:

1.服务间必须要存在流量关系才会显示 2.默认显示10分钟内,最大显示1小时内服务调用。(后期可能会有优化) 3.需使用chrome,firefox等正经浏览器。搜狗/360等浏览器,无法显示拓扑 4.点击某个服务节点,将显示依赖关系 5.点击连线中点将显示请求信息 6.刷新按钮 将显示最近10分钟拓扑,并重置当前所有查询 及 操作 7.根据线条流向,可获知调用 <-> 被调用关系 8.因探针无法支持,部分服务显示为ip。如mysql,postgresql,memcached,redis,mongodb,kafka,xxl-job(显示图标) 9.红色节点表示最近存在请求失败的情况 10.显示的服务名,与发布系统名一致。若eureka服务名 & 发布系统名不同可能难以检索服务

若想看order-rpc服务的调用关系,可进行搜索,结果如下图【不要开自动刷新,会被无限重置

调用链

通过【追踪】进入调用链查看界面,可通过服务、实例、请求状态等进行查询。具体说明如下: 1.查询默认按持续时间倒序 2.可按追踪id查询相关接口 3.可切换调用链展现形式以进行不同分析 4.可单机某个节点查看具体信息,如sql、堆栈信息等

End

以上就是skywalking的常用功能,更多方式各位大佬可自由探索。嗯嗯,现在我手里,除了jaeger,又多了一个推荐选项。任何东西,还是要试一试,才知道它到底是不是美妙呀。

本文分享自微信公众号 - 小姐姐味道(xjjdog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 常问的15个顶级Java多线程面试题

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得更多职位,那么你应该准备很多关于多线程的问题。

    搜云库技术团队
  • Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

    测试方法是可以带有参数的。每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数。

    北京-宏哥
  • 一个 Java 对象到底有多大?

    编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑。但是殊不知,在我们不经意间,大量的内存被无...

    芋道源码
  • 【Python 第75课】可迭代对象和迭代器

    for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的?

    Crossin先生
  • 面试再问ThreadLocal,别说你不会

    以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了。表面上看他是和多线程,线程同步有关的一个工具...

    业余草
  • 帮你少写一大半参数校验代码的小技巧

    几乎每个web网站都会对用户提交的参数进行校验,前端要做,后端也要做。防止用户直接通过接口调用的方式来请求或保存数据,从而导致产生脏数据等其他严重的后果。

    Java识堂
  • 面试官,Java8 JVM内存结构变了,永久代到元空间

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • 慌了!面试官又拿JVM开怼!

    对于Java人来说,JVM无疑是进阶时必须迈过的坎。不管初入职场还是跳槽升职,JVM更是面试时的必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在...

    Java3y
  • Java日志Log4j或者Logback的NDC和MDC功能

    Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件...

    JAVA日知录
  • 每个阿里程序员都必须搞懂的Maven基础知识

    以前我们写代码时,jar包都默认放在一个叫 /lib 的目录下,然后把该目录设置为classpath可以读取到的目录,如下图所示:

    老钱

扫码关注云+社区

领取腾讯云代金券