当前位置: 首页 > news >正文

SkyWalking全景解析:从原理到实现的分布式追踪之旅

🎏:你只管努力,剩下的交给时间

🏠 :小破站

SkyWalking全景解析:从原理到实现的分布式追踪之旅

  • 前言
  • 第一:SkyWalking简介
  • 第二:实现原理概览
  • 第三:主键与架构
  • 第四:数据采集与传输
  • 第五:追踪数据的处理与存储
  • 第六:性能影响与优化
    • 性能影响:
    • 优化建议:
  • 第七:多语言支持
    • Java:
    • Node.js:
    • Python:
    • Go:
    • .NET:

前言

在现代软件开发中,分布式系统的复杂性给性能监测和故障排查带来了挑战。SkyWalking作为一款开源的分布式追踪系统,为开发者提供了一种高效的解决方案。现在,让我们一起深入探讨SkyWalking的实现原理,揭示其在追踪分布式系统中的神奇之处。

第一:SkyWalking简介

SkyWalking是一个开源的分布式系统跟踪和性能监测工具,旨在帮助开发人员更好地理解和优化其分布式系统的性能。它提供了全面的分布式跟踪,性能指标和日志分析,使开发人员能够深入了解分布式系统中不同组件之间的交互,发现潜在的性能问题,并追踪请求的流程。

其主要作用包括:

  1. 分布式追踪: SkyWalking能够追踪分布式系统中的请求流,并记录请求在各个组件之间的传递过程。这有助于识别潜在的性能瓶颈和优化机会。

  2. 性能监测: 通过监测关键性能指标,如响应时间、吞吐量等,SkyWalking帮助开发人员了解系统的整体性能表现,并及时发现性能下降或异常。

  3. 问题排查: 当系统中出现问题时,SkyWalking可以提供详细的跟踪信息,帮助开发人员快速定位和解决问题,减少故障排除的时间。

在分布式系统中,由于各个组件分布在不同的节点上,可能运行在不同的语言和框架下,跟踪和监测这些组件之间的交互变得复杂而困难。SkyWalking通过提供统一的监测和追踪平台,弥补了这一缺陷,使开发人员能够更轻松地管理和优化分布式系统。

对于代码的实现,使用SkyWalking通常需要在应用程序中集成相应的代理或插件,以便收集和传递跟踪数据。在代码中,你可以添加注释来标识关键的业务逻辑和交互点,以便更清晰地了解跟踪结果。这种注释可以作为文档,帮助团队理解系统的架构和流程。

第二:实现原理概览

SkyWalking的基本实现原理涉及以下关键概念和步骤:

  1. 代理和探针: SkyWalking通过在应用程序中引入代理或探针来收集分布式系统的性能数据。这些代理可以以不同的形式存在,如Java Agent、Node.js Agent等,具体取决于应用程序的技术栈。

  2. 字节码注入: 为了收集跟踪数据,SkyWalking通过在运行时修改应用程序的字节码来实现代理的注入。这样,代理能够捕获请求的关键信息,如调用链路、方法执行时间等。

  3. 注册中心: 分布式系统中的各个服务实例通常需要注册到服务注册中心。SkyWalking通过注册中心获取服务的拓扑结构,从而了解服务之间的关系和依赖关系。

  4. 数据存储: 收集到的性能数据被发送到后端的数据存储系统,通常是支持分布式存储的数据库。这些数据包括跟踪信息、性能指标和日志数据。

分布式追踪的核心概念包括以下几个方面:

  1. 跨越(Span): 在分布式系统中,一个请求可能经过多个服务和组件。跨越是指这个请求在整个分布式系统中的一段时间内的活动。在SkyWalking中,一个跨越由一系列的Span组成,每个Span代表了分布式系统中的一个组件或操作。

  2. 上下文传播: 上下文传播是指在分布式系统中传递请求上下文信息的过程。当一个请求进入系统时,它的上下文信息(如Trace ID和Span ID)会被赋予一个唯一的标识。在请求经过不同的服务和组件时,这些上下文信息会被传递,以确保整个跨越的连贯性。

  3. Trace ID和Span ID: Trace ID是整个跨越的唯一标识,而Span ID则标识跨越中的单个Span。通过这两个标识,SkyWalking能够将不同服务和组件的跟踪信息关联起来,形成完整的调用链路。

