公众号: 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非常适合。文章来源:https://www.toymoban.com/news/detail-476084.html
总之,Skywalking是一个非常强大、全面的高性能的开源APM解决方案,如果你正在设计APM系统,那么强烈建议你了解以一下Skywalking。文章来源地址https://www.toymoban.com/news/detail-476084.html
到了这里,关于还在用什么Zipkin,Skywalking才是最香的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!