一文掌握 Apache SkyWalking

news2024/11/17 15:48:27

Apache SkyWalking

SkyWalking是一个开源可观测平台,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图,甚至跨云。它是一种现代APM,专为云原生、基于容器的分布式系统而设计。

文档版本8.9.1,当前最新版本9.10

图片

介绍

SkyWalking 是一个应用性能监控系统(APM)

为微服务、云原生和基于容器(Docker, Kubernetes, Mesos)体系结构而设计,主要实现功能包括分布式追踪,性能指标分析和服务依赖分析等

相似产品与对比

类似功能的组件还有:Zipkin、Pinpoint 、CAT、Dapper等

  • Zipkin是Twitter开源的调用链路分析工具,目前基于Spingcloud sleuth得到了广泛的应用,特点是轻量,部署简单。
  • 一个韩国团队开源的产品,运用了字节码增强技术,只需要在启动时添加启动参数即可,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据- 粒度非常细,但性能损耗大,因其出现的时间较长,完成度也很高,应用的公司较多
  • Skywalking是本土开源的基于字节码注入的调用链路分析以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。
  • CAT是由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT跟下边要介绍的Zipkin都需要在应用程序中埋点,对代码侵入性强。
CatZipkinPinpointskywalking
依赖Java 6,7,8 Maven 3.2.3+ mysql5.6 Linux 2.6以及之上(2.6内核才可以支持epoll)Java 6,7,8 Maven3.2+ rabbitMQJava 6,7,8 maven3+ Hbase0.94+Java 6,7,8 maven3.0+ nodejs zookeeper elasticsearch
实现方式代码埋点(拦截器,注解,过滤器等)拦截请求,发送(http,mq)数据至zipkin服务java探针,字节码增强java探针,字节码增强
颗粒度代码级接口级方法级方法级
页面UI****************
存储选择Mysql,hdfsIn-memory,mysql,cassandra,elasticsearchHbaseElasticsearch,h2
通信方式-http,mqThriftGRPC
MQ监控不支持不支持不支持RocketMq,kafka
全局调用 统计支持不支持支持支持
Trace查询不持支支持不支持支持
报警支持不支持支持支持
Jvm监控不支持不支持支持支持
优点功能完善spring-cloud-sleuth可以很好的集成zipkin , 代码无侵入,集成非常简单 , 社区更加活跃。对外提供有query接口,更加容易二次开发完全无侵入, 仅需修改启动方式,界面完善,功能细致。完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。功能比较完善(zipkin + pinpoint)
缺点代码侵入性较强,需要埋点文档比较混乱,文档与发布版本的符合性较低,需要依赖点评私服 (或者需要把他私服上的jar手动下载下来,然后上传到我们的私服上去)。默认使用的是http请求向zipkin上报信息,耗性能。跟sleuth结合可以使用rabbitMQ的方式异步来做,增加了复杂度,需要引入rabbitMQ 。数据分析比较简单。不支持查询单个调用链, 对外表现的是整个应用的调用生态。二次开发难度较高3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少依赖较多。
文档网上资料较少,仅官网提供的文档,比较乱文档完善文档完善文档完善
开发者大众点评TwiterNaver吴晟(华为开发者) ,目前已经加入Apache孵化器
使用公司大众点评,携程,陆金所,同程旅游,猎聘网,拼多多TwiterNaver华为,alibaba cloud,天源迪科,当当网,京东金融

功能

开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据。SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图,甚至可以跨云查看。它是一种现代APM,专门为云原生、基于容器的分布式系统设计

监测对象包括:service(服务), service instance(实例), endpoint(端点)

功能描述

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

架构

SkyWalking 在逻辑上分为四个部分:Probes、Platform backend、Storage 和 UI。

图片

探针Probe

采集tracing(调用链数据)和metric(指标)信息并上报,上报通过HTTP或者gRPC方式按要求重新格式化数据发送数据到Skywalking Collector

  • 自动探针:Java支持的中间件、框架与类库列表
  • 手动探针:OpenTrackingApi、@Trace注解、trackId集成到日志中。