总体而言,SkyWalking通过在应用程序中注入代理、利用注册中心获取服务拓扑结构、字节码注入实现跨越的跟踪,同时通过上下文传播确保跨越的连贯性。这使得开发人员能够深入了解分布式系统中的性能状况,从而进行优化和故障排除。在实现中,通过在关键代码位置添加注释,可以帮助开发人员更好地理解跟踪结果和调用链路。

第三:主键与架构

SkyWalking的整体架构由多个核心组件组成,每个组件都有特定的功能和在分布式追踪中扮演重要的角色。以下是SkyWalking的核心组件和整体架构的详细解析:

  1. 数据接收端(Receiver): 数据接收端负责接收来自各个服务实例的跟踪数据。这些数据包括跨越信息、性能指标和日志数据。接收端将这些数据进行初步处理,然后传递给后续的处理组件。

  2. 数据存储(Storage): 数据存储组件负责将接收到的跟踪数据持久化存储,通常使用支持分布式存储的数据库。这样,开发人员可以随时查询历史的跟踪信息和性能数据。

  3. 分析组件(Analysis): 分析组件从存储中获取跟踪数据,进行聚合和分析,生成性能指标、调用链路图和其他有用的统计信息。这些分析结果可以帮助开发人员了解系统的整体性能和潜在问题。

  4. UI界面(UI): UI组件提供了一个用户界面,让开发人员通过可视化的方式查看系统的性能和跟踪数据。这包括调用链路图、性能指标图表等,使开发人员更容易理解系统的运行状况。

  5. 探针(Agent): 控制代理是SkyWalking的核心组件之一,负责在应用程序中进行字节码注入,以收集跟踪数据。每个服务实例都需要部署探针,以便捕获请求的关键信息,如调用链路、方法执行时间等。

  6. 注册中心(Registry): 注册中心组件用于获取服务的拓扑结构信息,了解服务之间的关系和依赖关系。这对于构建完整的调用链路图至关重要。

在分布式追踪中,这些组件相互协作,形成一个完整的系统。当一个请求进入系统时,探针捕获相关信息并将其发送给数据接收端。注册中心提供服务拓扑结构,确保跨越的连贯性。数据存储和分析组件负责将这些数据存储和分析,UI界面提供可视化的展示,帮助开发人员更好地理解和优化系统性能。

在代码中,开发人员可以通过添加注释来标识关键的业务逻辑和交互点,以便更清晰地了解跟踪结果。这种注释可以作为文档,帮助团队理解系统的架构和流程。

第四:数据采集与传输

SkyWalking通过探针(Agent)在分布式系统中进行数据采集。以下是数据采集和传输的基本流程:

  1. 数据采集: 每个服务实例都需要部署SkyWalking的探针。这可以是针对特定技术栈的代理,比如Java Agent、Node.js Agent等。探针通过字节码注入的方式,监视应用程序的运行,并捕获关键的性能和跟踪数据。

  2. 跨越(Span)的生成: 当一个请求进入系统时,探针开始生成跨越(Span)。每个Span代表分布式系统中的一个组件或操作。这包括服务调用、数据库查询、消息传递等。

  3. 上下文传播: 跨越的生成过程中,探针负责传播请求的上下文信息。这包括Trace ID和Span ID,用于唯一标识整个跨越以及其中的每个Span。上下文传播确保在整个分布式系统中保持请求的连贯性。

  4. 数据发送: 探针将生成的跨越数据发送到数据接收端。数据接收端通常位于分布式系统内的某个中心位置,等待各个服务实例发送数据。

  5. 数据接收端的处理: 数据接收端接收到跨越数据后进行初步处理,可能包括数据格式的解析和一些简单的过滤。然后,数据接收端将数据传递给后续的数据存储和分析组件。

至于数据在系统内部的传输流程和机制,通常可以分为以下步骤:

  1. Agent到数据接收端的传输: 探针将采集到的跨越数据封装成特定的格式,通过网络传输到数据接收端。这可以采用诸如HTTP、gRPC等协议。

  2. 数据接收端的处理: 数据接收端接收到数据后,解析数据格式,并进行一些基本的处理,比如校验数据的有效性、去除冗余信息等。之后,数据接收端将数据发送给数据存储和分析组件。

  3. 存储和分析组件的处理: 数据存储和分析组件负责将接收到的数据进行持久化存储,并进行聚合、分析等操作。这些组件可能使用分布式存储系统,以确保数据的可靠性和可扩展性。

  4. UI界面的展示: 数据存储和分析组件生成的结果可以通过UI界面展示给开发人员。这包括调用链路图、性能指标图表等,使开发人员更容易理解系统的运行状况。

