微服务链路追踪组件SkyWalking实战

概述

微服务调用存在的问题

  • 串联调用链路,快速定位问题;
  • 理清服务之间的依赖关系;
  • 微服务接口性能分析;
  • 业务流程调用处理顺序;

全链路追踪:对请求源头到底层服务的调用链路中间的所有环节进行监控。

链路追踪组件选型

OpenTracing语义规范:

https://github.com/opentracing/specification/blob/master/specification.md

组件对比:


ZipkinPinpointSkyWalkingCAT
贡献者Twitter开源韩国人开源华为吴晟开源大众点评开源
实现方式拦截请求,发送 http/mq 数据到 zipkin 服务字节码注入字节码注入代理埋点(拦截器、注解、过滤器)
接入方式基于 linkerd/sleuth,引入配置即可javaagent 字节码javaagent 字节码代码侵入
agent 到 collector 传输协议http、MQthriftgRPChttp/tcp
OpenTracing支持支持
粒度接口级方法级方法级代码级
全局调用统计支持支持支持
traceid 查询支持支持
告警支持支持支持
JVM 监控支持支持支持

探针性能对比:
模拟了三种并发用户:500,750,1000。使用 jmeter 测试,每个线程发送 30 个请求,设置思考时间为 10ms。使用的采样率为 1 ,即 100%,这边与生产可能有差别。pinpoint 默认的采样率为 20,即 50%,通过设置 agent 的配置文件改为 100%。zipkin 默认也是 1。组合起来,一共有 12 种。下面看下汇总表:
image.png
从上表可以看出,在三种链路监控组件中,skywalking 的探针对吞吐量的影响最小,zipkin 的吞吐量居中。pinpoint 的探针对吞吐量的影响较为明显,在 500 并发用户时,测试服务的吞吐量从 1385 降低到 774,影响很大。然后再看下 CPU 和 memory 的影响,在内部服务器进行的压测,对 CPU 和 memory 的影响都差不多在 10% 之内。

SkyWalking 是什么

skywalking 是一个国产开源框架,2015 年由吴晟开源 ,2017 年加入 Apache 孵化器。skywalking 是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

官网:http://skywalking.apache.org/
下载:http://skywalking.apache.org/downloads/
Github:https://github.com/apache/skywalking
文档:https://skywalking.apache.org/docs/main/v9.1.0/readme/
中文文档: https://skyapm.github.io/document-cn-translation-of-skywalking/
版本:v9.1.0

实现思路:采集数据》传输数据》存储数据》分析数据》监控报警。

SkyWalking 主要功能特性

  • 多种监控手段,可以通过语言探针和 service mesh 获得监控的数据;
  • 支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
  • 轻量高效,无需大数据平台和大量的服务器资源;
  • 模块化,UI、存储、集群管理都有多种机制可选;
  • 支持告警;
  • 优秀的可视化解决方案;

SkyWalking 整体架构

image.png
整个架构分成四部分:

  • 上部分 Agent

负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;

  • 下部分 SkyWalking OAP

负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;

  • 右部分 Storage

Tracing 数据存储,目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器,目前采用较多的是 ES,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主;

  • 左部分 SkyWalking UI

负责提供控制台,查看链路等等;

SkyWalking 支持三种探针:

  • Agent

基于 ByteBuddy 字节码增强技术实现,通过 jvm 的 agent 参数加载,并在程序启动时拦截指定的方法来收集数据。

  • SDK

程序中显式调用 SkyWalking 提供的 SDK 来收集数据,对应用有侵入。

  • Service Mesh

通过 Service mesh 的网络代理来收集数据。

后端(Backend):
接受探针发送过来的数据,进行度量分析,调用链分析和存储。后端主要分为两部分:

  • OAP(Observability Analysis Platform)

进行度量分析和调用链分析的后端平台,并支持将数据存储到各种数据库中,如:ElasticSearch,MySQL,InfluxDB等。

  • OAL(Observability Analysis Language)

用来进行度量分析的 DSL,类似于 SQL,用于查询度量分析结果和警报。

