基于OpenTelemetry的分布式链路追踪Trace实现(PHP篇)
目录
- 引言
- 一、OpenTelemetry是一套可观测性标准协议
- 二、分布式追踪(Trace)是OpenTelemetry的核心功能之一
- 三、OpenTelemetry的架构原理
- 四、OpenTelemetry的分布式追踪(Trace)实践
- 1、准备PHP环境
- 2、下载SDK
- 3、编写实例代码
- 4、run起来
- 5、otlp协议上报到存储介质平台
引言
与前篇谈到的MCP协议类似,OpenTelemetry也是一套标准协议。每一套协议的诞生一定是为了解决已存在的某难题的,就好比得先有四通八达的马路和满街的汽车,交通规则的诞生才有意义,如果只是三三两两的车流,似乎交通规则就没那么大的价值。
OpenTelemetry 的前身是 OpenTracing 和 OpenCensus 两个项目。OpenTracing 主要关注分布式追踪,而 OpenCensus 则侧重于指标和跨语言的统计信息收集。 2019年,这两个社区决定合作并融合各自的特性,形成了新的开源项目——OpenTelemetry。这一举措旨在提供一个全面的解决方案,能够同时处理追踪、指标和其他形式的遥测数据,并且支持多种编程语言和框架。OpenTelemetry 在之后的时间里不断完善和扩展其功能,并于2020年正式发布了首个稳定版本。
OpenTelemetry 的诞生是为了应对现代软件系统架构中日益增长的监控和追踪需求,特别是分布式系统和云原生环境的复杂性。它的出现是为了解决多个监控工具之间的互操作性问题,以及提供一种统一的方式来收集、处理和分析遥测数据,从而帮助开发和运维团队更有效地理解和优化他们的服务。
一、OpenTelemetry是一套可观测性标准协议
OpenTelemetry是一套由CNCF主导的云原生可观测性标准协议,全称:OpenTelemetry Protocol,简称OTLP,旨在提供一种统一的方式来收集、处理和分析 分布式追踪(trace)、日志(logging)和度量(metrics) 数据。
OpenTelemetry定义了可观测性的几个方面的标准:trace、logs、metrics、resources。
-
追踪(Tracing):
提供了分布式追踪的功能,可以跟踪请求在分布式系统中的完整路径,帮助识别性能瓶颈和故障点。 -
指标(Metrics):
收集系统的各种性能指标,如请求速率、错误率、资源使用情况等,用于监控系统的健康状况和性能。 -
日志(Logs):
虽然 OpenTelemetry 主要关注追踪和指标,但它也支持与日志系统的集成,以便于将日志数据与其他类型的遥测数据关联起来。
二、分布式追踪(Trace)是OpenTelemetry的核心功能之一
OpenTelemetry与trace的关系主要体现在OpenTelemetry是用于分布式追踪的标准和工具集,而trace是分布式追踪的基本单位。
分布式追踪(Trace)是OpenTelemetry的核心功能之一,用于监控和分析微服务架构中的请求传播路径和性能问题。Trace在分布式系统中扮演着关键角色。它记录了一个请求在多个服务之间传播的完整路径,帮助开发者理解请求在系统中的行为和性能表现。一个trace由多个span组成,每个span代表请求中的一个操作或工作单元,记录了操作的具体信息,如开始和结束时间、操作类型、结果状态等。通过这些信息,开发者可以重构事务的完整旅程,定位和解决性能问题和故障。
可观测性一个很重要的领域 Trace 有两个业界标杆:一个是OpenTracing,另一个OpenCensus。
OpenTracing其实是一个规范,jaeger就是基于opentracing实现的开源工具;
OpenCensus则是由google开源的度量工具;
简单来说,这两者在可观测性领域功能高度重合,因此,在CNCF主导下进行了合并形成opentelemetry项目,OpenTracing跟penCensus共同推进opentelemetry,两者的官网也赫赫表达基本不再维护。同时OpenTelemetry也致力于trace、logging、metrics间的关联性。
三、OpenTelemetry的架构原理
我们重点先来看数据收集管道。
Data Collection Pipeline(数据收集管道)包含:
- Collector:OpenTelemetry Collector是一个开源的组件,用于接收、处理和导出遥测数据。它可以部署在各个服务节点上,也可以作为一个集中式的处理层。
- Receiver:接收来自不同来源的遥测数据。
- Processor:处理和转换数据,例如过滤、聚合等。
- Exporter:将处理后的数据导出到各种后端系统,如Jaeger、Prometheus、Zipkin等。
可不要小看这些概念,在写代码的时候处理问题可有用了。从上面的图可以看出数据整个流向的过程,当数据经过Collector采集器之后,就可以Exporter到各种存储介质上了。细心的小伙伴们发现了,OpenTelemetry并未直接实现Exporter之后的数据存储,而是交给遵循了OpenTelemetry协议的Jaeger、Prometheus、Zipkin等存储平台。通俗理解就是只要数据格式是遵循OpenTelemetry的上报,都可以进行数据标准化等处理,并被上报到任意遵循了OpenTelemetry协议的存储介质平台上进行下一步的遥测观察和统计。
OpenTelemetry内心OS:“我只是个协议而已,存储就交给别人来做吧,要实现存储这得是另外的价钱~~”。
四、OpenTelemetry的分布式追踪(Trace)实践
我们知道OpenTelemetry有几个方面的标准:分布式追踪(trace)、日志(logging)和度量(metrics)。这就意味着他可以用来做很多不仅仅是分布式追踪(trace)之外的事,比如K8s的监控,服务的监控等等。我们这里之所以当独讲分布式追踪(trace),主要是因为其不仅是OpenTelemetry的核心功能,在监控和分析微服务架构中的请求传播路径和性能问题上目前也是普遍流行的解决方案。
那么我们如何基于OpenTelemetry实现链路追踪呢?
我们先来看OpenTelemetry官网的介绍。
光说不练假把式。于是我们以PHP为例来一步一步详细操作下来简单demo实践一下。其他语言同理。
1、准备PHP环境
它说PHP版本要求至少7.4+,而如果希望0代码非入侵式的接入PHP版本至少要8.0+。
OpenTelemetry部分是支持无缝接入的,也就是非入侵式的服务监控和分布式追踪,当然如果你需要个性化地“埋点”自己的服务调用链路情况,那就可以自己手动用代码实现了(代码侵入式)。
由于小马的本地已经安装了PHP相关环境,特意检查了下版本号符合条件,环境准备完毕。
2、下载SDK
参考官网案例,我们进入代码目录下,运行composer命令安装SDK依赖,composer.json文件需要安装的依赖包配置参考如下。
但这里需要注意,市面上开源SDK实现可能会有很多,不管你依赖于哪个SDK,只要遵循OpenTelemetry协议即可。
{"name": "vendor/m.server3","description": "description","minimum-stability": "stable","license": "proprietary","authors": [{"name": "小马过河R","email": "email@example.com"}],"require": {"slim/slim": "^4","slim/psr7":"^1","nyholm/psr7": "^1","open-telemetry/opentelemetry": "*","open-telemetry/api": "*","open-telemetry/sdk": "*","symfony/http-client": "^5.4","guzzlehttp/promises": "^2.2","php-http/message-factory": "^1.1","php-http/httplug": "^2.4"},"config": {"allow-plugins": {"php-http/discovery": true}}
}
3、编写实例代码
进入代码目录下,创建index.php文件。
为了验证,我们先将TRACES输出到console查看。
putenv('OTEL_SERVICE_NAME=demo1');
putenv('OTEL_PHP_AUTOLOAD_ENABLED=true');
putenv('OTEL_TRACES_EXPORTER=console');//console otlp
putenv('OTEL_METRICS_EXPORTER=none');
putenv('OTEL_LOGS_EXPORTER=console');
#putenv('OTEL_EXPORTER_OTLP_PROTOCOL=grpc');
#putenv('OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318');//http:4318,grpc:4317
#putenv('OTEL_EXPORTER_OTLP_HEADERS=');
#putenv('OTEL_PROPAGATORS=b3,baggage,tracecontext');use OpenTelemetry\API\Globals;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;require_once __DIR__ . '/vendor/autoload.php';$tracer = Globals::tracerProvider()->getTracer('demo-tracer-name');$app = AppFactory::create();$app->get('/rolldice', function (Request $request, Response $response) use ($tracer) {$span = $tracer->spanBuilder('manual-span')->startSpan();try {$span->setAttribute('user_id', 12345);$result = random_int(1, 6);$response->getBody()->write(strval($result));$span->addEvent('rolled dice', ['result' => $result])->end();return $response;} catch (Exception $e) {$span->setStatus($e->getCode(), $e->getMessage());$span->end();$response->getBody()->write('exception');return $response;}});$app->run();
4、run起来
我们在代码目录下执行php -S localhost:8080
命令,让程序监听8080端口。
回到浏览器访问路由http://localhost:8080/rolldice
。我们看到了响应返回。
而console如约打出了日志信息。
好了,我们的demo实现完毕了,看起来超级简单,对吧。
5、otlp协议上报到存储介质平台
我们刚刚为了方便演示,把日志输出在console,但是实际生产场景中肯定不是这样的,那如果我要上报到诸如Jaeger、Prometheus、Zipkin等的后端系统或存储平台,要如何处理?很简单,修改配置即可。详细的可以参看官方的配置介绍文档。小马这里主要拎几个重要的配置项来介绍。
//something todo...
putenv('OTEL_TRACES_EXPORTER=otlp');//改成otlp
#putenv('OTEL_EXPORTER_OTLP_PROTOCOL=grpc');//默认http
putenv('OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318');//填写ENDPOINT上报地址,http:4318,grpc:4317
putenv('OTEL_EXPORTER_OTLP_HEADERS=');//如果有些平台是要求传鉴权token,可以通过HEADERS透传//something todo...
好了,这就改完了,重新run起来。
在平台你将看到如下类似效果(由于信息敏感小马就不贴自己实验的截图啦),日志信息将比console展示更完整和丰富。
当然,至于TRACES相关的知识点以及如何合理规划设置span不是本文重点,小马这里就不再赘述啦。
相关文章:
基于OpenTelemetry的分布式链路追踪Trace实现(PHP篇)
目录 引言一、OpenTelemetry是一套可观测性标准协议二、分布式追踪(Trace)是OpenTelemetry的核心功能之一三、OpenTelemetry的架构原理四、OpenTelemetry的分布式追踪(Trace)实践1、准备PHP环境2、下载SDK3、编写实例代码…...
电气工程中漏源电压Vds的平台电压是什么?
在MOSFET(金属 - 氧化物 - 半导体场效应晶体管)中,漏源电压 VDS 的平台电压是其输出特性曲线中的一个关键概念。 定义 在MOSFET的输出特性曲线里,当器件工作于饱和区时,漏源电流ID对漏源电压VDS的变化不太敏感&…...
第35周Zookkeeper+Dubbo Dubbo
Dubbo 详解 一、Dubbo 是什么 官网与定义 Dubbo 是一款高性能、轻量级的开源服务框架,其官网为 double.apache.org,提供中文版本(网址含 “zh”)。 核心能力 Dubbo 具备六大核心能力: 面向接口代理的高性能 RPC …...
allegro出gerber时,单击Artwork并没有弹窗的问题
使用allegro出gerber时,有时点击 Artwork图标并未如愿以偿的弹出窗口。。。 可按下面尝试恢复,注,删除前可先备份该两支文件。。。 看时间戳,删除最近的下面标红两支文件即可。...
【神经网络与深度学习】VAE 中的先验分布指的是什么
VAE 中的先验分布是什么? 在 变分自编码器(VAE) 中,先验分布指的是对潜在空间中随机变量的概率分布假设。通常情况下,VAE 设定潜在变量服从 标准正态分布 ( N(0, I) ),其中 ( 0 ) 代表均值为零的向量&…...
信息革命对经济、货币体系及权力结构的颠覆性影响
一、地理束缚的瓦解与权力转移 生产要素去实体化 思想、知识与数据取代实物资产成为核心价值来源,光速传播特性使经济活动突破物理边界。跨境远程医疗、跨国虚拟企业等新形态挑战传统管辖权概念,政府难以通过地域垄断攫取超额收益。 管辖权竞争白热化 …...
leetcode文件级全局变量会在测试用例之间相互影响
背景:在做Leetcode 743使用文件级全局变量idx,不同用例之间idx一直在。参考leetcode的文档: 解决办法:我选择在核心函数的开头,加入初始化代码(每次用例调用都会重新初始化至原始状态)...
如何查看电脑显卡配置参数 一文读懂
显卡是电脑的重要硬件之一,尤其对于游戏玩家、设计师、视频编辑等用户来说,显卡的性能直接影响电脑的使用体验。如果您想知道电脑的显卡信息,或者打算升级显卡,那么了解如何查看显卡配置是非常必要的。本文将为您提供多种简单实用…...
获取嵌入(Embeddings)的方法与实践
获取嵌入(Embeddings)的方法与实践 摘要 本文详细介绍了获取嵌入(Embeddings)的多种方法,包括降维技术和神经网络训练方法。通过具体的实例和可视化展示,我们将了解如何将高维数据转换为有意义的低维表示,以及如何根据具体任务需求选择合适…...
【国产化】在银河麒麟ARM环境下离线安装docker
1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍,但是说的很简单,网址:Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式,但是没有kylin的,所以在此记录一下。 在安装过程中也遇到了些…...
基于大模型的子宫平滑肌瘤全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术原理与应用现状 2.1 大模型概述 2.2 相关技术原理 2.3 医疗领域应用现状 三、子宫平滑肌瘤术前预测 3.1 预测指标与数据收集 3.2 大模型预测模型构建 3.3 预测结果分析与应用 四、子宫平滑肌…...
SpringBoot 集成 Ehcache 实现本地缓存
SpringBoot 集成 Ehcache 实现本地缓存_springboot ehcache-CSDN博客...
linux下MySql的安装与配置
一键三联,把mysql的安装与配置也写了,供各位参考。 --------------------------------------MySql的安装与配置-------------------------------------- 1 将下载的 压缩包解压到指定目录 tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 卸载…...
普通IT的股票交易成长史--20250507晚复盘
声明:本文章的内容只是自己学习的总结,不构成投资建议。价格行为理论学习可参考简介中的几位,感谢他们的无私奉献。 送给自己的话: 仓位就是生命,绝对不能满仓!!!!&…...
准确---Typora配置Gitee图床并实现自动图片上传
下载地址:https://github.com/Molunerfinn/picgo/releases 安装就直接下一步,下一步就行 安装完以后然后回到Typora上偏好设置指定一下路径 默认是 C:\Program Files\PicGo\PicGo.exe 并且还需要选择规则 接下来就需要去PicGo上面配置了 配置之前需要去…...
力扣热题100之回文链表
题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 代码 方法一: 将链表值复制到数组中,在数组中判断是否是回文列表 # Definition for singl…...
基于Node.js的Web爬虫: 使用Axios和Cheerio抓取网页数据
1. 环境准备 在开始之前,请确保计算机上已安装Node.js mkdir webScraper cd webScraper npm init -y npm install axios cheerio expressaxios: 用于发送HTTP请求。cheerio: 用于解析和操作HTML。express: 用于创建Web服务器。 2. 创建爬虫 在文件夹中创建一个新…...
如何用命令行判断一个exe是不是c#wpf开发的
在powershell下执行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路径") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…...
SpringBoot项目接入DeepSeek
在这个demo当中,我使用的是JDK8Spring Boot 2.6.x,下面直接给大家附上完整的代码。 一、项目结构 deepseek - demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── mzl/ │ │ │ …...
C++ lambda表达式的捕获原理
目录 C Lambda表达式捕获机制的详细原理分析Lambda的本质机制关键实现细节特殊捕获方式[ ]空捕获[&]全引用捕获[]全值(拷贝)捕获混合捕获[,&variable]拷贝及部分引用捕获[&,variable]引用及部分拷贝捕获 显式捕获[variable]拷贝捕获部分变量[&variable]引用捕获…...
修改图像分辨率
在这个教程中,您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始,逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先,你需要确保你的Python环境中…...
【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)
刑事案件数量是衡量一个地区社会治安状况的重要指标。近年来,我国各地在推进法治建设和社会治理现代化的背景下,刑事案件的数量呈现出明显的区域差异和年度波动,通过年度案件数据,可以反映出社会安全水平的变化趋势,为…...
ABAP使用GET_TAX_PERCENTAGE 函数取税率
ABAP使用GET_TAX_PERCENTAGE 函数取税率 今天在做含税价的时候查到的,记录一下。S4 Hana 的环境。 先DATA一个 ftaxp GET_TAX_PERCENTAGE 函数,实例为采购订单进项税。 OK,搞定。...
鞅与停时 - 一种特别的概率论问题
讨论一个有趣的概率问题: [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题,考虑一直无规律随即打字的猴子,键盘上只有A-Z一共26个字母,对于一个特定的字符串 S S S : ABCABCAB ,能否在有限的打…...
Android 有线网开发调试总结
Android 有线网开发调试总结 文章目录 Android 有线网开发调试总结一、前言二、有线网开发1、开关2、相关日志(3)相关广播(4)demo示例 三、其他1、Android 有线网开发调试小结2、Android13 有线网开关研究3、Android9、11 有线网络…...
.net在DB First模式使用pgsql
nuget要安装: Npgsql.EntityFrameworkCore.PostgreSQL Microsoft.EntityFrameworkCore.Tools vs2022-->工具-->nuget包管理器-->程序包管理器控制台-->输入命令: Scaffold-DbContext "Hostlocalhost;Databasemydatabase;Usernamemyu…...
Spring Boot 中如何解决 CORS 问题(详解)
在前后端分离的开发模式中,前端调用后端接口时,经常会遇到 跨域资源共享(CORS) 的问题。Spring Boot 作为常用的后端框架,提供了多种方式来优雅地解决这个问题。本文将全面介绍 Spring Boot 中处理 CORS 的常见方法、原…...
深度学习:智能车牌识别系统(python)
这是一个基于opencv的智能车牌识别系统,有GUI界面。程序能自动识别图片中的车牌号码,并支持中文和英文字符识别,支持选择本地图片文件,支持多种图片格式(jpg、jpeg、png、bmp、gif)。 下面,我将按模块功能对代码进行分段说明: 1. 导入模块部分 import tkinter as tk…...
STM32开发printf函数支持
1、printf函数支持 1、避免使用半主机模式:两种方法:微库法、代码法 2、实现fputc函数:实现单个字符输出 2、半主机模式简介 用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机 简单说:就是通过仿真器实…...
解决 Chrome 与 Chromedriver 版本不一致问题的方法
目录 常见错误处理 处理方案: 1. 自动版本匹配方法 使用 webdriver-manager 库(推荐) 2. 手动版本管理方法 检查并匹配版本 3. 版本兼容性解决方案 使用兼容性表 4. 自动更新策略 定期检查更新脚本 5. Docker 容器化方案 最佳实践建…...
CPU的基本认识
为大家介绍CPU的基本概念,例如:CPU的型号认识、什么是时钟周期、物理核和逻辑核、缓存、TLB缓存的概念,可以帮助大家对cpu有个概念性的认识,选择电脑的时候可以看懂CPU的参数和理解基本原理。 CPU的基本认识 个人CPU型号介绍工作频…...
UGUI如何使用EventTrigger
前言 在 Unity 的 UGUI 系统中,EventTrigger 是一个强大的组件,允许开发者监听和处理多种 UI 交互事件。以下是详细的使用方法、示例代码、优缺点分析以及注意事项。 一、EventTrigger 基本用法 1. 添加 EventTrigger 组件 在 Unity 编辑器中选中 UI 对象(如 But…...
101alpha_第4个
(-1 * ts_rank(rank(low), 9)) 这里的low是每日的最低价。 各函数及整体含义解释 1. rank(low) 在金融分析场景里,low 通常代表股票在每个交易日中的最低价。rank(low) 会对一段时间内的最低价数据进行排序,并为每个数据赋予一个排名。比如,…...
5月13日观测云发布会:这一次,我们不只是发布产品
01|为什么举办这场发布会? 在生成式 AI 席卷一切、业务系统愈发复杂的时代,我们发现: 传统的监控观测已经无法满足企业对性能、安全、智能的统一诉求;每一个企业,都在经历从“看得到”到“看得懂”的跃迁&…...
【IP101】图像分割技术全解析:从传统算法到深度学习的进阶之路
图像分割详解 ✂️ 欢迎来到图像处理的"手术室"!在这里,我们将学习如何像外科医生一样精准地"切割"图像。让我们一起探索这个神奇的图像"手术"世界吧!🏥 目录 📑 1. 图像分割简介2. 阈…...
华为设备链路聚合实验:网络工程实战指南
链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...
C24-数组
数组的引入:方便对同一类型的数据进行管理(一个班级里的45个同学、一个篮子里的12个苹果)数组的定义: 数据类型 数组名[常量表达式(也就是元素的个数)];int a[10]; //这里定义了一个能存放10个元素的整形数组数组初始化 完全初始化 int arr[3]{5,6,8};部分初始化 int arr[10]{…...
Vue 项目中长按保存图片功能实现指南
在移动互联网应用中,用户常常有保存页面特定内容为图片的需求,比如保存二维码、海报等。在 Vue 项目开发中,如何实现长按保存图片的功能?本文将结合具体代码,详细讲解在 Vue 项目中通过长按操作保存图片的技术实现与应…...
行业先锋:六款产品的实战表现
行业先锋:六款产品的实战表现 北京先智先行科技有限公司,销售着“先知大模型”、“先行AI商学院”“先知AIGC超级工场”这三个旗舰产品,在行业内崭露头角。旗下的先知A1、先知大模型等更是备受关注。 先知大模型,作为核心产…...
RS485与Profibus网关自由口数据互换技巧
RS485与Profibus网关自由口数据互换技巧 兴达易控RS485转Profibus网关在自由口模式下的数据互换,是工业自动化领域内一项关键的技术应用,它实现了不同通信协议设备之间的有效连接与数据交换。在现代工业生产中,众多设备和系统往往采用不同的…...
java复杂度,包装类,泛型解析
如何衡量代码的好坏? 评价代码的好坏我们使用算法效率来判断,而算法效率分两种: 算法效率: 第一种是时间效率,第二种是空间效率,时间效率被称为时间复杂度,⽽空间效率被称作空间复杂度。 时间…...
K8S安装部署(v1.27.6)
一、机器配置 系统版本主机名IP基于服务centos 7.9k8s-master192.168.163.104dockerk8s-node1192.168.163.105k8s-node2192.168.163.106注:以上3台机器都是2C4G的虚拟机,仅供测试使用 docker部署可以参考:docker 部署 二、其他环境配置 #1、关闭防火墙 systemctl stop fir…...
Debezium BinaryLogClient详解
Debezium BinaryLogClient详解 1. 类的作用与功能 1.1 核心作用 BinaryLogClient是Debezium中负责与MySQL服务器建立和维护Binlog连接的核心类,主要功能包括: 连接管理:建立和维护与MySQL服务器的Binlog连接事件监听:接收和处理Binlog事件心跳保活:维护连接活跃状态断线…...
Leetcode 刷题记录 09 —— 链表第三弹
本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答,01~07为C语言,08及以后为Java语言。 01 合并 K 个升序链表 /*** Definitio…...
加速项目落地(Trae编辑器)
目录 vscode安装python支持 vscode常用插件 Trae编辑器 两个界面合成 补充(QT开发的繁琐) AI编程哪家强?Cursor、Trae深度对比,超详细! - 知乎 Trae兼容vscode的插件,我们可以先在vscode里面装好再一…...
vue3的页面跳转方法汇总(路由跳转,组件跳转)
1.组件跳转 使用router-link组件进行组件导航(无需引入该组件,可直接使用),to后面跟组件路由。如果想要在当前页显示跳转的组件,可以通过<router-view>来显示当前路由匹配到的组件,也可以不使用<r…...
C++回顾 Day5
自实现string完整版 my_string.h using namespace std; class mystr{public://mystr();mystr(const char * new_str nullptr);mystr(const mystr & another);char * c_str();~mystr();mystr& operator(const mystr & another);mystr operator(const mystr &…...
OpenMVS 的编译与运行
Title: OpenMVS 的编译与运行 文章目录 I. 编译与准备1. 获得源码2. wiki3. 退出 Conda 环境4. 编译5. 数据准备 II. 命令了解1. 稠密重建 DensifyPointCloud2. 曲面重建 ReconstructMesh3. 网格优化 RefineMesh4. 纹理贴图 TextureMesh III. 命令运行1. 运行稠密重建2. 运行网…...
@Transactional注解的使用
目录 一.介绍 1.使用Transactional注解的位置 2.Transactional注解的作用 二.举例 1.需求场景 2.做法 3.效果展示 三.简单总结 一.介绍 1.使用Transactional注解的位置 我们在Java开发中,一般在service层的方法上,使用Transactional注解&#x…...
路由器NAT回流踩坑
路由器 H3C GR-3000AX-U 不支持NAT回流 核心问题定位 外网访问 ✅ 非Docker服务(直接运行在宿主机上的服务)可以访问❌ Docker服务 无法访问 内网访问 ✅ 内网IP访问(无论Docker还是非Docker)正常❌ 内网通过公网IP访问 全部失败…...