还在用什么Zipkin,Skywalking才是最香的


公众号: MCNU云原生,文章首发地,欢迎微信搜索关注,更多干货,第一时间掌握!

微服务架构带来了整体服务之间调用的复杂性,而链路跟踪是其中非常重要的一环。国内很多中小企业都在使用spring cloud,而在spring cloud体系中,zipkin就是负责链路跟踪的,因此zipkin一直被广泛使用。

但是我想说现在更好的选择可能是Apache Skywalking,简单来说,Zipkin能做的事情,Skywalking也能做,而且做得更好,Skywalking具备的独特能力,Zipkin却没有满足,并且社区的活跃度在下降。

一、Apache Skywalking是什么?

Apache Skywalking是一个开源的应用性能监控(Application Performance Monitoring,APM)工具,它提供了实时的、端到端的、基于跟踪的应用程序性能监测。Apache Skywalking是一个跨语言、跨平台的解决方案,支持Java、.NET、Go、Node.js等多种语言,可以在各种不同的部署环境中使用。

Apache Skywalking最初由华为公司开发,并于2017年捐赠给Apache软件基金会,成为一个Apache顶级项目,它的迭代很快,社区非常活跃,目前github上有21.7K Star。

Apache Skywalking不仅仅是一个链路跟踪框架,它是一个完整的APM解决方案,具备链路跟踪、监控和告警等功能。

二、Apache Skywalking的功能和特点

Apache Skywalking提供了一系列功能,包括:

1、分布式跟踪:Apache Skywalking可以对分布式系统的每个请求进行跟踪,并生成可视化的跟踪数据,帮助开发人员和系统管理员快速定位问题。

2、性能监测:Apache Skywalking可以监测分布式系统的性能指标,包括请求延迟、吞吐量和错误率等,帮助开发人员和系统管理员了解系统的健康状况。

3、告警通知:Apache Skywalking可以对系统的性能异常进行实时告警,帮助开发人员和系统管理员及时发现和解决问题。

4、插件扩展:Apache Skywalking提供了一套丰富的插件系统,可以与各种第三方组件和应用程序集成,另外已经原生集成了MySQL、APISIX、kubernetes等组件的监控,还支持自监控。

5、多语言支持:Apache Skywalking支持多种编程语言,包括Java、.NET、Node.js、Go和PHP等。

6、应用拓扑:可以显示应用程序的拓扑结构,展示服务之间的依赖关系,帮助用户理解应用程序的架构。

Apache Skywalking还有以下明显优势:

1、轻量级:可以轻松部署和使用,低侵入性,不会对应用程序的性能产生显著影响。

2、高扩展性:支持多语言和多平台,支持集群部署,可以满足不同应用程序的监测需求。

3、界面友好:提供易于使用的界面和可视化工具,帮助用户轻松理解和管理监测数据。

三、Apache Skywalking对比Zipkin

Apache Skywalking、Zipkin都具备分布式链路跟踪的能力,但是在某些方面还是有一些区别和优势的, 这里从以下几个方面做个对比:

1、支持语言:Apache Skywalking和Zipkin都支持多语言,目前主流的语言两者都支持,区别不大。

2、可扩展性:Apache Skywalking的插件系统支持更多的第三方组件和应用程序集成,可以更好地满足定制化需求,支持各类服务、基础设施的监控,而

3、性能:Apache Skywalking在性能方面具有优势,相比ziipkin可以处理更高的请求吞吐量。

4、易用性:zipkin的界面更简单一些,配置也更简单一些,更容易掌握,Apache Skywalking需要一定的学习和配置成本,但是相对来说其功能更加的丰富。

5、侵入性:SkyWalking基于ASM字节码增强技术实现调用拦截和数据收集,实现了真正的代码无侵入,对开发人员可以实现完全透明;Zipkin的链路追踪是基于spring-cloud-sleuth,提供了基础API,需要进行一定的代码集成配置。

6、告警:zipkin只进行了链路跟踪,而skywalking还具备告警功能,实现一站式问题跟踪告警。

四、Skywalking安装部署

这里使用二进制安装包在Centos下部署一个单机版的skywalking来进行体验。

首先使用以下命令下载skywalking,这里下载9.4.0版

[root@node1 ~]# wget https://dlcdn.apache.org/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz
[root@node1 ~]# tar -zxvf apache-skywalking-apm-9.4.0.tar.gz

由于我是在虚拟机中部署,对外的IP为192.168.56.11,所以需要对相应的配置进行修改,将webapp/application.yml中的配置127.0.0.1改为虚拟机对外的地址192.168.56.11,如下:

serverPort: ${SW_SERVER_PORT:-8080}

