高德终端技术总结:高可用架构如何练成?
前言
高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用、高性能、高效率”的技术目标。
2024年,国内外都出现过大的互联网平台的崩溃性故障,数字经济大发展的时代,这些常用的基础平台出现大故障,会迅速造成舆情和巨大的业务损失。「系统稳定性」问题一定要警钟长鸣,不可大意。
稳定性工作的性质
稳定性工作属于「流水不腐,户枢不蠹」。它和做业务的维度大不相同:稳定性工作一定要保持踏实的工匠精神、不能有丝毫的夸张或隐藏。既要做好系统的架构设计夯实地基,也要老老实实的去做大量日常繁琐的事情,还要有“功成不必在我”的心理素质。
对高德超稳定性工作的要求
防架构腐化|历史上的死角和垃圾一定要坚决清理;
全链路实战演练|平常多流汗,战时少流血。摒弃侥幸心理:你担心的一定会发生;
多云架构支持| 任何基础设施都会出现意外。架构要「可依赖、可扩展、简单」。
2024年国庆节,高德地图的用户量突破新高。这么一个超级APP,在业务快速演进、产品体验不断完善、智能技术持续加持的压力下,如何保持“启动秒开、瘦安装包、低网络流量”,同时还要考虑“多系统、多设备、多语言(国际化)”的业务拓展要求,是一道非常难解的技术课题。现在把这几年我们在终端方面的解题思路做个整理,分享经验,以期同行批评指正,大家互相取经、教学相长,共同为中国数字经济的持续发展添砖加瓦。
背景
随着多年来快速发展,高德地图已成为了国民级超级应用,终端也不可避免面临超级应用的通用效率难题,即如何高效地支撑多系统、多设备、多语言和多业务的快速发展。高德地图终端也面临着其独有的性能与稳定性难题,由于出行导航使用场景的特殊性,用户往往时间比较紧迫,对交互耗时的敏感度非常强,同时稳定性也必须保证交通安全级的高可用。
因此我们在全团队提出了“高可用、高性能、高效率”三大技术目标,发起了技术攻坚。经过全体团队的不懈努力与磨练,我们终于做到了:
「高可用」溃率达到十万分水位,并持续稳定保持低水位;
「高性能」包体积与流量双降,包体积减少近一半;启动速度实现“秒开”,达到业内领先水平;
「高效率」通过“一体化容器架构”的结构化升级,我们实现了一套架构支撑多系统、多设备、多语言和多业务,支撑国际图上线,同时在业内率先支持鸿蒙 NEXT 系统。
高德终端团队“不仅要把问题解决了,方式上更是要从技术架构和机制层面根本解题” ,这篇总结与各位技术伙伴分享与探讨过程中的探索与实践,希望能有所助益。
架构解题
过去,终端技术治理的惯性更倾向于遇题解题、单点局部运动式解题。但随着持续发展,技术债务逐渐累积,这种方式带来的成本越来越高,而且效果会反复恶化,经常出现“按下葫芦起了瓢”的情况。因此我们思考需要从这种“局部优化”到“结构性简化”的转变,用一套架构统一支撑多系统、多设备、多语言,才能系统性解决面临的问题。围绕这一方向,我们从顶层整体设计并落地了一体化容器架构:
整体设计统一容器,向下统一封装适配多环境(包括多设备、多系统、多语言、多网络、多规则),解决业务需要各自分别高成本适配各种环境的问题;向上对业务提供跨平台、可复用、一致性的一体化地图终端能力(包括Engine、UI、Service、IO、Framework),支撑多业务的快速迭代。
在技术栈设计上,除调用系统平台服务的部分使用原生语言(Java//OC//ArtTS)外,其他均使用跨平台语言,来实现最大限度的跨平台,其中对于高性能要求的能力(如地图引擎、基础库)使用C++实现,而对于高效率要求的能力(如前端页面)则使用JS实现。这样在满足性能的要求下,实现一码多端的高效跨平台开发。
篇幅所限,这里仅从启动秒开、包体积瘦身、多系统、多设备、多语言等几个方面,具体介绍我们的思考与实践。
启动秒开:按需加载框架
过去,很多能力只管功能完成,而性能问题往往被推到上线前做决策,结果常常“带伤”上线。一旦上线,这些遗留问题因为优先级低,很难再被安排优化,即上线即终点,管生不管养,这就导致问题越积越多,最后只能运动式解决,再周而复始。这就能理解为什么运动式优化,优化之后又快速反弹的原因。无论是启动性能、包体积还是存储,都存在类似的问题。
为此,针对启动性能,我们在App上制定了“秒开”的高目标,这个目标回头来看也极具挑战性,这样也倒逼我们打破过去路径依赖的思维模式,实现结构性的简化。此前整个端的架构是,所有业务模块都是在启动阶段无差别的进行初始化,比如音乐模块,即使用户不开启音乐,也会在应用启动阶段进行加载初始化。这就导致启动阶段,随着时间业务发展,越来越慢,而且每次治理后很快就会反弹。因此,终端团队通过按需加载框架的设计,一方面,实现从“全功能加载”到“即用即加载”的结构性简化,根据用户实际需求动态加载模块,减少资源浪费和性能开销。另一方面,重新定义首屏启动模块,对启动模块极致简化,同时在结构上解耦启动与具体业务,这样也避免了启动性能因后续业务迭代而恶化,做到了长治久安。
从结果看, 在低端机(17年 PIXEL手机)上,都能够实现启动秒开。同时,运行一年以来,在业务快速发展下,耗时持续保持平稳。
包大小瘦身&流量降本
包大小重点不只是反映体积大小的表象,更重要的是反映架构臃肿,代码债高筑,稳定性、性能和效率风险成比例上升的问题。这就像减肥,过分胖了不止是形象问题,他是一种身体不健康表征,隐含着心脑血管并发症等整体机制问题。同样包大小优化表象目标上是降体积,根本目标是整体的技术架构健康,是对整个应用各个已有模块进行架构简化、瘦身增肌,同时长序地对新增模块进行良好的架构设计。因此,在具体落地过程中我们关注两个方面:
对于降体积,上云是一个常用手段,但上云很容易带来流量成本上涨,所以从目标上我们降体积和降流量并举,避免姿势变形,拆东墙补西墙。并从整体架构上提供端云一体的全栈按需加载能力和降流量能力,在云端通过数据压缩,继承复用,差量更新进行数据优化,来减少流量;在通道上,通过升级ODR和xCDN能力,实现流量降成本;在终端通过全技术栈按需加载能力,降低包体积,并通过预加载、静默、差量加载来保证包大小降低的同时,用户数据加载体验不受损。
用户体验是综合题,包括流畅、稳定、存储、能耗等,一项项见题解题,很容易治标不治本,根本上需要产研架构设计的机制和素养的形成。所以,在推动包大小优化过程中,主要的不是包大小指标,而是更关注是否有架构设计以及设计的合理性,长期全局的架构设计要求从一开始业务设计判断上就融合考虑。所以在平台上,终端团队建立数据管控机制,从一个需求开始到下线全生命周期中每个环节中,都要保证架构的前置和全局设计。
多系统:鸿蒙高性能CAPI框架
随着设备及系统不断增多,每个系统都有自己的生态开发语言与服务特点,如果每个系统单独开发势必成本会越来越大,高德终端团队一直思考如何做到用一套代码跨平台运行来支持多系统产品。我们在各系统之上设计封装了系统服务与交互组件的平台层,基于自研的与地图深度融合的跨平台AJX前端引擎,搭建了高性能的跨平台容器环境,支持业务一次JS语言开发、多系统多设备运行。正得益于此,我们能够鸿蒙系统快速适配,在业内率先支持鸿蒙 NEXT系统。
在鸿蒙系统适配过程中,遇到了一些技术难点。鸿蒙提供的原生开发方式是ArkUI,因为其动态语言的特性,导致用其来开发平台层组件时,整体性能不理想。于是我们联合华为推进性能更高的C语言的CAPI方案演进,CAPI是ArkUI的底层绘制接口,由C语言编写,具有更好的性能以及系统一致性的体验。但应用CAPI方案也存在一些问题:一个是组件丰富度不全;另一个是一些三方模块比如lottie是以ArkUI方式提供的,代码上万行,如果翻译到CAPI上成本巨大;三是CAPI有很多枚举、万能接口,直接用成本高,易出错。我们设计了通用UI引擎,封装抽象一体化的UI套件,提供给上层开箱即用,同时,向下也支持灵活扩展其他UI库。另外建设HybridView层将CAPI不支持的复杂组件桥接到ArkUI层,在保证整体性能的同时,避免了CAPI组件不足影响业务快速迭代的问题。
多设备:多屏合一框架
由于地图应用场景的广泛性,高德地图终端不但需要支持多尺寸手机、平板、手表等移动设备,还需要支持各种车机投屏。各设备单独定制适配与维护会消耗大量人力成本,因此,整体设计了多屏合一框架,封装统一投屏接口层,组合地图面、标准化控件、状态控制一体的 地图UI 设计,通过自适应布局能力让一套方案能够支持多种投屏协议以及设备屏幕。同时,增强配置化设计,支持不同设备屏幕尺寸、屏幕方位下的灵活扩展、动态加载和高效定制。
(多屏合一&探路合一)
多语言:配置化框架
随着高德国际化的发展,需要在不同国家提供不同功能与语言,甚至还需要满足包体积、不同平台的要求,因此整体上设计了一套配置化框架来实现多应用形态,满足国际图、包体积、多平台的不同需求。
配置化设计由两种通道组成,一种是将当前语言标识上传的服务,服务根据语言不同下发相应数据,端侧根据数据进行展示,从而实现功能的配置,这种通道适用于类似信息瀑布流的服务数据驱动场景。另一种则对于功能逻辑存在于终端本地(如启动、导航链路)的场景,通过对UI组件标签进行不同语言环境下的配置,根据配置进行相应展示,实现端侧 Feature 化的配置。两种通道相互协同,能更灵活应对全球化场景下的多语言、多功能需求。
感谢
这一年,我们在技术探索和业务支持上不断突破,也在架构师机制建设中迈出扎实一步。高德内部一直强调“人人都是架构师” ,技术同学如果只把需求堆上线,不做技术架构,就没法做好技术。无论面对复杂的技术挑战,还是多样化的业务目标,我们在攻克一个个难题的同时,也清楚地知道,每一次进步都离不开全员的共同努力。
衷心感谢高德各团队的每一位成员,是你们的努力和专注,让我们一次次攻克难关。同时也感谢集团合作方在技术方面的交流学习。
这是一场协作的胜利,也是一场架构与机制的实践成果,感谢每一位参与者的付出!
相关文章:
高德终端技术总结:高可用架构如何练成?
前言 高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用…...
STM32八股【3】------RAM和片上FLASH
1、RAM和FLASH构成 1.RAM ┌──────────────────────────┐ │ 栈区 (Stack) │ ← 从RAM顶端向下扩展(存储局部变量、函数调用信息) │--------------------------│ │ 堆区 (Heap) │ ← …...
Apache Doris
Apache Doris介绍 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场…...
Debezium介绍
1.什么是Debezium Debezium 是一个开源的分布式平台,用于捕获数据库的变更事件(CDC,Change Data Capture)。它能够实时捕获数据库中的行级更改,并将这些更改作为事件流发送到消息中间件(如 Apache Kafka&a…...
奇迹科技:蓝牙网关赋能少儿篮球教育的创新融合案例研究
一、引言 本文研究了福建奇迹运动体育科技有限公司(简称‘奇迹科技’)如何利用其创新产品体系和桂花网蓝牙网关M1500,与少儿篮球教育实现深度融合。重点分析其在提升教学效果、保障训练安全、优化个性化教学等方面的实践与成效,为…...
Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用
散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…...
计算机网络层超全解析:从IP协议到路由算法
🌐 (专业详解生活化类比,逻辑一镜到底) 📖 网络层的核心使命 核心任务:在不同网络间为数据包选择最佳路径,实现端到端通信。 类比:快递公司总部(网络层)根据…...
RoboVQA
RoboVQA:面向机器人技术的多模态长时推理 摘要 我们提出了一种可扩展、自下而上且具有内在多样性的数据收集方案,适用于中长时高级推理任务,其吞吐量比传统的自上而下分步收集方法高2.2倍。通过在3栋办公楼内使用多种实体(机器人、人类、使用抓取工具的人类)执行任意用…...
javascript语法入门
一、变量声明 在JavaScript中,可以使用var、let和const来声明变量。 javascript var name "张三"; let age 20; 二、数据类型 JavaScript中有7种基本数据类型:undefined、null、boolean、string、symbol、number,以及object。…...
前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!
🚀 前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” 🌟 嘿,技术冒险家们!👋 今天我们要聊一个开发中常见的“坑”:前端传来的 JSON 参数字段名和后端对象字段名不一致,会发生…...
Java——ArrayList集合
ArrayList:基于动态数组实现,支持随机访问,适合频繁的随机访问操作,但在插入和删除元素时性能较差。 技术层面介绍 所属类库:ArrayList 位于 java.util 包中,它实现了 List 接口,因此具备 Lis…...
基于python+django的图书借阅网站-图书借阅管理系统源码+运行步骤
该系统是基于pythondjango开发的在线图书借阅管理系统。系统适合场景:大学生、课程作业、系统设计、毕业设计。 演示地址 前台地址: http://book.gitapp.cn 后台地址:http://book.gitapp.cn/#/admin 后台管理帐号: 用户名&…...
Flutter运行错误:UG! exception in phase ‘semantic analysis‘
最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下: 执行命令查看版本信息: flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…...
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制 在现代办公自动化的浪潮中,文档处理是一项不可或缺的任务。Python作为一种强大的编程语言,提供了丰富的库来简化这些任务。其中,python-docx库是处理Word文档的有力…...
【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播,计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …...
HTTPS
目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL,TLS(HTTP之下,传输层之上)加密/解密安全协议,如果HTTP经过这个协议,对端也走…...
electron框架(4.0)electron-builde和electron Forge的打包方式
----使用electron-builder打包(需要魔法) --安装electron-builder: npm install electron-builder -D--package.json中进行相关配置: {"name": "video-tools","version": "1.0.0","main&quo…...
SaaS系统的销售微服务与权限微服务边界设计
在设计SaaS系统的销售微服务与权限微服务的边界时,需要结合领域驱动设计(DDD)和微服务拆分原则,确保高内聚、低耦合。以下是结合微服务架构原则、多租户SaaS需求及权限管理场景的完整设计方案,整合了权限服务与销售服务…...
Unity-AI-Deepseek生成的生成模型代码
结果 能用,不是很理想,从左到右,分别是body,眼睛,演睫毛,手指套(如果你知道这是什么)结果不是很理想 (下面代码已包含,修复的切线只能传Vector3参数,Unity2022测试) 你们帮我看看…...
Django REST Framework 请求封装源码解析与实现流程
版本说明: Django: V4.2.20 Django Rest Framework: V3.15.2 一、核心封装流程示意图 #mermaid-svg-qXJLIa9Bx1TCiPSN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qXJLIa9Bx1TCiPSN .error-icon{fill…...
简介PyCDE:Python CIRCT Design Entry
简介PyCDE:Python CIRCT Design Entry 引言 在硬件设计和验证领域,随着设计复杂性的增加,传统的方法往往难以满足现代设计的需求。PyCDE(Python CIRCT Design Entry)作为CIRCT项目的一部分,旨在为硬件设计…...
Python实现deepseek接口的调用
简介:DeepSeek 是一个强大的大语言模型,提供 API 接口供开发者调用。在 Python 中,可以使用 requests 或 httpx 库向 DeepSeek API 发送请求,实现文本生成、代码补全,知识问答等功能。本文将介绍如何在 Python 中调用 …...
考研课程安排(自用)
文章目录 408数据结构(王道)计算机组成原理(王道)操作系统(王道)计算机网络(湖科大版) 数学一高等数学(微积分)线性代数和概率论 408 数据结构(王…...
Mybatis操作数据库(注解+xml两个方式)
文章目录 1.个人回顾2.关于mybatis注解的说明3.字段和属性不匹配的解决方案3.1第一个方案3.2第二个方案3.3第三个方案 4.xml路径配置5.xml里面的字段映射 1.个人回顾 刚刚翻看了一下自己的这个之前写的博客,上一次和这个javaee相关的博客还是去年写的,也…...
文心快码 使用体验与介绍
一、文心快码的核心作用 文心快码是百度基于文心大模型开发的智能代码助手,核心价值包括: 代码生成与补全 通用开发:根据注释生成HTML/CSS/JS、Python、Java等代码C专项:生成类定义、STL容器操作、智能指针代码(如st…...
区块链交易
文章目录 交易准备合约和代码逻辑合约compile.jsindex.js 运行 交易 项目来自https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/basic/02-web3js-transaction/README-cn.md 本项目包含对交易进行签名,发送,接收交易回执,验证…...
LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java
题目:找到两个相交列表的起始点,如图c1开始为A和B两个链表的相交点 举例1:8为两个链表的相交点。 注意:相交不止是数值上的相同。 举例2:2为相交点 举例3:没有相交点 解题思路: 相交证明最后一…...
体育直播模板nba英超直播欧洲杯直播模板手机自适应
源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…...
Android Compose 图标按钮深度剖析:从源码到实践(五)
Android Compose 图标按钮深度剖析:从源码到实践 一、引言 在现代 Android 应用开发中,用户界面的交互性和美观性至关重要。图标按钮作为一种常见的 UI 元素,以其简洁直观的特点,在提升用户体验方面发挥着重要作用。Android Com…...
【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍
【Dive Into Stable Diffusion v3.5】系列博文: 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇:Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...
WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)
1. 什么是 WPF 布局舍入? 在 WPF 开发过程中,可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素(DIP, Device Independent Pixels),在不同 DPI 设置下,UI 元…...
前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer
使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件) 方案1:获取选择文本内容的最前面的字符坐标的位置(这种写法会导致如果选择超出…...
Mongodb分片模式部署
MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…...
「一起学后端」Nest.js + MySQL 查询方法教学文档
Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询(JOIN)2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...
基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【学习笔记】LLM推理与部署
文章目录 1 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)2 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)3 [LLMs serving] openrouter & vllm host LLM 推理服…...
leetcode-134.加油站
油箱容积无限,要求能环岛,说明总共加起来的油是不少于消耗量的,这是唯一一个决定能否环岛的变量,只要油量够,那么必定有一段路是攒油的路,它供给后续的消耗,使得油箱总是不空。 如果油量足够&am…...
companion object和object 从kotlin转java分析
说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量,静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量,静态MyClass2对象, 一 companion object 使用 kotlin转java pa…...
检索增强生成(2)本地PDF 本地嵌入模型
from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...
关于TVS管漏电流的问题?
问题描述: 在量产的带电池故事机生产中,工厂产线测试电流时,有1台机器电流比正常机器大10mA左右。 原因分析: 1、分析电路原理图,去除可能出现问题的电压或器件(不影响系统),发现…...
2025前端面试题记录
vue项目目录的执行顺序是怎么样的? 1、package.json 在执行npm run dev时,会在当前目录寻找package.json文件,此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js 对…...
Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议
本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型,也涉及到一些相关注意点,欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像:docker pull ollama/ollama:latest 运行ollama 执行:docker run -d --res…...
.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar
示例代码下载:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi,开发人员需要新的策略来保持高效。本文探讨了这些变化,并介…...
C++——权限初识
权限初识 C中的访问权限主要分为三种: public 、 private 和 protected 。这些权限决定了类成员(包括数据成员和成员函数)的可访问性。以下是一个总结表格,说明了在不同情况下这些权限如何应用: 使用权限(…...
如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述
在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...
如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化
一、为什么选择 Linux 部署 FTP 服务器? FTP(文件传输协议)作为互联网最早的文件传输标准,至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链,成为搭建 FTP 服…...
C++——引用
目录 举个例子: 引用的基本特性 引用的定义语法如下: 1. 引用必须初始化: 2. 引用是别名: 3. 引用不能为空: 4. 引用不能重新绑定: 引用的使用场景 函数参数传递: 函数返回值…...
unity开发效率提升笔记
本文将记录提升Unity开发效率的若干细节,持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…...
VScode页面错误,可以编译C++20版本,但页面显示有错误的解决方案
问题回顾 学习信号量时使用到了C20版本的一些变量,可以正常编译和运行,但在编辑器上显示存在错误,如图所示 显示结果,提示命名空间std没有成员变量counting_semaphore,如图所示 解决办法 1、确保自己安装了C/C插件…...
[WEB开发] JDBC
一. JDBC基础 JDBC (Java DataBase Connectivity): 就是使用 java 语言操作数据库的一套API. JDBC本质: 一套标准接口, 规范各个数据库厂商实现这套接口, 提供驱动使用接口, 真正执行的是实现类 二. 实战 2.1 非预编译sql // 1. 注册数据库驱动Class.forName("com.my…...