后端Platform backend
支持数据聚合、分析和流式处理,包括跟踪、度量和日志。

基于gRpc、Http 链路数据收集器,对agent传过来的tracing和metric数据进行整合分析通过Analysis Core模块处理并落入相关的数据存储中,同时会通过Query Core模块进行二次统计和监控告警

数据存储Storage

通过开放/可插入接口存储 SkyWalking 数据,支持多种方式存储数据 H2,ElasticSearch,MySQL, TiDB, InfluxDB或自定义

可视化平台UI

基于GraphQL Http 高度可定制的基于 Web 的界面的可视化平台,允许 SkyWalking 最终用户可视化和管理。

下载安装

下载

官方下载地址:https://skywalking.apache.org/downloads/

历史版本下载:https://archive.apache.org/dist/skywalking/

Rocketbot-UI 8.x:https://github.com/apache/skywalking-rocketbot-ui

Booster UI 9.x:https://github.com/apache/skywalking-booster-ui

注:APM已经集成UI,不需要单独下载与部署

Window安装
  • 安装APM (8.9.1,h2)

    • 下载apache-skywalking-apm-bin
    • 解压执行命名 ~/bin/startup.bat
    • 访问http://localhost:8080

图片

Docker安装
  • 安装OAP

下载镜像

 docker pull apache/skywalking-oap-server:8.9.1

启动容器

 docker run --name oap -p 12800:12800 -p 11800:11800 -p 1234:1234 --restart always -d apache/skywalking-oap-server:8.9.1
  • 安装UI

下载镜像

   docker pull apache/skywalking-ui

启动容器

 docker run --name oap-ui -p 18080:8080 --restart always -d -e SW_OAP_ADDRESS=http://localhost:12800 apache/skywalking-ui

访问

http://localhost:18080

系统集成

  • 探针

负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。探针使用gRPC协议与OAP平台通信并上报数据。

  • 可观测性分析平台 OAP

接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如 Elasticsearch、MySQL等存储服务。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。OAP默认监听两个端口gRPC协议端口11800、HTTP端口12800,gRPC用于探针上报数据,HTTP端口用于UI连接OAP平台获取数据。

  • UI

Skywalking 提供单独的UI进行数据的查看,UI调用OAP提供的接口,获取对应的数据根据UI模板的配置进行展示。Skywalking UI与OAP之间使用Http协议进行通信。Skywalking UI默认监听8080端口提供Web服务。

Java Agent

  • 下载:Java Agent v8.11.0

  • 目录结构

    • activations # 工具包,默认加载。
    • bootstrap-plugins # 启动插件,默认加载。
    • config # 配置文件
    • logs # 日志
    • optional-plugins # 可选扩展插件,启动不加载,如需加载将其移到到plugins目录下。
    • optional-reporter-plugins # 可选统计类插件,启动不加载。
    • plugins # 服务类插件
    • skywalking-agent.jar # 客户端主程序,需要被服务启动是引用。
  • 使用:

    项目启动命令添加-javaagent:/path/skywalking-agent/skywalking-agent.jar

  • 示例:

   java -javaagent:/path/skywalking-agent/skywalking-agent.jar -jar your-app.jar
  • 配置:

    • 系统属性:-Dskywalking.[config]=[value]
    • 代理参数: -javaagent:skywalking-agent.jar=[config]=[value],…
    • 系统环境变量:agent.service_name=${SW_AGENT_NAME:Your_ApplicationName},如果SW_AGENT_NAME 您的操作系统中存在环境变量,并且其值为skywalking-agent-demo,则agent.service_name此处的值将被覆盖为skywalking-agent-demo,否则将被设置为Your_ApplicationName。
    • 修改目录/path/skywalking-agent/config/agent.config文件
// todo
//服务名称
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
// OAP服务地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

代理选项 > System.Properties(-D) > 系统环境变量 > 配置文件

  • 官方文档