通过这个流程,SkyWalking实现了对分布式系统中性能和跟踪数据的全面采集,并通过可视化的方式呈现给开发人员,帮助他们更好地理解和优化系统。在代码中,添加注释可以帮助开发人员更清晰地了解关键的业务逻辑和交互点。

第五:追踪数据的处理与存储

SkyWalking在处理和存储追踪数据方面涉及以下关键步骤:

  1. 数据接收与解析: 探针采集到的跟踪数据首先会被发送到数据接收端。在这一步,数据接收端负责解析数据的格式,并进行初步的处理,例如验证数据的有效性、去除冗余信息等。

  2. 数据存储: 解析后的数据被存储到数据存储组件中。通常,这个组件使用支持分布式存储的数据库,以确保数据的可靠性和可扩展性。存储的数据包括跨越信息、性能指标、日志数据等。

  3. 数据聚合: 存储的数据可能包含大量的跨越信息,其中每个跨越由一系列的Span组成。为了更好地理解系统的性能和发现潜在问题,数据存储组件进行数据聚合,将相关的跨越信息合并为一个整体。这有助于生成调用链路图,显示请求在整个系统中的流动路径。

  4. 数据分析: 聚合后的数据被传递给分析组件,这个组件进行更深层次的数据分析。它可以生成性能指标、识别瓶颈、检测异常等。数据分析的结果可以通过UI界面呈现给开发人员,帮助他们更好地了解系统的整体性能。

强调数据的聚合和分析对性能优化的重要性体现在以下方面:

  1. 性能瓶颈识别: 通过聚合和分析跨越数据,系统可以识别潜在的性能瓶颈。这有助于开发人员找到系统中影响性能的关键点,进行有针对性的优化。

  2. 优化机会发现: 数据分析可以揭示系统中的优化机会。通过了解系统的整体性能和请求的流动路径,开发人员可以确定哪些部分可以进一步优化,以提高系统的效率。

  3. 故障排除: 聚合和分析的数据也有助于故障排除。当系统出现问题时,开发人员可以通过调用链路图迅速定位问题所在,缩短故障排除的时间。

总体而言,SkyWalking通过对跟踪数据的聚合和分析,提供了全面的性能信息,帮助开发人员更好地理解和优化分布式系统。这种分析对于性能优化、问题排查和系统可维护性的提升都具有重要的意义。在实际应用中,通过对关键代码添加注释,可以使开发人员更清晰地了解业务逻辑和跟踪数据的关联。

第六:性能影响与优化

SkyWalking作为一个分布式系统追踪工具,会对系统产生一些性能开销,主要体现在探针的运行和数据收集传输上。以下是一些关于性能影响和优化建议:

性能影响:

  1. 探针运行开销: 探针在应用程序中运行,可能对应用的性能产生一定的影响。这包括对方法执行的监控、跨越生成等操作。

  2. 数据传输开销: 将跟踪数据发送到数据接收端也会产生一些网络传输开销,特别是在数据量较大或网络延迟较高的情况下。

优化建议:

  1. 精简监控范围: 避免对整个应用程序进行监控。通过配置,只监控关键业务逻辑或性能瓶颈所在的模块,以减小探针的运行开销。

  2. 配置合理的采样率: 控制跨越数据的采样率,即不是每个请求都生成跨越。通过合理配置采样率,可以减少数据传输开销。

  3. 异步传输: 将跨越数据的传输改为异步方式,以避免阻塞应用程序的正常执行。这可以通过在探针配置中调整相应的参数来实现。

  4. 数据压缩: 如果跨越数据量较大,考虑在传输过程中启用数据压缩,以减小网络传输的开销。

  5. 分布式部署: 将SkyWalking的各个组件进行分布式部署,以提高整个系统的可扩展性和容错性。

  6. 合理配置存储: 根据实际需求和系统规模,选择合适的数据存储方案,确保系统在处理大量跟踪数据时能够保持稳定和高效。

  7. 定期清理历史数据: 对于历史数据,定期进行清理以防止数据存储过度增长,影响性能。

  8. 监控SkyWalking本身的性能: 定期监控SkyWalking组件的性能,确保它们不成为系统瓶颈。

  9. 合理设置数据保留期限: 根据业务需求和法规合规性,设置数据的保留期限,以控制存储资源的使用。

通过以上建议,可以最大程度减小SkyWalking对系统性能的影响,确保在获得良好监控的同时,不过度影响生产环境的运行性能。需要根据具体的应用场景和需求进行调优,平衡监控的全面性和对系统性能的影响。

