一 业务:大型的几十个、几百个微服务构成的微服务架构系统
二 想法、需求、问题:链路跟踪
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
如何串联整个调用链路,快速定位问题?
如何理清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分折?
如何跟踪整个业务流程的调用处理顺序?
三 解决方案:
(1)功能“集”:
-
Skywalking提供分布式链路追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;
-
多种监控手段,可以通过语言探针和service mesh获得监控的数据;
-
支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
-
轻量高效,无需大数据平台和大量的服务器资源;
-
模块化,UI、存储、集群管理都有多种机制可选;
-
支持告警;
-
优秀的可视化解决方案;
-
(2)“神”冰箱:Skywalking
四 “完成”“高效”视频:
1 体系组织
-
分布式链跟踪
-
定义:对分布式系统的应用程序运行情况(如执行顺序、性能等待)进行监视的工具
-
场景:专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计;
-
产品:Skywalking(非spring cloud官网提供的。国内、java、apache下的顶级项目)等
-
-
相关网站
-
SkyWalking中三个概念
服务(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;
2 思想、思路、流原
整个架构分成四部分:
- 上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;(相当于跟踪器、定位器,你到哪里都知道完)
- 项目中加入Skywakling依赖
- 此时Skywakling跟踪应用的运行流程
- 把跟踪的数据发送给SkyWalking
- 下部分 SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
- 可以把链路信息保存到持久化设备,如数据库:h2、mysql、TIDB等待。
- 右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
- 左部分SkyWalking UI:页面负责提供控台,查看链路等等;
- 微服务+agent(相当于跟踪器、定位器,你到哪里都知道完)
- spring boot或spring cloud项目
- 内嵌skywalking Agent,作用是数据采集
- skywalking OAP
- skywalking OAP是分析平台
- 把采集的数据持久到持久化设备中(如mysql等)
- elasticsearch:mysql等
- 如果不指定,默认使用h2数据库,h2是一个嵌入式的数据库
- skywalking UI
- 浏览器打开
- 展示、统计、分析采集的数据
3 重:SkyWalking运行环境部署
- 第一步:下载 SkyWalking 软件包;
- 第二步:搭建一个 SkyWalking OAP 和SkyWalking UI服务;
- java语言写的
- 包的分类
- 手动编译:即自己要手动编译
- 官方包:已经编译好
- es包分类
- es包:可使用多种数据库,如mysql
- 非es包:默认使用h2
- 操作步骤:
-
第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;
- springboot程序
-
案例一: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 界面查看跟踪情况,由于上传数据是异步的,访问完项目后,可能需要等几秒才能看到跟踪数据;
- 第四步:数据存储暂时先使用它默认的H2数据库存储,后续我们再使用其他存储;
- 第五步:访问,测试
- 第六步:停止
- 无shutdown.sh,只能用kill命名
4 重:Skywalking 管控台(UI界面)(仪表盘、拓扑图、追踪、性能剖析、告警)
- 延时、异步处理、需要等待2~3秒的时间、刷新、看到数据
- 中英文切换
- 时间(区间)切换
- 最近15分钟
- 最近30分钟
- 仪表盘
- 功能概述
- 当前服务:服务名称
- 当前端点:方法名
- 当前实例:实例ID
- 控制栏1
- APM:应用性能管理。英文首字母大写。
- Database:数据库
- SelfObservability:容器
- 控制栏2
- 编辑
- 导出当前数据(json文件)
- 导入展示数据
- 刷新
- 筛选:不同服务的筛选、不同(当前)端点的筛选、不同(当前)实例的筛选
- 控制栏3:
- 全局
- 服务
- 实例
- 端点
- 导入
- 导出
- 展示栏
- Global:全局
-
Services load:服务每分钟请求数;
- Slow Services:慢响应服务,单位ms;
-
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:当前端点每个时间段的请求成功率;
-
- Global:全局
- 功能概述
- 拓扑图
- 功能概述
- 进入告警信息
- 当前端点、当前深度
- 请求的追踪/index
- 列表
- 树状
- 表格
- 仪表盘数据
- 访问报错,红色。
- 展示栏
-
选择不同的服务关联拓扑;
-
查看单个服务相关内容;
-
服务间连接情况;
-
分组展示服务拓扑;
-
- 功能概述
- 追踪
- 功能概述
- 请求开始时间
- 请求到响应的持续时间
- 方法类型
- 根据id去查询
- 访问报错,红色。
- 追踪id,
唯一的。
- 展示栏:
-
左侧:api接口列表,红色-异常请求,蓝色-正常请求;
-
右侧:api追踪列表,api请求连接各端点的先后顺序和时间;
-
- 功能概述
- 性能剖析
- 第一步:得新建一个任务,skywalking在执行任务时才会帮我们做性能分析
-
服务:需要分析的服务;
-
端点名称:链路监控中端点的名称,可以在链路追踪中查看端点名称;
-
监控时间:采集数据的开始时间;
-
监控持续时间:监控采集多长时间;
-
起始监控时间:多少秒后进行采集;
-
监控间隔:多少秒采集一次;
-
最大采集数:最大采集多少样本;
-
-
第二步:消费者调用生产者,多调几次
-
第三步:skywalking按照我们配置的规则自动做性能剖析,并返回结果。
- 第一步:得新建一个任务,skywalking在执行任务时才会帮我们做性能分析
- 告警
-
规则文件:cd /usr/local/apache-skywalking-apm/conf/alarm-settings.yml
-
规则文件中可以配置回调代码。webhooks。信息、内容。
-
多个规则,只要满足任何一个规则就会告警
-
不同维度告警列表,可分为服务、端点和实例;
-
- 刷新
- 自动刷新:每隔多长时间,刷新一遍
- 手动刷新
5 重:(开发中)在IDEA中使用Skywalking做链路跟踪
在运行的程序配置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
6 重:Skywalking告警通知功能
- 告警由规则驱动
- config/alarm-settings.yml定义规则
- 规则
- 服务响应时间规则
- message规则说明
- 平均响应时间规则
- ......多个
- 服务响应时间规则
- webhooks,触犯其中一个规则,web回调,回调钩子,地址
- 原理:git+jenkins:当我们往git上提交代码时,会自动触发一个地址的调用。效果是,通知jenkins去自动构建项目。
- 原理:github配置webhooks后,往github提交代码后,会自动回调一个钩子或回调一个地址。
- 应用场景:发生错误,发短信、邮件、消息给相关人员进行处理。
- 规则
- config/alarm-settings.yml定义规则
- 根据webhooks返回的对象排查错误
7 重:持久化
- 默认h2数据库,数据丢失
- 持久化到mysql数据库
- 非es的jar包
- conf/application.yml
- storage ,数据存储
- selector:mysql ,使用mysql
- 配置mysql的4个要素
- storage ,数据存储
- 测试:
- 启动mysql。创建对应的数据库。
- 启动Skywalking的oap平台和ui界面程序
- oap-libs目录加入mysql的jdbc驱动包
- not exist。表不存在,Skywalking会自动帮我们创建表。一共有81张表。
- 启动springboot程序
- 浏览器地址栏访问
- Skywalking的UI界面有数据
- mysql数据库表中也有数据
- 持久化到elasticsearch
- 安装elasticsearch7
- 下载es版本的jar包。
- 解压。
- 修改application.yml配置文件
-
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,验证跟踪数据会不会丢失;
8 重: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
9 重:自定义SkyWalking链路追踪
- 自定义skywalking链路追踪:如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用自定义skywalking链路追踪。
- 第一步:添加工具包的依赖。
- 工具包的版本要和skywalking的版本一致
- 第二步:配置文件不用配置,不用动
- 第三步:编码
- 方式1:使用工具类TraceContext.java
- traceId(),获取追踪id
- getCorrelation(String key),获取键对应的值
- putCorrelation(String key,String value),设置键值对
- 方式2:另外如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace、httpSuport.getInstane.suport()注解即可。通过这种方式,即可在原来的基础上添加追踪一些重要的方法。
- 该方法不能是静态的
- 方式1:使用工具类TraceContext.java
- 第一步:添加工具包的依赖。
- 效果
- 在代码中可以获取追踪id
- 可以写到日志中
- 或者可以记录到数据库中例如,在订单服务中,可以把订单相关的追踪id记录到数据表中。如果此时如果想在SkyWalking管控台中查看某个订单的链路情况,此时就可以从数据库表中拿到追踪id,然后在SkyWalking管控台中一查询就可以查看该订单的链路情况(异常、性能等)了。
- 在代码中可以获取追踪id
10 重:Skywalking集成日志框架
- Skywalking + logback
- 第一步:添加集成依赖
- 第二步:加入logback-spring.xml文件
- 第三步:在代码中写上日志
- 第四步:访问,测试
11 重:skywalking集群
-
方式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代理统一入口)
-
操作步骤:
- 第一步:解压两份apache-skywalking-apm-es7-8.1.0.tar.gz
-
第二步:修改配置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+别的东西
自己理解:
关:【关联、对比】
疑
重:【,实现技术,工具】
难:【感想、体会、领悟】 【总结、归纳、规律】
大道至简:提图表短(纲)