分布式服务追踪与调用链系统

如何构建新一代SkyWalking服务追踪框架
1.生产环境调用接口报错了,如何定位?
2.微服务服务追踪框架构设计原理
3.Sleuth+zipkin实现分布式服务追踪
4.SkyWalking超强大实现分布式服务追踪
5.SkyWalking架构设计原理
产生的背景
分布式服务追踪与调用链系统_第1张图片

在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth 提供了分布式服务链路监控的解决方案。下面介绍 Spring Cloud Sleuth 整合 Zipkin 的解决方案。

服务追踪常用框架

  1. Sleuth +Zipkin
  2. 阿里的鹰眼系统
  3. Skywalking

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)工具,专为云原生,基于容器以及分布式系统而设计。

  1. 探针:基于不同的来源探针可能是不一样的,但作用都是收集数据,将数据格式化为 SkyWalking 适用的格式。例如在Java中则是做字节码植入,无侵入式的收集,并通过 HTTP 或者 gRPC 方式发送数据到平台后端 通过Agent技术 代理主函数
    Aop

前置通知
业务方法—
后置通知

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 环境安装

  1. 下载 apache-skywalking-apm-6.5.0.tar安装包
  2. 进入到bin目录(直接双击启动startup.bat)
  3. 启动启动oapService和我们的webappService
  4. 查看管理界面http://127.0.0.1:8080/

对springboot实现监控

  1. 创建一个springboot项目
  2. 将该springboot项目打成jar包 mvn package
  3. :skywalking-agent.jar路径 -jar springboot jar包
  4. 访问接口测试 http://127.0.0.1:9095/mayikt/getUser?age=1

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客户端

  1. 打包一个生产者和消费者
  2. 分别拷贝两个agent目录
  3. 分别启动两个agent项目 实现对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 的追踪

步骤流程:

  1. 进入到agent/optional-plugins ,将apm-trace-ignore-plugin-6.5.0 拷贝到
    agent文件夹下plugins目录

拷贝: 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<>();

    /**

    • 存放告警信息
    • @param alarmMessageList
      */
      @RequestMapping(value = “/police”, method = RequestMethod.POST)
      public void alarm(@RequestBody List alarmMessageList) {
      listAlarmMessage.add(alarmMessageList);
      }

    /**

    • 打印告警信息
    • @return
      */
      @RequestMapping("/getListAlarmMessageDto")
      public List getListAlarmMessageDto() {
      return listAlarmMessage;
      }

}

相关核心配置

Licensed to the Apache Software Foundation (ASF) under one

or more contributor license agreements. See the NOTICE file

distributed with this work for additional information

regarding copyright ownership. The ASF licenses this file

to you under the Apache License, Version 2.0 (the

“License”); you may not use this file except in compliance

with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an “AS IS” BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

Sample alarm rules.

rules:

Rule unique name, must be ended with _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

Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.

Because the number of endpoint is much more than service and instance.

endpoint_avg_rule:

metrics-name: endpoint_avg

op: “>”

threshold: 1000

period: 10

count: 2

silence-period: 5

message: Response time of endpoint {name} is more than 1000ms in 2 minutes of last 10 minutes

webhooks:

- http://127.0.0.1/notify/

  • http://127.0.0.1:10002/police

数据的持久化

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配置连接为自定义即可。

你可能感兴趣的:(分布式)