第七:多语言支持

SkyWalking提供了对多种编程语言的支持,这使得开发人员可以在不同的技术栈中集成SkyWalking以进行分布式系统的跟踪。以下是一些主要的编程语言的支持和相应的集成示例:

Java:

SkyWalking提供了专门的Java探针,支持Java应用程序的跟踪。

// Maven依赖
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>${skywalking.version}</version>
</dependency>

Node.js:

Node.js也有专门的SkyWalking探针。

// 使用npm安装SkyWalking探针
npm install skywalking-nodejs// 在应用程序的入口文件中引入
require('skywalking-nodejs').start({serviceName: 'your-service-name',collectorAddress: 'your-collector-address'
});

Python:

Python应用程序可以使用SkyWalking的Python探针。

# 使用pip安装SkyWalking探针
pip install skywalking# 在应用程序的入口文件中引入
from skywalking import agent, configconfig.init(collector='your-collector-address', service_name='your-service-name')
agent.start()

Go:

Go语言也有对应的SkyWalking探针。

// 使用go get安装SkyWalking探针
go get -u github.com/apache/skywalking-satellite/plugins/agent// 在应用程序的入口文件中引入
import (_ "github.com/apache/skywalking-satellite/plugins/agent"
)

.NET:

对于.NET应用程序,SkyWalking提供了相关的支持。

// 使用NuGet安装SkyWalking探针
Install-Package SkyWalking// 在应用程序的入口文件中引入
using SkyWalking.Config;
using SkyWalking.Context;GlobalTracer.Instance.AddService("your-service-name").WithDirectUpdate(true).Start();

以上示例代码中,你需要替换其中的服务名(service name)和收集器地址(collector address)为你实际的配置。这些示例代码演示了如何在不同的编程语言中引入SkyWalking探针并进行基本的配置。具体的集成细节可能因版本而异,建议查阅官方文档以获取最新的信息和指导。

注意:对于每种语言,都有相应的文档和示例代码,以便更详细地了解集成步骤和配置选项。

相关文章:

SkyWalking全景解析:从原理到实现的分布式追踪之旅

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 SkyWalking全景解析&#xff1a;从原理到实现的分布式追踪之旅 前言第一&#xff1a;SkyWalking简介第二&#xff1a;实现原理概览第三&#xff1a;主键与架构第四&#xff1…...

新手如何买卖可转债,可转债投资基础入门

一、教程描述 什么是可转债&#xff1f;可转债是可转换债券的二次简称&#xff0c;原始全称是可转换公司债券&#xff0c;这是一种可以在特定时间、按特定条件&#xff0c;转换为普通股票的特殊企业债券&#xff0c;可转换债券兼具债权和股权的特征&#xff0c;其英文为conver…...

研习代码 day39 | 动态规划——完全背包的应用

一、爬楼梯&#xff08;进阶版&#xff09; 1.1 题目 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述 输入共一…...

Rust语言入门教程(五) - 流控制语句

if 表达式 在Rust中&#xff0c; if语句的判断条件不需要用( )括起来&#xff0c; 它会认为所有在if 和 {之间的表达式就是判断条件&#xff0c;例如&#xff1a; if num 5 {msg "five"; }判断条件的表达式必须返回一个bool型的值&#xff0c; 因为Rust是一个不喜…...

字符串:leetcode1410. HTML 实体解析器

1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &quot; &#xff…...

springboot+vue项目如何集成onlyoffice开源文档组件

一、onlyoffice是什么 ONLYOFFICE 是一个开源的办公套件&#xff0c;适合多人在线协作。由总部位于总部在拉脱维亚的 IT 公司Acensio System SIA 开发。它提供在线协作文档编辑器&#xff08;包括文档、电子表格、演示文稿和表单&#xff09;&#xff0c;适用于 Windows、Linu…...

Android okhttp3.0配置https信任所有证书