Client JavaScript

  • 安装
   npm install skywalking-client-js --save
  • 注册
   import ClientMonitor from 'skywalking-client-js';

   // Report collected data to `http:// + window.location.host + /browser/perfData` in default
   ClientMonitor.register({
      collector: 'http://127.0.0.1:8080',
      service: 'test-ui',
      pagePath: '/current/page/name',
      serviceVersion: 'v1.0.0',
   });
   // options
   {
      // 参考方法文档
   }
  • 手动收集指标

    页面加载时或任何其他有意义的时刻的指标,PV

    • register时设置autoTracePerf:false
    • 调用setPerformance
   import ClientMonitor from 'skywalking-client-js';

   ClientMonitor.setPerformance({
      collector: 'http://127.0.0.1:8080',
      service: 'browser-app',
      serviceVersion: '1.0.0',
      pagePath: location.href,
      useFmp: true
   });
  • SPA

    • register时设置enableSPA:true,开启单页面应用基于hashchange event触发指标采集行为
    • 或者通过以下方法手动处理,在上报数据时手动更新页面名称,当调用该方法时,默认情况下将重新报告页面PV
   app.on('routeChange', function (next) {
      ClientMonitor.setPerformance({
         collector: 'http://127.0.0.1:8080',
         service: 'browser-app',
         serviceVersion: '1.0.0',
         pagePath: location.href,
         useFmp: true
      });
   }); 
  • 跟踪请求数据

    支持跟踪这些(XMLHttpRequest和Fetch API)两种模式的数据请求。同时,支持基于XMLHttpRequest和fetch的跟踪库和工具,如Axios、SuperAgent、OpenApi等

       // Angular
       import { ErrorHandler } from '@angular/core';
       import ClientMonitor from 'skywalking-client-js';
    
       export class AppGlobalErrorhandler implements ErrorHandler {
       handleError(error) {
          ClientMonitor.reportFrameErrors({
             collector: 'http://127.0.0.1',
             service: 'angular-demo',
             pagePath: '/app',
             serviceVersion: 'v1.0.0',
          }, error);
       }
       }
       @NgModule({
       ...
       providers: [{provide: ErrorHandler, useClass: AppGlobalErrorhandler}]
       })
       class AppModule {}
    
    // React
    class ErrorBoundary extends React.Component {
    constructor(props) {
       super(props);
       this.state = { hasError: false };
    }
    static getDerivedStateFromError(error) {
       // Update state so the next render will show the fallback UI.
       return { hasError: true };
    }
    componentDidCatch(error, errorInfo) {
       // You can also log the error to an error reporting service
       ClientMonitor.reportFrameErrors({
          collector: 'http://127.0.0.1',
          service: 'react-demo',
          pagePath: '/app',
          serviceVersion: 'v1.0.0',
       }, error);
    }
    render() {
       if (this.state.hasError) {
          // You can render any custom fallback UI
          return <h1>Something went wrong.</h1>;
       }
       return this.props.children; 
    }
    }
    <ErrorBoundary>
    <MyWidget />
    </ErrorBoundary>
    
    // Vue
    Vue.config.errorHandler = (error) => {
    ClientMonitor.reportFrameErrors({
       collector: 'http://127.0.0.1',
       service: 'vue-demo',
       pagePath: '/app',
       serviceVersion: 'v1.0.0',
    }, error);
    }
    
    
    
  • 官方文档

skywalking-client-js

监测对象

  • 服务(Service)
对请求提供端点的单个应用或负载,在使用埋点、代理或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 会使用在agent.conf中配置的默认服务名称。
  • 服务实例(Instance)
服务组中的每个单独的工作负载都称为一个实例。就像pods在 Kubernetes 中一样,它不需要是单个操作系统进程,但是,如果您使用仪器代理,则实例实际上是一个真正的操作系统进程。
  • 端点(Endpoint)
用于传入请求的服务中的路径,例如 HTTP URI 路径或 gRPC 服务类 + 方法签名。

UI指标

通过配置文件定义需要关注的指标 通过特定的分析语言计算指标