界面(UI):

  • RocketBot UI

SkyWalking 7.0.0 的默认 web UI

  • CLI

命令行界面

这四个模块的交互流程:
image.png

SkyWalking 环境搭建部署

image.png
说明:

  • skywalking agent 和业务系统绑定在一起,负责收集各种监控数据。
  • Skywalking oapservice 是负责处理监控数据的,比如接受 skywalking agent 的监控数据,并存储在数据库中。接受 skywalking webapp 的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice 通常以集群的形式存在。
  • skywalking webapp,前端界面,用于展示数据。
  • 用于存储监控数据的数据库,比如 mysql、elasticsearch 等。

下载 SkyWalking:

下载:http://skywalking.apache.org/downloads/

image.png
下载上图箭头所示,SkyWalking APM 包括 oap 和 ui,Java Agent 表示应用需要接入的 agent。
下载链接:

# SkyWalking APM:  v9.1.0
wget https://archive.apache.org/dist/skywalking/9.1.0/apache-skywalking-apm-9.1.0.tar.gz# Java Agent: v8.11.0 
wget https://archive.apache.org/dist/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz

目录说明:
apm:
image.png

  • webapp

UI 前端(web 监控页面)的 jar 包和配置文件;

  • oap-libs

后台应用的 jar 包,以及它的依赖 jar 包,里边有一个 server-starter-*jar 就是启动程序;

  • config

启动后台应用程序的配置文件,是使用的各种配置;

  • bin

image.png
各种启动脚本,一般使用脚本 startup.* 来启动 web 页面和对应的后台应用;
oapService.:默认使用的后台程序的启动脚本;(使用的是默认模式启动,还支持其他模式,各模式区别见启动模式);
oapServicelnit.
:使用 init 模式启动;在此模式下,OAP 服务器启动以执行初始化工作,然后退出;
oapServiceNolnit.:使用 no init 模式启动;在此模式下,OAP 服务器不进行初始化;
webappService.
:UI 前端的启动脚本;
startup.:组合脚本,同时启动 oapService.、webappService.* 脚本;

agent:
image.png

  • skywalking-agent.jar

代理服务 jar 包。

  • config

代理服务启动时使用的配置文件。

  • plugins

包含多个插件,代理服务启动时会加载改目录下的所有插件(实际是各种jar包)。

  • optional-plugins

可选插件,当需要支持某种功能时,比如 SpringCloud Gateway,则需要把对应的 jar 包拷贝到 plugins 目录下。

搭建 SkyWalking OAP 服务:
1)先使用默认的 H2 数据库存储,不用修改配置

vim config/application.yml

image.png
2)启动脚本

bin/startup.sh

image.png
日志信息存储在 logs 目录:
image.png
启动成功后会启动两个服务,一个是 skywalking-oap-server,一个是 skywalking-web-ui,启动日志在 logs/skywalking-oap-server.log
skywalking-oap-server 服务启动后会暴露 11800 和 12800 两个端口,分别为收集监控数据的端口 11800 和接受前端请求的端口 12800,修改端口可以修改config/applicaiton.yml
image.png
skywalking-web-ui 服务会占用 8080 端口,修改端口可以修改 webapp/webapp.yml。

server.port:SkyWalking UI 服务端口,默认是8080;
spring.cloud.discovery.client.simple.instances.oap-service:SkyWalking OAP 服务地址数组,SkyWalking UI 界面的数据是通过请求 SkyWalking OAP 服务来获得;

http://xxx:8080
image.png

SkyWalking 中三个概念

服务(Service) :表示对请求提供相同行为的一系列或一组工作负载,在使用 Agent 时,可以定义服务的名字;
服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例,一个服务实例实际就是操作系统上的一个真实进程;
端点(Endpoint) :对于特定服务所接收的请求路径,如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名;

SkyWalking 快速开始

SkyWalking Agent 追踪微服务

通过 jar 包方式接入