参考: Android okhttp3.0配置https的自签证书和信任所有证书 private OkHttpClient getHttpsClient() {OkHttpClient.Builder okhttpClient new OkHttpClient().newBuilder();//信任所有服务器地址okhttpClient.hostnameVerifier(new HostnameVerifier() {Overridepublic boo…...

大数据基础设施搭建 - Hive

文章目录 一、上传压缩包二、解压压缩包三、配置环境变量四、初始化元数据库4.1 配置MySQL地址4.2 拷贝MySQL驱动4.3 初始化元数据库4.3.1 创建数据库4.3.2 初始化元数据库 五、启动元数据服务metastore5.1 修改配置文件5.2 启动/关闭metastore服务 六、启动hiveserver2服务6.1…...

手把手教你安装 Visual Studio 2022 及其简单使用

软件下载 打开 Visual Studio 官网&#xff0c;个人选择免费的Community社区版就够用了。 软件安装 双击运行安装程序&#xff1a; 点击继续 即可&#xff1a; 等待加载完成&#xff1a; 可以看到 Visual Studio 2022 对应不同的开发需求提供了若干工作负载&#xff0c;这里以…...

在MySQL中,修改字段A相同的记录的字段B ,要使得字段C小的记录的字段B值等于字段C大的记录的字段B值

例如&#xff1a;更新具有相同电话号码的用户记录&#xff0c;使得updatetime小的记录的name值等于updatetime大的记录的name值。 首先&#xff0c;我们需要创建一个用户表&#xff0c;这个用户表包含以下字段&#xff1a;phone&#xff0c;updatetime, name。以下是创建这个表…...

Java WebSocket 客户端接收大量数据

介绍 WebSocket 是一种基于 TCP 协议的全双工通信协议&#xff0c;它能够在客户端和服务器之间建立一个持久连接&#xff0c;实现实时的双向数据传输。在实际应用中&#xff0c;有时候我们需要处理大量的数据&#xff0c;例如实时监控系统或者实时股票行情等。本文将介绍如何使…...

QT 在Windows下实现ping功能(ICMP)

前言 很多时候&#xff0c;我们可能会图省事直接调用系统中的ping命令&#xff0c;但这是很不科学的~ 废话不多说&#xff0c;直接上代码.. .pro文件 在.pro文件末尾添加一行&#xff1a; LIBS -liphlpapi -lws2_32 .h文件 在.h文件中加入&#xff1a; #include <Q…...

harmonyos应用开发者高级认证考试部分答案

1只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09; 2所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函数。&#xff08;错&#xff09; 3 HarmonyOS应用可以兼容OpenHarmony生态&#xff08;对&#…...

基于 STM32Cube.AI 的嵌入式人脸识别算法实现

本文介绍了如何使用 STM32Cube.AI 工具开发嵌入式人脸识别算法。首先&#xff0c;我们将简要介绍 STM32Cube.AI 工具和 STM32F系列单片机的特点。接下来&#xff0c;我们将详细讨论如何使用 STM32Cube.AI 工具链和相关库来进行人脸识别算法的开发和优化。最后&#xff0c;我们提…...

ElasticSearch之cat allocation API

查看各节点上各个shard的硬件使用情况&#xff0c;命令样例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/allocation?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果如下&#x…...

Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)

1、需求 使用Vue Element UI 实现在列表的操作栏新增一个复制按钮&#xff0c;复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面&#xff0c;本文实现为跳转到新增页面。 2、实现 1&#xff09;列表页 index.vue <el-table> <!-- 其他列 --> <el-t…...

嵌入式FPGA IP正在发现更广阔的用武之地

作者&#xff1a;郭道正, Achronix Semiconductor中国区总经理 在日前落幕的“中国集成电路设计业2023年会暨广州集成电路产业创新发展高峰论坛&#xff08;ICCAD 2023&#xff09;”上&#xff0c;Achronix的Speedcore™嵌入式FPGA硅知识产权&#xff08;eFPGA IP&#xff09…...

[点云分割] 条件欧氏聚类分割

介绍 条件欧氏聚类分割是一种基于欧氏距离和条件限制的点云分割方法。它通过计算点云中点与点之间的欧氏距离&#xff0c;并结合一定的条件限制来将点云分割成不同的区域或聚类。 在条件欧氏聚类分割中&#xff0c;通常会定义以下两个条件来判断两个点是否属于同一个聚类&…...

Spring事务粒度优化与传播机制

在Spring事务中&#xff0c;我们通常会为了控制事务粒度&#xff0c;会把它进行拆分&#xff0c;为了避免大事务执行太久&#xff0c;占用资源太多&#xff0c;导致资源利用率低的问题。 我们曾经就遇到老系统因为大事务&#xff0c;把服务打死了。 问题出在一个大事务中有一…...

MySQL 基于成本的优化

其实在MySQL中⼀条查询语句的执⾏成本是由下边这两个⽅⾯组成的&#xff1a; I/O成本 我们的表经常使⽤的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的&#xff0c;当我们想查询表中的记录时&#xff0c;需要先把数据或者索引加载到内存中 然后再操作。这个从磁盘…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...