UI包括以下几个部分:

  • 仪表盘
  • 拓扑图
  • 追踪
  • 性能剖析
  • 日志
  • 告警
  • 事件
  • 调试

仪表盘

APM
  • Global

    • Services Load(CPM / PPM):服务每分钟请求数
    • Slow Services(ms):慢响应服务(按照响应时间排序)
    • Un-Health Services (Apdex):Apdex分数(1为满分)
    • Slow Endpoints (ms):慢Endpoint的平均响应时间
    • Global Response Latency(percentile in ms):响应时间百分比
    • Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度颜色越深,请求越多。
  • Service

    • Service Apdex 数字:当前服务的Apdex分数;
    • Successful Rate(%):当前服务的请求成功率;
    • Service Load (CPM / PPM)数字:每分钟调用次数(CPM),如果是TCP,表示每分钟的数据包数(PPM);
    • Service Avg Response Time(ms):当前服务平均响应时间;
    • Service Apdex 折线图:当前服务一段时间内的Apdex分数;
    • Service Response Time Percentile(ms):当前服务的百分比响应延时;
    • Successful Rate(%)折线图:当前服务一段时间内的请求成功率;
    • Service Load (CPM / PPM)折线图:当前服务一段时间内的每分钟调用次数;
    • Service Throughput(Bytes):服务吞吐量,只适用于TCP服务;
    • Message Queue Consuming Count:消息队列消费数;
    • Message Queue Avg Consuming Latency(ms):消息队列平均延迟时间;
    • Service Instances Load(CPM / PPM):每个实例每分钟请求数;
    • Slow Service Instance(ms):每个服务实例平均延时;
    • Service Instance Successful Rate(%):服务实例的请求成功率。
  • Instance

    • instance_jvm_memory_heap(堆内存使用)
    • instance_jvm_memory_heap_max(最大堆内存)
    • instance_jvm_memory_noheap(直接内存使用)
    • instance_jvm_memory_noheap_max(最大直接内存)
    • Service Instance Load(CPM / PPM):当前实例每分钟调用数;
    • Service Instance Throughput(Bytes):当前实例的吞吐流量;
    • Service Instance Successful Rate(%):当前实例调用成功比率;
    • Service Instance Latency(ms):当前实例响应延时;
    • JVM CPU(Java Service)%:当前实例JVM的CPU占用百分比(相对于主机);
    • JVM Memory (Java Service)(MB):当前实例的内存占用大小;
    • JVM GC Time(ms):JVM 垃圾回收时间,包含young gc和old gc;
    • JVM GC Count:JVM垃圾回收次数,包含young gc count和old gc count;
    • JVM Thread Count(java service):当前实例的线程数;
    • JVM Thread State Count (Java Service):当前实例的各状态线程数;
    • JVM Class Count (Java Service):当前实例类的计数。
  • Endpoint

    • Endpoint Load in Current Service(CPM / PPM):当前服务每个端点的每分钟请求数;
    • Slow Endpoints in Current Service(ms):当前服务每个端点的平均响应时间;
    • Successful Rate in Current Service(%):当前服务每个端点的请求成功率;
    • Endpoint Load:当前端点每个时间段的请求量;
    • Endpoint Avg Response Time(ms):当前端点每个时间段的平均请求响应时间;
    • Endpoint Response Time Percentile(ms):当前端点每个时间段的响应时间占比;
    • Endpoint Successful Rate(%):当前端点每个时间段的请求成功率;
Database
  • Database Avg Response Time(ms):当前数据库平均响应时间;
  • Database Access Successful Rate(%):当前数据库访问成功率;
  • Database Traffic(CPM: Calls Per Minute):当前数据库每分钟请求数;
  • Database Access Latency Percentile(ms):当前数据库响应延迟时间的百分比;
  • Slow Statements(ms):慢查询,按照执行时间排序;
  • All Database Loads(CPM: Calls Per Minute):所有数据库的请求次数排序;
  • Un-Health Databases (Successful Rate):所有数据库请求成功率排序。
SelfObservability