准备一个 springboot 程序,打成可执行 jar 包,写一个 shell 脚本,在启动项目的 Shell 脚本上,通过 -javaagent 参数进行配置 SkyWalking Agent 来追踪微服务。
startup.sh 脚本:

#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-skywalking-demo # 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:/root/skywalking-agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar # jar启动

等同于:

java -javaagent:/root/skywalking-agent/skywalking-agent.jar 
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 
-DSW_AGENT_NAME=springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar

参数名对应 agent/config/agent.config 配置文件中的属性。
属性对应的源码:org.apache.skywalking.apm.agent.core.conf.Config.java

# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

我们也可以使用 skywalking.+配置文件中的配置名 作为系统配置项来进行覆盖。 javaagent 参数配置方式优先级更高

-javaagent:/root/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=springboot-skywalking-demo
-Dskywalking.collector.backend_service=127.0.0.1:11800

在 IDEA 中使用 SkyWalking

在运行的程序配置 jvm 参数:

-javaagent:D:\apache\apache-skywalking-java-agent-8.11.0\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=springboot-skywalking-demo
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.65.206:11800 

SkyWalking 跨多个微服务追踪

Skywalking 跨多个微服务追踪,只需要每个微服务启动时添加 javaagent 参数即可。
启动微服务 gateway-service,order-service,user-service ,配置 skywalking 的 jvm 参数。

解决追踪链路不显示 gateway:
拷贝 agent/optional-plugins 目录下的 gateway 插件和 webflux 插件到agent/plugins目录:
image.png

SkyWalking 集成日志框架

https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/

引入依赖:

<!-- apm-toolkit-logback-1.x -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.11.0</version>
</dependency>

微服务添加 logback-spring.xml 文件,并配置 %tid 占位符:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><!-- 日志的格式化 --><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!-- 设置 Appender --><root level="INFO"><appender-ref ref="console"/></root></configuration>

Skywalking 通过 grpc 上报日志(需要v8.4.0以上):
gRPC 报告程序可以将收集到的日志转发到 SkyWalking OAP 服务器上。
logback-spring.xml 中添加:

<!-- https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/  --><!-- 通过grpc上报日志到skywalking oap-->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder>
</appender>

Skywalking UI 效果:
image.png

SkyWalking 告警通知

skywalking 告警的核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,告警规则的定义分为三部分:

  • 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件;
  • 网络钩子(Webhook):当警告触发时,哪些服务终端需要被通知;
  • gRPC 钩子:远程 gRPC 方法的主机和端口,告警触发后调用;

为了方便,skywalking 发行版中提供了默认的alarm-setting.yml文件,包括一些规则,每个规则有英文注释,可以根据注释得知每个规则的作用:

  • 在最近10分钟的3分钟内服务平均响应时间超过1000ms
  • 最近10分钟内,服务成功率在2分钟内低于80%
  • 服务实例的响应时间在过去10分钟的2分钟内超过1000ms
  • 数据库访问{name}的响应时间在过去10分钟的2分钟内超过1000ms

只要我们的服务请求符合alarm-setting.yml文件中的某一条规则就会触发告警。
比如 service_resp_time_rule 规则:
该规则表示服务{name}的响应时间在最近10分钟的3分钟内超过1000ms
image.png

  • metrics-name:度量名称,也是 OAL 脚本中的度量名。默认配置中可以用于告警的度量有:服务,实例,端点,服务关系,实例关系,端点关系。它只支持long,double和int类型。
  • op:操作符。
  • threshold:阈值。
  • period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
  • count:在一个周期窗口中,如果按 op 计算超过阈值的次数达到 count,则发送告警。
  • silence-period:在时间 N 中触发报警后,在 N -> N + silence-period 这段时间内不告警。
  • message:该规则触发时,发送的通知消息。

测试:编写接口,模拟慢查询

@RequestMapping("/info/{id}")
public User info(@PathVariable("id") Integer id){try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return userService.getById(id);
}

访问接口,过段时间会在 skywalking 控制界面出现了告警信息:
image.png
实现回调接口:

