如何构建新一代SkyWalking服务追踪框架
1.生产环境调用接口报错了,如何定位?
2.微服务服务追踪框架构设计原理
3.Sleuth+zipkin实现分布式服务追踪
4.SkyWalking超强大实现分布式服务追踪
5.SkyWalking架构设计原理
产生的背景
在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth 提供了分布式服务链路监控的解决方案。下面介绍 Spring Cloud Sleuth 整合 Zipkin 的解决方案。
服务追踪常用框架
Sleuth简单的介绍
Sleuth 每一次RPC远程调用请求都会生成一个spanid记录每一次rpc请求的信息,还有一个traceid 全局唯一id;
实现原理:
1.开始方调用接口的时候会生成一个全局的id ,traceid 放入到请求中;
2.每次调用rpc接口的时候会产生一个新的spanid,放入到请求中;
Sleuth可以结合Zipkin可以实现界面化的形式管理我们接口依赖信息。
Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识通过traceId(全局的跟踪ID,是跟踪的入口点,根据需求来决定在哪生成traceId)、spanI(请求跟踪ID,比如一次rpc等)和parentId(上一次 请求跟踪ID,用来将前后的请求串联起来),被收集到的span会汇聚成一个tree,从而提供出一个request的整体流程。
Sleuth+Zipkin整合
ZipkinServer环境搭建
在 Spring Boot 2.0 版本之后,官方已不推荐自己搭建定制了,而是直接提供了编译好的 jar 包。详情可以查看官网:https://zipkin.io/pages/quickstart.html
注意:zipkin官网已经提供定制了,使用官方jar运行即可。
默认端口号启动zipkin服务
java –jar zipkin.jar 默认端口号; 9411
http://127.0.0.1:9411
指定端口号启动9411
java -jar zipkin.jar --server.port=8080
http://192.168.18.220:8080
ZipkinClient集成
Maven依赖
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.cloud
spring-cloud-starter-sleuth
application.yml
spring:
application:
name: app-itmayiedu-member
zipkin:
base-url: http://192.168.18.220:9411/
###全部采集
sleuth:
sampler:
probability: 1.0
效果演示
http://127.0.0.1:9411/zipkin/?serviceName=all&spanName=all&lookback=3600000&startTs=1614853090850&endTs=1614856690850&annotationQuery=&minDuration=&limit=10&sortOrder=timestamp-desc
分析样板采集json
1.订单调用会员服务—
订单服务
traceId=cc7ce1a30cc00c1a
Spanid=cc7ce1a30cc00c1a
会员服务
traceId=cc7ce1a30cc00c1a
Spanid=23be15d0026ae6a3
parentId=cc7ce1a30cc00c1a
会员服务调用SMS服务—
SMS服务
traceId=cc7ce1a30cc00c1a
Spanid=e5a6b88e90a8c9a3
parentId=23be15d0026ae6a3
Seata、lcn
Skywalking
skywalking基本介绍
SkyWalking是一个开源的观测平台,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至可以观测横跨不同云的系统,SkyWalking 更像是一种现代的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为云原生,基于容器以及分布式系统而设计。
前置通知
业务方法—
后置通知
2.平台后端:是一个支持集群模式运行的后台,用于数据聚合、数据分析以及驱动数据流从探针到用户界面的流程。平台后端还提供了各种可插拔的能力,如不同来源数据(如来自 Zipkin)格式化,不同存储系统以及集群管理。你甚至还可以使用观测分析语言来进行自定义聚合分析。
3.存储:是开放式的,可以选择一个既有的存储系统,如 ElasticSearch、H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。
用户界面:也就是SkyWalking的可视化界面,UI非常炫酷且强大,同样它也是可定制以匹配你已存在的后端的
4.SkyWalking 为观察和监控分布式系统提供了许多不同场景下的解决方案。例如为Java、C#及Node.js提供语言自动探针,无侵入式的收集。同时也为一些编译型语言C++、GO等提供了手动打点 SDK(目前还未支持)。除此之外,还可以使用服务网格基础探针来收集数据,以帮助了解整个分布式系统。
5.在SkyWalking中也存在服务、服务实例及端点概念,因为SkyWalking就是提供了这些概念的观测能力:
6.服务(Service):表示对请求提供相同行为的一系列或一组工作负载。在使用打点代理或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台上定义的名字,如 Istio。
7.服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样,服务实例未必就是操作系统上的一个进程。但当你在使用打点代理的时候, 一个服务实例实际就是操作系统上的一个真实进程。
端点(Endpoint):对于特定服务所接收的请求路径,如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名
综上,SkyWalking 优势如下:
8.多种监控手段,语言探针和服务网格(Service Mesh)
模块化,UI、存储、集群管理多种机制可选
支持告警
优秀的可视化方案:
http://skywalking.apache.org/
skywalking架构原理
在整个skywalking的系统中,有四个角色:
1.skywalking agent和业务系统关联在一起,负责收集各种监控数据;
2.oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中(例如elasticsearch、mysql中等);接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。,Skywalking oapservice通常以集群的形式存在;
3.skywalking webapp,前端界面,用于展示数据;
4.用于存储监控数据的数据库,比如mysql、elasticsearch等;
skywalking 环境安装
对springboot实现监控
agent\config\agent.config 修改应用的名称
agent.service_name=${SW_AGENT_NAME:mayiktAppDemo}
I5处理器 第10代
I7处理器 第11代
I7处理器 第8代
Skywalking RPC监控
Skywalking(6.5.0) 支持的Rpc框架有以下几种:
Dubbo 2.5.4 -> 2.6.0
Dubbox 2.8.4
Apache Dubbo 2.7.0
Motan 0.2.x -> 1.1.0
gRPC 1.x
Feign客户端
获取追踪的id
Java代码:
@RequestMapping("/member")
public String orderToMember() {
// 获取request对象
HttpServletRequest request = ((ServletRequestAttributes)
RequestContextHolder.getRequestAttributes()).getRequest();
getHeders(request);
// 获取traceId
String traceId = TraceContext.traceId();
log.info(">>traceId:{}<<", traceId);
return “我是会员服务:” + traceId;
}
Maven依赖:
org.apache.skywalking apm-toolkit-trace 6.5.0过滤指定的端点
Endpoint过滤即url忽略,有时可能希望忽略部分特殊 URL 的追踪,例如说,健康检查的 HTTP API及其他我们不需要关注的url如/eureka/**,/consul/**等等。为此SkyWalking 提供 trace-ignore-plugin 插件,可以实现忽略部分 URL 的追踪
步骤流程:
拷贝: plugins 目录。
从新启动命令:
F:\code\13719795\apache-skywalking-apm-bin\agent>java -javaagent:F:\code\13719795\apache-skywalking-apm-bin\agent\skywalking-agent.jar -Dskywalking.trace.ignore_path=/mayikt/api/* -jar F:\code\13719795\apache-skywalking-apm-bin\agent\mayikt-thymeleaf-1.0-SNAPSHOT.jar
启动加上:-Dskywalking.trace.ignore_path=/mayikt/api/*
告警系统
基本的概念
SkyWalking 告警功能
SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中
SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:
1.过去3分钟内服务平均响应时间超过1秒
2.服务成功率在过去2分钟内低于80%
3.服务90%响应时间在过去3分钟内低于1000毫秒
4.服务实例在过去2分钟内的平均响应时间超过1秒
5.端点平均响应时间过去2分钟超过1秒
接受数据的格式
[{
“scopeId”: 1,
“scope”: “SERVICE”,
“name”: “serviceA”,
“id0”: 12,
“id1”: 0,
“ruleName”: “service_resp_time_rule”,
“alarmMessage”: “alarmMessage xxxx”,
“startTime”: 1560524171000
}, {
“scopeId”: 1,
“scope”: “SERVICE”,
“name”: “serviceB”,
“id0”: 23,
“id1”: 0,
“ruleName”: “service_resp_time_rule”,
“alarmMessage”: “alarmMessage yyy”,
“startTime”: 1560524171000
}]
scopeId、scope:所有可用的 Scope 详见
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
name:目标 Scope 的实体名称
id0:Scope 实体的 ID
id1:保留字段,目前暂未使用
ruleName:告警规则名称
alarmMessage:告警消息内容
startTime:告警时间,格式为时间戳
编写告警系统接口
import com.mayikt.entity.AlarmMessageDto;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
报警接口
*/
@RestController
public class PoliceService {
private List listAlarmMessage = new ArrayList<>();
/**
/**
}
相关核心配置
rules:
_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.
service_sla_rule:
# Metrics value need to be long, double or int
metrics-name: service_sla
op: “<”
threshold: 8000
# The length of time to evaluate the metrics
period: 10
# How many times after the metrics match the condition, will trigger alarm
count: 2
# How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
silence-period: 3
message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes
service_p90_sla_rule:
# Metrics value need to be long, double or int
metrics-name: service_p90
op: “>”
threshold: 1000
period: 10
count: 3
silence-period: 5
message: 90% response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes
service_instance_resp_time_rule:
metrics-name: service_instance_resp_time
op: “>”
threshold: 1000
period: 10
count: 2
silence-period: 5
message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutes
webhooks:
数据的持久化
es环境安装
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -d elasticsearch:7.4.1
启动skywalking
Config/application.yml
修改es配置连接为自定义即可。