每天多学一点点~
话不多说,这就开始吧…
之前一直想学习一下分布式链路调用,今天正好闲暇,遂研究研究~
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
官网:http://skywalking.apache.org/
下载:http://skywalking.apache.org/downloads/
Github:https://github.com/apache/skywalking
文档: https://skywalking.apache.org/docs/main/v8.4.0/readme/
中文文档: https://skyapm.github.io/document-cn-translation-of-skywalking/
探针性能对比
模拟了三种并发用户:500,750,1000。使用jmeter测试,每个线程发送30个请求,设置思考时间为10ms。使用的采样率为1,即100%,这边与生产可能有差别。pinpoint默认的采样率为20,即50%,通过设置agent的配置文件改为100%。zipkin默认也是1。组合起来,一共有12种。下面看下汇总表:
从上表可以看出,在三种链路监控组件中,skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显,在500并发用户时,测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory的影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%之内。
整个架构分成四部分:
1、上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;
2、下部分 SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
3、右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
4、左部分SkyWalking UI:负责提供控制台,查看链路等等;
SkyWalking支持三种探针:
● Agent – 基于ByteBuddy字节码增强技术实现,通过jvm的agent参数加载,并在程序启动时拦截指定的方法来收集数据。
● SDK – 程序中显式调用SkyWalking提供的SDK来收集数据,对应用有侵入。
● Service Mesh – 通过Service mesh的网络代理来收集数据。
后端(Backend)
接受探针发送过来的数据,进行度量分析,调用链分析和存储。后端主要分为两部分:
● OAP(Observability Analysis Platform)- 进行度量分析和调用链分析的后端平台,并支持将数据存储到各种数据库中,如:ElasticSearch,MySQL,InfluxDB等。
● OAL(Observability Analysis Language)- 用来进行度量分析的DSL,类似于SQL,用于查询度量分析结果和警报。
界面(UI)
● RocketBot UI – SkyWalking 7.0.0 的默认web UI
● CLI – 命令行界面
这三个模块的交互流程:
准备一台虚拟机 192.168.73.132机器
下载
下载:http://skywalking.apache.org/downloads/
本文选用 8.4.0 版本
目录结构
搭建SkyWalking OAP 服务
这里先选用默认h2数据库(重启之后数据就没了,不会持久化)
启动脚本bin/startup.sh
若权限不够,则 chmod u+x *.sh
启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为 收集监控数据的端口11800 和 接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml
skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml
server.port:SkyWalking UI服务端口,默认是8080;
collector.ribbon.listOfServers:SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;
成功之后 访问 http://192.168.73.132:8080/
SkyWalking 是 零侵入的,所以 用起来十分简单。
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 -DSW_AGENT_NAME=springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=springboot-skywalking-demo
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
# 192.168.73.132 为服务器地址
Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。(参数中名字别起一样的记住)
但是这个和有坑,跟踪链路不显示gateway
拷贝agent/optional-plugins目录下的gateway插件到agent/plugins目录 即可。
微服务
认证中心
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-authcenter
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
网关
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
农污
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-nongwu
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800
storage:
#选择使用mysql 默认使用h2,不会持久化,重启skyWalking之前的数据会丢失
selector: ${SW_STORAGE:mysql}
#使用mysql作为持久化存储的仓库
mysql:
properties:
#数据库连接地址
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/skywalking"}
#用户名
dataSource.user: ${SW_DATA_SOURCE_USER:root}
#密码
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
注意:需要添加mysql数据驱动包,因为在lib目录下是没有mysql数据驱动包的,所以修改完配置启动是会报错,启动失败的。
添加mysql数据驱动包到oap-libs目录下
查看skywalking数据库,可以看到生成了很多表。
2. 基于es7 的持久化
没有玩过es的小伙伴,可以看看博主之前搭建es的文章。
elk相关文章
准备好es环境
修改config/application.yml配置文件:
修改elasticsearch7的连接配置
重启服务,启动时 会向elasticsearch中创建大量的index索引用于持久化数据,每天会产生一个新的索引文件。
测试:
启动应用程序,查看跟踪数据是否已经持久化到elasticsearch的索引中,然后重启skywalking,验证跟踪数据会不会丢失
Skywalking集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就能进行跟踪。
搭建一个skywalking oap集群需要:
启动服务测试
启动Skywalking服务,指定springboot应用的jvm参数
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.131:12800,192.168.73.132:12800
idea测试同理
SkyWalking 还有很多功能,比如:
世上无难事,只
怕有心人,每天积累一点点,fighting!!!
2021,加油,fighting,希望可以少些crud啦!