@RequestMapping("/notify")
public String notify(@RequestBody Object obj){// TODO 告警信息,给技术负责人发短信,钉钉消息,邮件,微信通知等System.err.println(obj.toString());return "notify successfully";
}

config/alarm-settings.yml中配置回调接口,并重启 skywalking 服务:
image.png
测试访问:[http://localhost:8000/user/info/1](http://localhost:8000/user/info/1),满足告警规则后,控制台输出告警信息:
image.png

参考: https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-alarm.md

对接钉钉:
image.png

Webhook 回调通知:
SkyWalking 告警 Webhook 回调要求接收方是一个 Web 容器(比如 tomcat 服务),告警的消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,JSON 格式基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>的集合对象数,集合中的每个AlarmMessage 包含以下信息:

  • scopeId. 所有可用的 Scope,参考:org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
  • name. 目标 Scope 的实体名称;
  • id0. Scope 实体的 ID;
  • id1. 未使用;
  • ruleName. 在 alarm-settings.yml 中配置的规则名;
  • alarmMessage. 报警消息内容;
  • startTime. 告警时间, 位于当前时间与 UTC 1970/1/1 之间;
[{scopeId = 2,scope = SERVICE_INSTANCE,name = 98e1839 a6fdf48b0aedb0ecabb8ea5f7 @192 .168 .233 .1 of springboot - skywalking - demo,id0 = c3ByaW5nYm9vdC1za3l3YWxraW5nLWRlbW8 = .1 _OThlMTgzOWE2ZmRmNDhiMGFlZGIwZWNhYmI4ZWE1ZjdAMTkyLjE2OC4yMzMuMQ == ,id1 = ,ruleName = service_instance_resp_time_rule,alarmMessage = Response time of service instance 98e1839 a6fdf48b0aedb0ecabb8ea5f7 @192 .168 .233 .1 of springboot - skywalking - demo is more than 1000 ms in 2 minutes of last 10 minutes,startTime = 1613913565462
}, {scopeId = 6,scope = ENDPOINT_RELATION,name = User in User to / user / info / {id} in springboot - skywalking - demo,id0 = VXNlcg == .0 _VXNlcg == ,id1 = c3ByaW5nYm9vdC1za3l3YWxraW5nLWRlbW8 = .1 _L3VzZXIvaW5mby97aWR9,ruleName = endpoint_relation_resp_time_rule,alarmMessage = Response time of endpoint relation User in User to / user / info / {id} in springboot - skywalking - demo is more than 1000 ms in 2 minutes of last 10 minutes,startTime = 1613913565462
}]

SkyWalking 持久化追踪数据

基于 mysql 持久化

1)修改 config 目录下的application.yml,使用 mysql 作为持久化存储的仓库
image.png
2)修改 mysql 连接配置
image.png

storage:# 选择使用mysql,默认使用h2,不会持久化,重启skyWalking之前的数据会丢失selector: ${SW_STORAGE:mysql}# 使用mysql作为持久化存储的仓库mysql:properties:# 数据库连接地址,创建swtest数据库jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest"}# 用户名dataSource.user: ${SW_DATA_SOURCE_USER:root}# 密码dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}

注意:需要添加 mysql 数据驱动包,因为在 lib 目录下是没有 mysql 数据驱动包的,所以修改完配置启动是会报错,启动失败的。
image.png
3)添加 mysql 数据驱动包到 oap-libs 目录下
image.png
4)启动Skywalking
image.png
查看 swtest 数据库,可以看到生成了很多表:
image.png
说明启动成功了,打开配置对应的地址[http://192.168.65.206:8080/](http://192.168.65.206:8080/),可以看到 skywalking 的 web 界面。
image.png
测试:重启 skywalking,验证追踪数据会不会丢失。

基于 elasticsearch 持久化

1)准备好 elasticsearch 环境(参考 ES 专题)
启动 elasticsearch 服务

bin/elasticsearch -d