自监控,OAP服务端的各项指标

  • 修改配置config/application.yml
   # 将-修改为default
   prometheus-fetcher:
     selector: ${SW_PROMETHEUS_FETCHER:default}
     #default:
     #   active: ${SW_PROMETHEUS_FETCHER_ACTIVE:true}

   # 改none为prometheus
   telemetry:
     selector: ${SW_TELEMETRY:prometheus} 
     prometheus:
       host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0}
       port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234}
  • 如果telemetry有调整,则对应修改修改config/fetcher-prom-rules/self.yaml
   fetcherInterval: PT15S
   fetcherTimeout: PT10S
   metricsPath: /metrics
   staticConfig:
      # 改为上步中telemetry配置的ip
      targets:
         - url: http://localhost:1234 
            sslCaFilePath:
      labels:
         service: oap-server
  • 检查:curl http://localhost:1234/metrics
Event
Istio、K8s
VM
Web Browser

对前端也有一定的监控,通过Skywalking-Client-js组件来操作,包括Web App、Pages两个指标。

拓扑图

  • 服务选择器 支持显示直接关系,包括上游和下游;
  • 自定义组 提供服务组的任意子拓扑功能,但是分组的信息是保存在浏览器内的;
  • 服务菜单 当您单击任何服务时打开。该图形可以对所选择的服务进行度量、跟踪和告警查询;
  • 服务指标的关系 提供服务RPC交互的度量以及这两个服务的实例。

追踪

看每个接口的调用链,每个链路耗时、状态。如果为失败展示错误信息,如果是数据库,会展示查询语句。另外可以根据追踪tid(trace id)和标记(tag)进行筛选。

性能剖析

日志

告警

事件

调试

日志集成

支持logback、log4j、log4j2日志框架集成,基于gRpc通信协议实现日志采集。

以logback为例:

  • 引入依赖
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.9.0</version>
        </dependency>
  • 修改logback.xml配置
      <!-- ... -->

      <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.mdc.TraceIdMDCPatternLogbackLayout">
                  <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
         </encoder>
      </appender>

      <root level="INFO">
         <!-- ... -->
         <appender-ref ref="grpc-log"/>
      </root>
  • 修改agent配置 ~/config/agent.config
   plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:0.0.0.0}
   plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
   plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760} 
   plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
  • 官方示例

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

监控方法

通过@Trace注解标记需要追踪的方法调用情况

  • 引入依赖
      <dependency>
         <groupId>org.apache.skywalking</groupId>
         <artifactId>apm-toolkit-trace</artifactId>
         <version>8.9.0</version>
      </dependency>
  • 修改代码
   @Trace
   @GetMapping("/printLog")
   public String printLog() {
      Logger.info("traceId:{}",TraceContext.traceId())
      return "ok";
   }

告警接入

  • 规则
    修改配置config/alarm-settings.yml
  • 钩子
    支持WebHook、GRPCHook、SlackHook、WechatHook、DingtalkHook、FeishuHook实现告警信息推送

场景

指标性统计

一个服务的 TBS 的正确率、成功率、流量等,这是我们常见的针对单个指标或者某一个数据库的,这就是 Metrics 单指标分析

Tracing 分布式追踪

一次请求的范围,也就是我们从浏览器或者手机端发起任何的一次调用,甚至我们可以再推广一点,是一次业务交易,比如说一次订购的过程,从浏览商品到最后下定单、支付、物流、最后交到我们的手上。这是一个流程化的东西,我们需要轨迹,需要去追踪。

Logging 日志记录

我们程序在执行的过程中间发生了一些日志,会一帧一帧地跳出来给大家去记录这个东西,这是日志记录。

关键词

  • Topology:拓扑
  • Trace:追踪
  • Metrics:度量
  • Span:
  • Apdex:是根据设定的阈值和响应时间结合考虑的衡量标准。它是满意响应时间和不满意响应时间相对于总响应时间的比率。它衡量的是用户对你的服务的满意程度,因为传统的指标(如平均响应时间)可能很快就会容易形成偏差。
  • percentile:标签含义(p50、p75、p90、p95、p99):例如p99为1000ms, 这意味着 99% 的请求应该比1000ms更快

