SpringCloudAlibaba-SkyWalking
SkyWalking
简介
分布式链路跟踪是分布式系统的应⽤程序性能监视⼯具,专为微服务、云原⽣架构和基于容器(Docker、K8s)架构⽽设计;
也就是说Skywalking是⽤于微服务的“跟踪" ;
对于⼀个⼤型的⼏⼗个、⼏百个微服务构成的微服务架构系统,通常会遇到下⾯⼀些问题,⽐如:
如何串联整个调⽤链路,快速定位问题?
如何理清各个微服务之间的依赖关系?
如何进⾏各个微服务接⼝的性能分折?
如何跟踪整个业务流程的调⽤处理顺序?
Skywalking提供分布式追踪、服务⽹格遥测分析、度量聚合和可视化⼀体化解决⽅案;
Skywalking是国⼈采⽤Java开发的,现在已经是apache下的⼀个等级项⽬;
主要功能和特征
1、多种监控⼿段,可以通过语⾔探针和service mesh获得监控的数据;
2、⽀持多种语⾔⾃动探针,包括 Java,.NET Core 和 Node.JS;
3、轻量⾼效,⽆需⼤数据平台和⼤量的服务器资源;
4、模块化,UI、存储、集管理都有多种机制可选;
5、⽀持告警;
6、优秀的可视化解决⽅案;
使⽤公司:(国内⾮常多)
整体架构
整个架构分成四部分:
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:负责提供控台,查看链路等等;
环境部署
1,下载 SkyWalking 软件包;
2,搭建⼀个 SkyWalking OAP 和SkyWalking UI服务;
3,启动⼀个Spring Boot应⽤,并配置SkyWalking Agent;
数据存储暂时先使⽤它默认的H2数据库存储,后续我们再使⽤其他存储;
1、下载 SkyWalking 软件包
对于 SkyWalking 的软件包,有两种⽅式获取:
⼿动编译
官⽅包
⼀般情况下,我们建议使⽤官⽅包,⼿动编译也可以;
2、SkyWalking OAP 搭建
解压:tar -zxvf apache-skywalking-apm-8.1.
解压后即完成了安装,不需要做其他操作;
切换:cd apache-skywalking-apm-bin
⽬录说明:
agent #SkyWalking Agent
bin #执⾏脚本
config #SkyWalking OAP Server 配置⽂件
LICENSE
licenses
NOTICE
oap-libs #SkyWalking OAP Server
<
tools
webapp #SkyWalking UI
3、启动 SkyWalking OAP 服务
切换到bin⽬录:./startup.sh
启动后会启动两个服务,⼀个是skywalking-oap-server,⼀个是skywalking-web-ui;
查看安装⽬录下的 ./logs 下的⽇志⽂件,检查两个服务的⽇志⽂件是否启动成功;
skywalking-oap-server服务启动后会占⽤:11800 和 12800 两个端⼝;
skywalking-web-ui服务会占⽤ 8080 端⼝;
如果想要修改SkyWalking UI服务的参数,可以编辑l 配置⽂件,⽐如:
server.port:SkyWalking UI服务端⼝,默认是8080;
collector.ribbon.listOfServers:SkyWalking OAP服务地址数组,SkyWalking UI界⾯的数据是通过请求SkyWalking OAP服务来获得;
页⾯的右下⾓可以中英⽂切换,可以切换选择要展⽰的时间区间的跟踪数据;
SkyWalking Agent跟踪微服务
案例⼀:
准备⼀个springboot程序,打成可执⾏jar包,写⼀个shell脚本,在启动项⽬的Shell脚本上,通过 -javaagent 参数进⾏配置SkyWalking Agent来跟踪微服务;
spring framework是什么框架的#!/bin/sh
\# SkyWalking Agent配置
export SW_AGENT_NAME=11-springboot #Agent名字,⼀般使⽤`spring.application.name`
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最⼤Span数量,默认为 300。
export JAVA_AGENT=-javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar
java ***\*$JAVA_AGENT\**** -jar 11-springboot-1.0.0.jar #jar启动
在启动程序前加⼀个-javaagent 参数即可完成对程序的跟踪;
案例⼆:
在tomcat中部署war包配置SkyWalking Agent来跟踪微服务;
修改/usr/local/apache-tomcat-9.0.31/bin/catalina.sh ⽂件,在顶部第⼀⾏加上:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar";
export CATALINA_OPTS;
如果tomcat端⼝与skywalking ui端⼝冲突的话,修改⼀下tomcat端⼝;
测试,访问⼀下项⽬,然后进⼊ SkyWalking UI 界⾯查看跟踪情况,由于上传数据是异步的,访问完项⽬后,可能需要等⼏秒才能看到跟踪数据;
SkyWalking三个概念
*服务(Service)**:*表⽰对请求提供相同⾏为的⼀系列或⼀组⼯作负载,在使⽤Agent时,可以定义服务的名字,我们可以看到 Spring Boot 应⽤服务为 "11-springboot",就是我们在环境变量 SW_AGENT_NAME 中所定义的;
*服务实例(Service Instance) :*上述的⼀组⼯作负载中的每⼀个⼯作负载称为⼀个实例,⼀个服务实例实际就是操作系统上的⼀个真实进程;
这⾥我们可以看到 Spring Boot 应⽤的服务为 {agent_name}-pid:{pid}@{hostname},由 Agent ⾃动⽣成;
*端点(Endpoint) :*对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + ⽅法签名;
我们可以看到 Spring Boot 应⽤的⼀个端点,为API接⼝ /index;
IDEA中使⽤SkyWalking
在运⾏的程序配置jvm参数和环境变量参数,如下图所⽰:
-javaagent:E:\software\JAVA\springcloud-alibaba\package\skywalking\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800;SW_AGENT_NAME=sharding
SkyWalking告警
告警设置:./l
skywalking告警的核⼼由⼀组规则驱动,这些规则定义在l⽂件中,告警规则的定义分为三部分;
1、告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件;
2、⽹络钩⼦(Webhook}:当警告触发时,哪些服务终端需要被通知;
3、gRPC钩⼦:远程gRPC⽅法的主机和端⼝,告警触发后调⽤;
为了⽅便,skywalking发⾏版中提供了默认的l⽂件,包括⼀些规则,每个规则有英⽂注释,可以根据注释得知每个规则的作⽤;
⽐如service_resp_time_rule规则:
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.
该规则表⽰服务{name}的响应时间在最近10分钟的3分钟内超过1000ms;
只有我们的服务请求符合l⽂件中的某⼀条规则就会触发告警;
*Webhook回调通知*
SkyWalking告警Webhook回调要求接收⽅是⼀个Web容器(⽐如tomcat服务),告警的消息会通过HTTP请求进⾏发送, 请求⽅法为POST, Content-Type为application/json, JSON格式基于
List<org.apache.skywalking.alarm.AlarmMessage>的集合对象数据, 集合中的每个AlarmMessage包含以下信息:
1、scopeId. 所有可⽤的Scope请查阅:
org.apache.skywalking.source.DefaultScopeDefine;
2、name. ⽬标 Scope 的实体名称;
3、id0. Scope 实体的 ID;
4、id1. 未使⽤;
5、ruleName. 您在 l 中配置的规则名;
6、alarmMessage. 报警消息内容;
7、startTime. 告警时间, 位于当前时间与 UTC 1970/1/1 之间;
AlarmMessage类的代码:
SkyWalking数据mysql持久化
在./l⽂件中将数据存储那⼀项变更为mysql
在MySQL下,变更连接url,更改连接数据库的⽤户名和密码。在oap-libs⽂件夹下导⼊mysql驱动。启动skywalking即可。
SkyWalking数据Elasticsearch持久化
Skywalking跟踪数据默认是存放在内嵌式数据库H2中的,重启skywalking,跟踪数据就丢失了,我们可以把跟踪数据持久化到mysql或者elasticsearch中,上⼀次课我们介绍了如何将跟踪数据持久化到mysql,此次我们介绍⼀些如何将跟踪数据持久化到elasticsearch中;
需要解压另⼀个专门针对elasticsearch版本的Skywalking:
1、tar -zxvf apache-skywalking-apm-es7-8.1.
2、cd apache-skywalking-apm-es7-8.1.0
3、修改l配置⽂件:
storage:
selector: ${SW_STORAGE:elasticsearch7}
4、启动elasticsearch7
./elasticsearch -d
后台运⾏(es不能⽤root启动)
注:Elasticsearch的jvm内存不能配置太⼩,⾄少512m,⼩了会出现错误:
配置⽂件:./config/jvm.options
status line [HTTP/1.1 429 Too Many Requests] <------错误信息
5、启动elasticsearch-head插件:npm run start 便于查看elasticsearch数据;
6、启动skywalking
.
/startup.sh
启动时会向elasticsearch中创建⼤量的index索引⽤于持久化数据,每天会产⽣⼀个新的索引⽂件;
7、启动应⽤程序,查看跟踪数据是否已经持久化到elasticsearch的索引中;
8、然后重启skywalking,验证跟踪数据会不会丢失;
Skywalking跨多个微服务跟踪
Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可;
-javaagent:D:/dev/apache-skywalking-apm-bin/agent/skywalking-agent.jar
SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.172.128:11800;SW_AGENT_NAME=11-springboot-idea
⾃定义SkyWalking链路追踪
如果我们希望对项⽬中的业务⽅法,实现链路追踪,⽅便我们排查问题,可以使⽤如下的代码;
1、添加依赖;
<!-- SkyWalking ⼯具类-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.6.0</version>
</dependency>
2、在业务代码中使⽤如下⽅法:
TraceContext.putCorrelation("myKey", "myValue");
Optional<String> op = Correlation("myKey");
log.info("myValue = {} ", op.get());
String traceId = aceId();
log.info("traceId = {} ", traceId);
这样就可以拿到跟踪的traceId,便于根据traceId去ui界⾯搜索整个跟踪链路;
另外如果⼀个业务⽅法想在ui界⾯的跟踪链路上显⽰出来,只需要在业务⽅法上加上@Trace注解即可;
SkyWalking集成⽇志框架
1、添加如下依赖;
<!-- apm-toolkit-logback-1.x -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.6.0</version>
</dependency>
2、添加l⽂件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引⼊ Spring Boot 默认的 logback XML 配置⽂件 -->
<include resource="org/springframework/boot/logging/l"/>
<!-- 控制台 Appender -->
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_L EVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %tid %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EX
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论