对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
如何串联整个调用链路,快速定位问题?
如何理清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分折?
如何跟踪整个业务流程的调用处理顺序?
Skywalking提供分布式链路追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;
多种监控手段,可以通过语言探针和service mesh获得监控的数据;
支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
轻量高效,无需大数据平台和大量的服务器资源;
模块化,UI、存储、集群管理都有多种机制可选;
支持告警;
优秀的可视化解决方案;
分布式链跟踪
定义:对分布式系统的应用程序运行情况(如执行顺序、性能等待)进行监视的工具
场景:专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计;
产品:Skywalking(非spring cloud官网提供的。国内、java、apache下的顶级项目)等
相关网站
官网:Apache SkyWalking
下载:Downloads | Apache SkyWalking
Github:GitHub - apache/skywalking: APM, Application Performance Monitoring System
使用公司:(国内非常多)
https://github.com/apache/skywalking/blob/master/docs/powered-by.md
服务(Service) :表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字,我们可以看到 Spring Boot 应用服务为 "11-springboot",就是我们在环境变量 SW_AGENT_NAME 中所定义的;PS:服务的名称。
服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;PS:某个主机(有ip和端口)上运行的具体应用程序实例。
这里我们可以看到 Spring Boot 应用的服务为 {agent_name}-pid:{pid}@{hostname},由 Agent 自动生成;
端点(Endpoint) :对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;PS:URI地址是端点。访问路径是端点。路径是端点。
我们可以看到 Spring Boot 应用的一个端点,为API接口 /index;
整个架构分成四部分:
第1步:解压:tar -zxvf apache-skywalking-apm-8.1.0.tar.gz,解压后即完成了安装,不需要做其他操作;
第2 步:切换:cd apache-skywalking-apm-bin
目录说明:
agent #SkyWalking Agent
bin #执行脚本
config #SkyWalking OAP Server 配置文件
LICENSE #许可证
licenses #许可证
NOTICE #通知
oap-libs #依赖的一些jar包,SkyWalking OAP Server
README.txt #阅读
tools #工具
webapp #SkyWalking UI,即UI界面,所有的页面都在里面。以jar包的形式存在。以jar包的形式进行运行。
第3步:修改OAP配置文件(默认情况下也不需要修改也可以,即走h2就行)
config目录下
vim application.yml
storage:存储,默认h2,可改
第4步:启动
切换到bin目录:./startup.sh,这个命令启动两个.sh
启动oapService.sh,数据分析、统一服务
启动webappService.sh,UI
第5步:查看日志
logs目录
查看oap平台日志
查看UI平台日志
第6步:测试
浏览器访问它的UI管控台界面:http://192.168.172.128:8080/
webapp.yml:UI
8080
conf/application.yml:oap
11800、12800
agent/config/agent.config
oap连接ip和port
第三步:启动一个Spring Boot应用,并配置SkyWalking Agent;
案例一:jar包,并部署
准备一个springboot程序,打成可执行jar包,并上传到linux服务器。写一个shell脚本,在启动项目的Shell脚本上,通过 -javaagent 参数进行配置SkyWalking Agent来跟踪微服务;
#!/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 #配置OAP Collector平台地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=-javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar #指定Agent.jar位置
java $JAVA_AGENT -jar 11-springboot-1.0.0.jar #Agent.jar启动
在启动程序前加一个-javaagent 参数即可完成对程序的跟踪;
案例二:war包,并部署
在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 界面查看跟踪情况,由于上传数据是异步的,访问完项目后,可能需要等几秒才能看到跟踪数据;
Services load:服务每分钟请求数;
Un-Health services(Apdex): Apdex性能指标,1为满分;
Slow Endpoint:慢响应端点,单位ms;
Global Response Latency:百分比响应延时,不同百分比的延时时间,单位ms;
Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度;
service
Service Apdex(数字):当前服务的评分;
Service Apdex(折线图):不同时间的Apdex评分;
Service Avg Response Times:平均响应延时,单位ms;
Global Response Time Percentile:百分比响应延时;
Successful Rate(数字):请求成功率;
Successful Rate(折线图):不同时间的请求成功率;
Servce Load(数字):每分钟请求数;
Servce Load(折线图):不同时间的每分钟请求数;
Servce Instances Load:每个服务实例的每分钟请求数;
Show Service Instance:每个服务实例的最大延时;
Service Instance Successful Rate:每个服务实例的请求成功率;
Instance
Service Instance Load:当前实例的每分钟请求数;
Service Instance Successful Rate:当前实例的请求成功率;
Service Instance Latency:当前实例的响应延时;
JVM CPU:jvm占用CPU的百分比;
JVM Memory:JVM内存占用大小,单位m;
JVM GC Time:JVM垃圾回收时间,包含YGC和OGC;
JVM GC Count:JVM垃圾回收次数,包含YGC和OGC;
JVM Thread Count:JVM线程数;
还有几个是.NET的,类似于JVM虚拟机,暂时不做说明;
Endpoint
Endpoint Load in Current Service:每个端点的每分钟请求数;
Slow Endpoints in Current Service:每个端点的最慢请求时间,单位ms;
Successful Rate in Current Service:每个端点的请求成功率;
Endpoint Load:当前端点每个时间段的请求数据;
Endpoint Avg Response Time:当前端点每个时间段的请求行响应时间;
Endpoint Response Time Percentile:当前端点每个时间段的响应时间占比;
Endpoint Successful Rate:当前端点每个时间段的请求成功率;
选择不同的服务关联拓扑;
查看单个服务相关内容;
服务间连接情况;
分组展示服务拓扑;
服务:需要分析的服务;
端点名称:链路监控中端点的名称,可以在链路追踪中查看端点名称;
监控时间:采集数据的开始时间;
监控持续时间:监控采集多长时间;
起始监控时间:多少秒后进行采集;
监控间隔:多少秒采集一次;
最大采集数:最大采集多少样本;
第二步:消费者调用生产者,多调几次
第三步:skywalking按照我们配置的规则自动做性能剖析,并返回结果。
规则文件:cd /usr/local/apache-skywalking-apm/conf/alarm-settings.yml
规则文件中可以配置回调代码。webhooks。信息、内容。
多个规则,只要满足任何一个规则就会告警
不同维度告警列表,可分为服务、端点和实例;
在运行的程序配置jvm参数和环境变量参数,如下图所示:
-javaagent:D:/dev/apache-skywalking-apm-bin/agent/skywalking-agent.jar
SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800;SW_AGENT_NAME=sharding
cd apache-skywalking-apm-es7-8.1.0
storage:
selector: ${SW_STORAGE:elasticsearch7}
启动elasticsearch7
jvm至少512M
启动elasticsearch-head插件:npm run start 便于查看elasticsearch数据;
启动skywalking
启动应用程序,查看跟踪数据是否已经持久化到elasticsearch的索引中;
然后重启skywalking,验证跟踪数据会不会丢失;
-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
方式1:skywalking+nacos
想法、需求、问题:群集,避免单点故障
思路:Skywalking集群是将skywalking oap(至少两份)作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就能进行跟踪;
搭建一个skywalking oap集群需要:
(1)至少一个Nacos(也可以把nacos集群)
(2)至少一个ElasticSearch(也可以把es集群)
(3)至少2个skywalking oap服务;
(4)至少1个UI(UI也可以集群多个,用Nginx代理统一入口)
操作步骤:
第二步:修改配置conf/application.yml文件
第1步:表明使用nacos做集群。第一、二台的skywalking oap服务配置。
cluster:
selector: ${SW_CLUSTER:nacos}
nacos:
serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
第2步:skywalking core(核心)配置
第一台
restHost: ${SW_CORE_REST_HOST:0.0.0.0}:restful对外暴露的IP,其中0.0.0.0表示用任何机器都可以访问这个服务。
restPort: ${SW_CORE_REST_PORT:12801}
gRPCPort: ${SW_CORE_GRPC_PORT:11801}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}:RPC对外暴露的IP,其中0.0.0.0表示用任何机器都可以访问这个服务。
第二台
restHost: ${SW_CORE_REST_HOST:0.0.0.0}:restful对外暴露的IP,其中0.0.0.0表示用任何机器都可以访问这个服务。
restPort: ${SW_CORE_REST_PORT:12802}
gRPCPort: ${SW_CORE_GRPC_PORT:11802}
gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}:RPC对外暴露的IP,其中0.0.0.0表示用任何机器都可以访问这个服务。
第3步:storage存储(持久化)。使用的是es。
使用elasticsearch作为storage
storage:
selector: ${SW_STORAGE:elasticsearch7}
storage:
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
第三步:配置web控制台
配置ui服务webapp/webapp.yml文件的listOfServers,写两个地址
listOfServers: 127.0.0.1:12801,127.0.0.1:12802,即此时这个web ui后台(管控台)连接两个skywalking oap服务。
第四步:测试
第1步:启动至少1个nacos。查日志。
第2步:启动至少1个es数据库。查日志。
第3步:启动至少2个skywalking oap。查日志。
第4步:然后再起一个web ui后台(管控台);或者可以启两份web ui后台,然后通过nginx去代理,即此时访问nginx时可以代理到ui1和ui2中的一个。查日志。
第5步:启动一个springboot程序,此时这个程序会到naocs中获取skywalking服务,然后把链路数据上传到skywalking服务,最后我们在web ui后台(管控台)中会看到。
第6步:通过restful的方式在浏览器调用Springboot程序的一个服务。
第7步:查看web ui中的链路数据。刷新。
第8步:关闭一台skywalking oap服务,依然可以工作。
注:生产中不搭集群也是可以的,因为这个只是调用链路跟踪,skywalking oap跟踪服务如果宕机了,完全不会影响正常业务;
方式2:skywalking+zoolkeeper
方式3:skywalking+别的东西
自己理解:
关:【关联、对比】
疑
重:【,实现技术,工具】
难:【感想、体会、领悟】 【总结、归纳、规律】
大道至简:提图表短(纲)