image.png
2)修改config/application.yml配置文件,指定存储使用 ES,修改 elasticsearch 的连接配置
image.png
3)启动 Skywalking 服务
image.png
启动时会向 elasticsearch 中创建大量的 index 索引用于持久化数据。
启动应用程序,查看追踪数据是否已经持久化到 elasticsearch 的索引中,然后重启 skywalking,验证追踪数据会不会丢失。
image.png

自定义 SkyWalking 链路追踪

如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码。
引入依赖:

<!-- SkyWalking 工具类 -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.11.0</version>
</dependency>

在业务方法中可以 TraceContext 获取到 traceId:

@RequestMapping("/list")
public List<User> list(){// TraceContext可以绑定key-valueTraceContext.putCorrelation("name", "jay");Optional<String> op = TraceContext.getCorrelation("name");log.info("name = {} ", op.get());// 获取追踪的traceIdString traceId = TraceContext.traceId();log.info("traceId = {} ", traceId);return userService.list();
}

在 Skywalking UI 中查询 tranceId:
image.png

@Trace 将方法加入追踪链路

如果一个业务方法想在 ui 界面的追踪链路上显示出来,只需要在业务方法上加上 @Trace 注解即可:
image.png
测试:
image.png

加入 @Tags 或 @Tag

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加 @Tag 或者@Tags。

@Trace
@Tag(key = "list", value = "returnedObj")
public List<User> list(){return userMapper.list();
}@Trace
@Tags({@Tag(key = "param", value = "arg[0]"),@Tag(key = "user", value = "returnedObj")})
public User getById(Integer id){return userMapper.getById(id);
}

SkyWalking 集群部署( oap 服务高可用)

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 代理统一入口)

1) 修改config/application.yml文件
使用nacos作为注册中心:
image.png
修改nacos配置:
image.png
可以选择性修改监听端口:
image.png
修改存储策略,使用 elasticsearch 作为 storage:
image.png
2)配置 ui 服务 webapp.yml 文件的 oap-service,写多个 oap 服务地址
image.png
3) 启动微服务测试
指定微服务的 jvm 参数:

-Dskywalking.collector.backend_service=ip1:11800,ip2:11800

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208627.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新认识Word——样式

重新认识Word Word样式给所有一级标题加上一级标题样式修改标题一样式&#xff0c;符合要求 正文样式标题前的小黑点导航窗格样式的相互复制Word一键转PPT 话说回来&#xff0c;一个程序员平时可能还看不起office全家桶的软件&#xff0c;但是&#xff0c;在实际的生活运用中&a…

人工智能与供应链行业融合:预测算法的通用化与实战化

文章目录 前言供应链预测算法的基本流程统计学习模型与机器学习在供应链预测中的角色深度学习模型在智能供应链中的应用算法融合与应用场景实现后记 前言 随着数字化时代的到来&#xff0c;人工智能已经逐渐成为企业信息化建设的重要手段。特别是在供应链行业&#xff0c;人工…

01-使用Git操作本地库,如初始化本地库,提交工作区文件到暂存区和本地库,查看版本信息,版本切换命令等

Git的使用 概述 Git是一个分布式版本控制工具, 通常用来管理项目中的源代码文件(Java类、xml文件、html页面等)进行管理,在软件开发过程中被广泛使用 Git可以记录文件修改的历史记录并形成备份从而实现代码回溯, 版本切换, 多人协作, 远程备份的功能Git具有廉价的本地库,方便…

微信小程序组件与插件有啥区别?怎么用?

目录 一、微信小程序介绍 二、微信小程序组件 三、微信小程序插件 四、微信小程序组件与插件有啥区别 一、微信小程序介绍 微信小程序是一种基于微信平台的应用程序&#xff0c;它可以在微信客户端内直接运行&#xff0c;无需下载和安装。微信小程序具有轻量、便捷、跨平台…

Linux 进程(三)

Linux进程状态的查看&#xff1a; 这是Linux内核源代码对于进程状态的定义&#xff1a; R运行状态&#xff08;running&#xff09;: 并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 S睡眠状态&#xff08;sleeping): 意味着进程在…

乱序学机器学习——主成分分析法PCA