结束语

ackHook、WechatHook、DingtalkHook、FeishuHook实现告警信息推送

场景

指标性统计

一个服务的 TBS 的正确率、成功率、流量等,这是我们常见的针对单个指标或者某一个数据库的,这就是 Metrics 单指标分析

Tracing 分布式追踪

一次请求的范围,也就是我们从浏览器或者手机端发起任何的一次调用,甚至我们可以再推广一点,是一次业务交易,比如说一次订购的过程,从浏览商品到最后下定单、支付、物流、最后交到我们的手上。这是一个流程化的东西,我们需要轨迹,需要去追踪。

Logging 日志记录

我们程序在执行的过程中间发生了一些日志,会一帧一帧地跳出来给大家去记录这个东西,这是日志记录。

关键词

  • Topology:拓扑
  • Trace:追踪
  • Metrics:度量
  • Span:
  • Apdex:是根据设定的阈值和响应时间结合考虑的衡量标准。它是满意响应时间和不满意响应时间相对于总响应时间的比率。它衡量的是用户对你的服务的满意程度,因为传统的指标(如平均响应时间)可能很快就会容易形成偏差。
  • percentile:标签含义(p50、p75、p90、p95、p99):例如p99为1000ms, 这意味着 99% 的请求应该比1000ms更快

结束语

Apache SkyWalking是一款功能强大的APM系统,可以帮助开发人员和运维人员更好地了解分布式系统的性能状况。通过使用SkyWalking,可以提高应用程序的稳定性和性能,降低运维成本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea Error: java: OutOfMemoryError: insufficient memory处理

IDEA设置里&#xff0c;修改heap size更大一点&#xff0c;可以解决问题

Solidity快速入门之函数输出

返回值return和returns Solidity有两个关键字与函数输出相关&#xff1a;return和returns&#xff0c;他们的区别在于&#xff1a; returns加在函数名后面&#xff0c;用于声明返回的变量类型及变量名&#xff1b;return用于函数主体中&#xff0c;返回想要返回的变量&#x…

1560分钟一节课VUE项目从入门到精通

在职场&#xff0c;流传着这样一句话&#xff1a;跳槽加薪是现实&#xff0c;原地加薪是梦想。工作跳一跳&#xff0c;工资翻一番。 事实好像确实如此&#xff0c;相关机构调研发现&#xff0c;跳槽换工作后的平均加薪幅度能达到36%&#xff01; ▲ 图源网络&#xff0c;如侵删…

nodejs统计文件/文件夹数量