# Comma seperated list of OAP addresses.
oapServices: ${SW_OAP_ADDRESS:-http://192.168.56.11:12800}

zipkinServices: ${SW_ZIPKIN_ADDRESS:-http://192.168.56.11:9412}

如果不修改这个配置,可能会出现如下错误:

skywalking failed: Connection refused: localhost/127.0.0.1:12800

使用以下命令启动,可以看到启动成功,启动了两个进程:OAPServerStartUp和ApplicationStartUp,前者是OAP Server,后者是UI应用。

[skywalking@localhost apache-skywalking-apm-bin]$ bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
[root@node1 webapp]# jps|grep -v "Jps"
1585 OAPServerStartUp
1609 ApplicationStartUp

通过http://192.168.56.11:8080/可以访问UI管理界面,如图,Skywalking原生支持对普通服务、service mesh、serverless、kubernetes、基础设施等的监控,监控范围面非常广,功能丰富。

例如普通服务的trace跟踪:

例如对service mesh的支持:

五、Springboot集成Apache Skywalking

Springboot集成Apache Skywalking非常简单,使用skywalking-agent,通过JVM启动参数配置进行集成即可。

从skywalking官方下载skywalking-agent,在Java应用启动的时候增加以下VM Options

-javaagent:D:\workspace\skywalking-agent\skywalking-agent.jar  -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=192.168.56.11:11800

如果是在idea中启动的话,可以通过run->Edit Configurations->Environment->VM Options进行配置:

启动springboot应用,然后查看Skywalking UI可以发现已经监控到了demo这个service

对相关的接口进行访问,可以看到相关的详细监控数据:

从服务的trace TAB进入可以看到对应的接口的调用链路

如果希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以在springboot中引入Apache Skywalking的依赖apm-toolkit-trace。

在pom.xml文件中添加skywalking依赖。

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>9.4.0</version>
</dependency>

在application.yml(或application.properties)配置文件中添加Skywalking相关的配置,如agent.service_name、collector.backend_service等。

skywalking:
  agent:
    collector:
      grpc:
        server-address: 192.168.56.11:11800

在任何想要追踪的方法上添加 @Trace 注解,使用TraceContext可以获取到对应的traceId。

@Trace
@GetMapping("/test")
public String test() {
    System.out.println("traceId:" + TraceContext.traceId());
    return "test";
}

以上是集成Spring Boot与SkyWalking的基本步骤,如果需要更加详细的配置,可以参考SkyWalking官方文档:https://skywalking.apache.org/docs/。

六、Apache Skywalking的生态

一个流行的APM系统,绝不仅仅是软件“好”,还必须拥有丰富良好的生态。Apache Skywalking就具备良好的生态,具体来说:

1、插件系统

Apache Skywalking提供了丰富的插件系统,可以方便地与各种第三方组件和应用程序进行集成。以Agent为例,Skywalking支持各种Agent,例如Java Agent、NodeJS Agent、Nginx LUA Agent、Kong Agent等等。

2、社区支持

Apache Skywalking拥有一个活跃的开源社区,社区更新非常频繁,截止目前contributors达到430多,Star数量21.7K,fork数量6.2K,这都显示出Skywalking社区的"热闹"。另外官方提供了丰富的文档和支持,这使得新手入门更快。

3、生态整合

Apache Skywalking与其他开源项目的整合也在不断扩展,如与Kubernetes、Prometheus、Grafana等项目的整合,例如Kubernetes Event Exporter能够发送Kubernetes事件到Apache SkyWalking。

七、Apache Skywalking如何部署集群?

Apache Skywalking默认情况下为standalone模式,如果在生产环境上部署单机版显然是不合适的,需要一定的方法部署集群模式,保障高可用。

Apache Skywalking天生支持集群模式的部署,通过多个OAP Server共同分担流量,多个OAP Server之间使用外部的协调管理器进行协调。从配置文件application.yml中关于cluster的配置可以看到,Skywalking支持多种协调者,包括zookeeper、kubernetes、consul、etcd和nacos,基本囊括了主流的组件。

cluster:
  selector: ${SW_CLUSTER:standalone}
  standalone:
  # Please check your ZooKeeper is 3.5+, However, it is also compatible with ZooKeeper 3.4.x. Replace the ZooKeeper 3.5+
  # library the oap-libs folder with your ZooKeeper 3.4.x library.
  zookeeper:
    namespace: ${SW_NAMESPACE:""}
    hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181}
    # Retry Policy
    baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries
    maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry
    # Enable ACL
    enableACL: ${SW_ZK_ENABLE_ACL:false} # disable ACL in default
    schema: ${SW_ZK_SCHEMA:digest} # only support digest schema
    expression: ${SW_ZK_EXPRESSION:skywalking:skywalking}
    internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""}
    internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}
  kubernetes:
    namespace: ${SW_CLUSTER_K8S_NAMESPACE:default}
    labelSelector: ${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking}
    uidEnvName: ${SW_CLUSTER_K8S_UID:SKYWALKING_COLLECTOR_UID}
  consul:
    serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
    # Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500
    hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500}
    aclToken: ${SW_CLUSTER_CONSUL_ACLTOKEN:""}
    internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""}
    internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}
  etcd:
    # etcd cluster nodes, example: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379
    endpoints: ${SW_CLUSTER_ETCD_ENDPOINTS:localhost:2379}
    namespace: ${SW_CLUSTER_ETCD_NAMESPACE:/skywalking}
    serviceName: ${SW_CLUSTER_ETCD_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
    authentication: ${SW_CLUSTER_ETCD_AUTHENTICATION:false}
    user: ${SW_CLUSTER_ETCD_USER:}
    password: ${SW_CLUSTER_ETCD_PASSWORD:}
    internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""}
    internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}
  nacos:
    serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
    hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
    # Nacos Configuration namespace
    namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"}
    # Nacos auth username
    username: ${SW_CLUSTER_NACOS_USERNAME:""}
    password: ${SW_CLUSTER_NACOS_PASSWORD:""}
    # Nacos auth accessKey
    accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""}
    secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""}
    internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""}
    internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}

如果你的应用集群是使用Kubernetes部署,那么直接使用Kubernetes构建skywalking集群将非常方便,如果你是使用了spring cloud alibaba,那么nacos非常适合。

总之,Skywalking是一个非常强大、全面的高性能的开源APM解决方案,如果你正在设计APM系统,那么强烈建议你了解以一下Skywalking。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MCNU云原生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值