文章目录 概览PCA核心思想和原理PCA求解算法PCA算法代码实现降维任务代码实现PCA在数据降噪中的应用PCA在人脸识别中的应用主成分分析优缺点和适用条件优点缺点适用条件 概览 PCA核心思想和原理 PCA求解算法 特征向量表示分布的方向&#xff0c;特征值表示沿着个方向分布的程度…

C++ extern的用法详细解析

C编程中&#xff0c;extern是一个非常重要的关键字&#xff0c;它的用途主要是用来声明一个全局变量或者函数。本文将详细解析extern的用法&#xff0c;并通过实例进行详细的解释。 1. extern的基本定义 在C中&#xff0c;extern是一个存储类修饰符&#xff0c;它告诉编译器&…

距离向量路由协议——RIP

目录 动态路由动态路由简介为什么需要动态路由动态路由基本原理路由协议的分类 距离向量路由协议RIPv1RIP简介RIPv1的主要特征RIPv1的基本配置RIPv1配置案例被动接口单播更新使用子网地址 RIPv2RIPv2的基本配置RIPv2配置案例 RIPv2的高级配置与RIPv1的兼容性手工路由汇总触发更…

vue3 + element-plus + ts el-table封装

vue3 element-plus ts el-table封装 博客参考https://blog.csdn.net/weixin_45291937/article/details/125523244 1. 文件位置&#xff08;根据自己的需求&#xff09; 2. 在 custom 文件夹下面 创建 mytable 文件夹 3. 直接上代码 // index.vue<template><div …

工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)

关于最后一个工具的介绍&#xff1a;就是这个“相机图像” 我们可以鼠标双击点进去看一看&#xff1a; 在图像上点击&#xff0c;就可以截取一块图像&#xff0c;是可以放大缩小的&#xff0c;这个放大很low&#xff0c;是我以前研究缩放入门时的版本&#xff0c;本想删除&…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路&#xff0c;可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下&#xff1a; yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me&#xff01; 我们输入命令 unzi…

BUUCTF 间谍启示录 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 在城际公路的小道上&#xff0c;罪犯G正在被警方追赶。警官X眼看他正要逃脱&#xff0c;于是不得已开枪击中了罪犯G。罪犯G情急之下将一个物体抛到了前方湍急的河流中&#xff0c;便头一歪突然倒地。警官X接近一看&…

C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)

目录 一、System.Net命名空间 1.Dns类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.IPAddress类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 3.IPEndPoint类 &#xff08;1&#xff09; 示例源码 &#xff0…

贪心算法(新坑)

贪心入门 概述&#xff1a; 贪心算法是一种在每一步选择中都采取当前最优解的策略&#xff0c;希望最终能够得到全局最优解的算法。简单来说&#xff0c;它会不断地做出局部最优的选择&#xff0c;相信通过这种选择最终能够达到全局最优。 举个例子来说明。假设你要从一个迷…

一小时玩转【负载均衡】

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

万宾科技可燃气体监测仪科技作用全览

燃气管网在运行过程中经常会遇到燃气管道泄漏的问题&#xff0c;燃气泄漏甚至会引起爆炸&#xff0c;从而威胁人民的生命和财产安全&#xff0c;因此对燃气管网进行定期巡检是十分必要的工作。但是传统的人工巡检已不能满足城市的需要&#xff0c;除了选择增加巡检人员之外&…

微服务实战系列之Redis

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了&#xff0c;“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实…

WPF Live Charts2 自学笔记

文章目录 前言实现效果微软平台的历史问题 WPF 项目搭建Nuget添加额外框架添加项目初始化livecharts配置其它LiveCharts2 案例简单案例Demo示例ViewViewModel GPU渲染 Github地址仓库 前言 LiveChart 是C# 上面很受欢迎的统计图 UI控件。最近在学WPFhalcon开发&#xff0c;想想…

【动态规划】LeetCode2552:优化了6版的1324模式

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 本题其它解法 C前缀和算法的应用&#xff1a;统计上升四元组 类似题解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&am…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…