nodejs统计文件/文件夹数量 const fs require(fs); const path require(path);const htmlList []; const cssList []; const jsList []; let fileNum 0 let filesNum 0 function getFiles(dir) {const folders fs.readdirSync(dir);folders.forEach((folderName) >…

卡博替尼Cabozantinib使用说明书、副作用、使用方法、不良反应

&#xff08;图片来源于网络&#xff09; 卡博替尼&#xff08;Cabozantinib&#xff09;是一种靶向药物&#xff0c;属于多受体酪氨酸激酶抑制剂。它被用于治疗多种癌症&#xff0c;包括进行性、转移性甲状腺髓样癌、晚期肾癌和二线治疗晚期肝癌。卡博替尼可以阻断涉及癌细胞…

基于springboot实现招生平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现招生管理系统演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招生管理系统的网络应用&#xff0c;在外国招生管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。招…

一文吃透Redis主从复制的原理

1. 引言 之前我们聊过 Redis 的数据结构底层原理和持久化机制&#xff0c;这期我们来聊 Redis 的高可用主题。 时光穿梭机&#xff1a; Redis持久化都说不明白&#xff1f;那今天先到这吧~Redis数据结构的底层原理 众所周知&#xff0c;一个数据库系统想要实现高可用&#…

GNU链接脚本详解

0. 前言 每一个链接都是由链接脚本控制的&#xff0c;链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本&#xff0c;如果你没有指定自己的脚本&#xff0c;就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数…

Unreal Engine 学习笔记 (2)—— 走跑切换

1.创建并编辑混合空间 鼠标右击内容浏览器选中动画选中混合空间1D选择对应的骨骼重命名为1D双击1D的图标&#xff0c;进入混合空间的编辑界面鼠标点开水平坐标标签设置名称为Speed设置最大轴值为600拖放对应动画到采样点中 2.创建动画蓝图 鼠标右击内容浏览器选中动画选中动…

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]

什么是机器学习中的特征提取&#xff1f; 特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…

国自然中标越来越难,怎样才能赢在起跑线上?

众所周知&#xff0c;国自然在学术界的地位和影响力不容小觑。“国自然在手&#xff0c;天下我有”&#xff0c;对于科研人来说&#xff0c;成功申报国自然&#xff0c;有助于职称评审、职业升迁&#xff0c;同时&#xff0c;获得不菲的科研经费。据了解&#xff0c;有些高校还…

MCU常见通信总线串讲(一)—— UART和USART

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

第七章 图【数据结构与算法】【精致版】

第七章 图【数据结构与算法】【精致版】 前言版权第七章 图7.1 应用实例7.2图的基本概念7.3图的存储结构7.3.1邻接矩阵**1-邻接矩阵.c****2-邻接矩阵plus.c** 7.3.2 邻接表**3-邻接表.c** **4-邻接表plus.c** 7.3.3 十字链表7.3.4多重链表 7.4图的遍历7.4.1深度优先搜索遍历**5…

每天一点python——day62

为了方便复制&#xff0c;我在下面附带了一个python文件。 C:\Users\Admin>python Python 3.9.13 (main, Aug 25 2022, 23:51:50) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32Warning: This Python interpreter is in a conda environment, but the environmen…

【蓝桥杯选拔赛真题13】C++最短距离 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

C/C++最短距离 第十二届青少组蓝桥杯C++选拔赛真题 一、题目要求 1、编程实现 有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。 例如:小区为 3 行 6 列,矩阵排列方式: 要求:已知小区…

python 之列表的常用方法

文章目录 1. **append()** 方法2. **extend()** 方法3. **insert()** 方法4. **pop()** 方法5. **remove()** 方法6. **clear()** 方法7. **index()** 方法8. **count()** 方法9. **reverse()** 方法10. **sort()** 方法 当操作 Python 列表时&#xff0c;常用的方法如下。以下…

Python学习笔记--模块简介

一、Python 模块简介 在开发过程中&#xff0c;随着程序代码越写越多&#xff0c;在一个文件里代码就会越来越长&#xff0c;越来越不容易维护。 后面我们学习了函数&#xff0c;知道函数是实现一项或多项功能的一段程序&#xff0c;这样就更方便我们重复使用代码。 紧接着&…

解析半导体测试系统及半导体的测试方法步骤

半导体如今在集成电路、通信系统、照明等领域被广泛应用&#xff0c;是一种非常重要的材料。在半导体行业中&#xff0c;半导体测试是特别关键的环节&#xff0c;以保证半导体器件及产品符合规定和设计要求&#xff0c;确保其质量和性能。 随着现代电子技术的发展&#xff0c;半…

移远EC600U-CN开发板 day02

1.QuecPythonLVGL显示图片 由于官方提供的显示图片函数使用失败&#xff0c;为了能在屏幕上显示图片&#xff0c;通过对出厂脚本的分析&#xff0c;成功使用LVGL显示图片 (1)代码 import lvgl as lv from tp import gt9xx from machine import LCD from machine import Pin …

别让噪声偷走你的听力

欢声笑语&#xff0c;音乐悠扬&#xff0c;燕语莺声&#xff0c;流水潺潺&#xff0c;和亲友畅所欲言…… 这些愉悦的声音让我们每天的生活更充实&#xff0c;他们也是美好记忆的重要组成部分。听力对于我们的身体健康、情感幸福和整体生活质量起着巨大的作用。 因此保护听力健…