极氪汽车云原生架构落地实践
云原生架构落地实践的背景
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
为快速响应用户的需求,例如缩短一辆车的制造周期、便捷平滑地升级汽车操作系统等,企业从产品到用户体验到商业模式都需要创新。然而消费互联网和传统产业发展的经验不足以完全满足产业互联网对成本、效率、质量等方面的高要求。云原生是一个确定性的技术发展趋势,能有效推动产业发展,驱动企业积极革新。极氪正持续投入,将云原生能力赋能到企业内的研、产、供、销、三电等更广泛的业务领域。
这些业务现状和云原生架构带来的核心能力不谋而合。 在极氪系统改造上云的过程中,围绕着云原生技术体系,推动极氪的各条业务线进行技术升级改造,加快数智化发展进程。在技术选型上,极氪始终遵循着 2 条原则:
一是全面拥抱开源开放的主流技术标准: 使用开源开放的主流技术标准,可以确保技术方案的成熟度,更便捷地从开发者社区获取技术资源和最佳实践,也能够帮助企业更好的招募技术人才。此外,这样的策略也避免了被封闭技术体系和特定云厂商所捆绑。软件技术的国产化以及自主可控,也是需要考虑的点。
二是尽可能利用云的价值: 将稳定性保障、底层技术实现、技术组件维护、弹性伸缩等非功能性需求尽可能交给云厂商解决,让技术团队将更多的精力投入到业务创新上。
这 2 个原则并不矛盾,相反,它们之间可以非常好的融合,这也是所有使用云计算的企业用户都值得借鉴的架构选型标准。接下来,我们将围绕微服务架构统一、应用运行高可用、应用发布治理进行展开,并以可视化数据分析系统、车联网数据采集、智能研发范式这三类业务场景,分享我们的云原生架构落地实践。
实践一:统一微服务架构
在统一微服务架构之前,极氪的各个业务单元多种技术栈并存,彼此之间相互通讯复杂度高,项目成员的交接往往要耗费巨大的精力,极大程度上阻碍了数字化转型的进展,因此微服务架构统一势在必行。
极氪经历了 2 年多时间完成了这一项艰巨的工作,虽然投入精力巨大,但收益是立竿见影的,而且可以持续发挥作用:不论是内部团队还是三方 ISV,在技术框架上都有统一的标准可以遵循,各团队共享技术栈后,研发效率成倍提升。
关系到未来多年的 IT 战略,在微服务架构的选型上,高开放性、高成熟度、高普及度这三条标准缺一不可,考虑到极氪以 Java 为主要开发语言,Spring Cloud Alibaba 就成为了微服务框架的最佳选择。
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。这些组件一部分以 SDK 的形式集成到代码中,一部分以中间件的形式独立运行,后者往往可以选择托管版云产品,以降低开发者的工作量。比如阿里云微服务引擎 MSE 就提升了开箱即用的注册配置中心 Nacos,以及云原生网关。
实践二:微服务架构高可用实践
极氪 APP 是我们和车主的沟通纽带,采用的是微服务架构。但是随着注册车主数量呈现出了爆发式的增长,用户的使用场景也不断扩大。在这个过程中,APP 的用户使用体验变得愈发重要,如何在用户规模高速增长的同时可以保证 APP 的稳定性、敏捷性, APP 的微服务开发效率如何保证,这些都给研发团队带来了一定的挑战。
1、高可用挑战
业务连续性差缺少容量规划
远程控车、在线地图、3C 商城等 APP 核心服务对业务连续性要求非常苛刻,均需保证 7*24 小时持续在线。特别是面临旺季销售活动、新车型发布、突发热点事件等情况, APP 面临着高并发大流量压力,经常会发生功能失效、页面打不开、延迟过高,甚至 APP 完全无法访问的异常,对用户体验造成严重影响。
功能版本发布迭代速度慢
随着用户场景需求的增加,越来越多的功能等待发布上线,对迭代频率的要求越来越高,但由于 APP 服务端缺少全链路灰度发布能力,为了保障业务稳定性,每次发布客户只能选择在凌晨的业务低峰期进行,开发、运维、测试同学苦不堪言,急需实现随时发版无损发布能力。
技术架构缺少整体设计
公司成立之初,为了实现 APP 快速上线,对于技术架构整体设计考虑不足,体现在业务间高度耦合、系统链路过长、技术实现标准不一、云产品选型不合理等诸多问题,例如通过调研发现某核心接口请求链路过长,导致延迟抖动率很高,影响用户使用体验。
研发团队意识到,随着业务发展的向好,这些挑战也会也越来越大。在业务快速发展中,既要保证好已有业务的稳定性,又要快速地迭代新功能,并且需要保证开发的效率并不会随着业务增长而大幅降低,毕竟存在团队招聘节奏跟不上业务发展的问题。总结来说,团队解决 APP 应用快速迭代演进的关键就是解决稳定性与效率的问题。
- 稳定性: 用户数多起来之后,系统的稳定性就显得比较重要,无论是用户在某段时间遇到异常报错增多,还是某一个功能点持续性地报错,再大到系统有一段时间完全不可用,这些都会影响产品在用户中的口碑,最后这种完全不可用的场景,甚至还可能成为微博等社交网络上的舆论热点。
- 效率: 随着用户的增多,相应的需求也越来越多,业务场景也越来越复杂,在这个时候测试可不是内部测试就能覆盖所有的场景,需要加大在测试上的投入。虽然功能需求越来越多,但是迭代的速度却要求越来越快,因为市场中已经有不少竞争者,大家竞争的一个关键就是速度,业务更需要跑得更快,开发节奏要快,测试节奏要快,发版节奏也要快。
针对以上问题,研发团队根据业务架构从流量入口到微服务再从全局视角进行微服务的系统优化与调优,围绕着成本、稳定性以及效率进行深入的微服务化探索。
2、业务链路入口升级
极氪架构中的网关架构并不一致,各种网关都起了一定的作用。我们可以从上图中看到流量网关、API 网关、微服务网关等众多网关存在,他们具备了安全(WAF)、API 管理、流量分发等作用,思考一下,如果一个请求链路经过多个网关,那么这个事情对成本与稳定性都有一定的挑战。
在这个时候 MSE 云原生网关出现在研发团队的视野中,云原生网关将流量网关(Kubernetes Ingress、Nginx)和微服务网关(Spring Cloud Gateway、Zuul 网关等)二合一,降低 50% 资源成本,同时缩短了请求时间,降低运维复杂度。
作为面向南北向的公网网关,使用 Waf 防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是将流量先接入 Waf 安全网关,过滤后再将流量转发给流量网关,最后到达微服务网关;那么升级云原生网关后,进一步需要思考的事情是,入口流量的安全能力是否还可以具备?
云原生网关通过内置 Waf 模块直接对接阿里云的 Waf 云产品,使得用户的请求链接只经过云原生网关就可以同时完成 Waf 防护能力,大大降低了网关的运维复杂度,图示如下:
网关作为链路流量的入口,除了安全能力之外,还承接着入口流量/容量的管理、高可用等职责。
3、运行时高可用
无损上下线,提升微服务稳定性
当对极氪 APP 应用进行业务发版、弹性扩缩容等场景时,会遇到请求失败率升高,POD 不断重启等问题。针对此问题,结合 MSE 产品能力,通过应用下线过程中自适应等待和主动通知、应用上线过程中就绪检查、服务预热等手段,实现微服务无损上下线发布,有效规避了发布过程中的流量损失,降低业务访问失败风险。同时通过引入 MSE 流量防控能力,针对核心业务场景落地相应技术手段,如接口限流降级、MQ 削峰填谷、数据库慢 SQL 限流治理等,提高服务整体稳定性。
水平拆分,提升业务弹性伸缩能力
随着业务的快速发展,极氪 APP 原架构下容量不足问题愈发突出,在面对新车发布、销售活动、突发热点情况时,无法快速进行水平扩展,并且大量核心业务库都放在同个数据库实例上,容易出现“一损俱损”。阿里云服务团队推荐使用 Polardb-X 产品,将业务库逐个剥离出来,并通过对业务大表水平拆分解决单表过大问题,提高数据库层面水平弹性扩容能力。另外针对微服务弹性能力不足的痛点,输出多可用区节点弹性伸缩、HPA、CronHPA 等容器弹性方案,提高核心服务在流量突发情况的应对能力。
流量防护与容错
想象一下,在业务高峰期,当某些下游的服务提供者遇到性能瓶颈,甚至影响业务。极氪 APP 团队正是遇到了这样的问题,在某次架构迁移的过程中,遇到预料之外的慢调用,拖慢了系统,导致整体稳定性的抖动。如何避免这类问题?需要对部分非关键服务消费者配置一个熔断规则,当一段时间内的慢调用比例或错误比例达到一定条件时自动触发熔断,后续一段时间服务调用直接返回 Mock 的结果,这样既可以保障调用端不被不稳定服务拖垮,又可以给不稳定下游服务一些“喘息”的时间,同时可以保障整个业务链路的正常运转。
突发的事情是非常多的,那么如何可以做好系统的高可用,让系统在不确定的情况下工作在最优解上?极氪 APP 团队先尝试对 APP 大的层面做微服务稳定性治理,避免出现 APP 整体宕机的情况。然后对核心服务和接口做梳理,摸清上下游,对强依赖解耦和改造,并且根据监控、可观测数据,确认核心服务配置什么合理参数。在这之后,多次对服务进行限流降级配置以及演练、优化,总结场景实践规律,制定恰当的技术规范。
开发测试效率提升:在线服务测试
极氪开始在云上进行部署、发布、测试之后,他们遇到了如下问题:
- 部署完应用之后,应用是否健康?当线上出现了一个问题,怎么能够快速发起一次请求,进行复现。
- 在服务上线之前,如何快速地验证历史功能是否都正常?
- 大版本上线前,修改的内容对性能有什么影响,上量之后会不会服务压力过大?
为了做到安全隔离,研发环境、测试环境、预发环境、生产环境部署在不同的专有网络 VPC 内,如果自建测试工具,需要解决测试工具到不同环境的网络互通问题,企业 IT 人员明明只想要一个简单的测试工具,却因为上云之后,要解决复杂的云上网络拓扑,远远没有结束,为了能够在办公网使用该测试工具,还需要保证该测试工具能够被办公网访问,此时又面临着网络安全的考验。
云上的服务测试、压测就是为了解决这个问题 。 借助 FC 的弹性计算能力,一方面打通了云上网络打通的问题,另一方面随用随弹,最大程度解决资源利用率的问题; 借助服务契约提供的内容,服务测试功能可以自动填充测试参数,测试时只需要进行值的修改,就可以发起测试。还可以根据提示将服务测试进行串联,从而达到自动化回归、压测的目的。
4、发布态高可用
全链路灰度发布,实现白天随时发版
随着极氪汽车销售越发火爆,其注册用户和每日活跃用户快速增长,需要支持的业务场景和新功能也越来越多,平均两三天一个小版本、半个月一个大版本的升级频率。为了不影响白天业务高峰,每次发版只能选择在凌晨业务低峰期进行,想象一下如果研发/运维人员每次都集中在晚上发布,那么这些参与发布的同学第二天的工作效率将会受到影响;如果晚上选择较少的人参与发布,那么当出问题的时候止血措施很可能会来不及实施,故障责任也不好划分。
阿里云服务团队帮助极氪团队一起制定和落地全链路灰度发布方案,通过部署灰度版本,并按照流量比例或客户特征进行灰度验证,验证完毕后进行生产发布并切流,满足了客户小版本白天随时发布的诉求。针对客户核心业务链路上多个微服务同时需要发版的场景,基于 MSE 云原生网关和流量灰度打标来实现多业务的全链路灰度,覆 CDN、网关、MQ、配置、数据库等灰度场景,通过这种方式让客户在不需要更改任何业务代码的情况下实现多业务白天发版,同时通过逐步流量放大进行验证,如出现问题可及时回切流量,降低了白天发布可能导致的稳定性风险。同时通过改造云效流水线,帮助客户实现核心业务自动化发布,更好地提升部署效率。
开发环境隔离
微服务的迭代存在非常多的依赖,业务的开发人员无法在本地完成开发,必须使用一整套完整的环境,才能正常的进行开发和联调。极氪 APP 系统中的应用数目有数十个,如果每一个开发环境都维护一整套 APP 系统所具备的微服务环境,需要消耗大量的人力以及资源的成本。
理想中的开发环境逻辑隔离应该是这样的,基于 git-branch 的设计理念,保留一套稳定的基线环境,各个分支的开发同学通过逻辑环境隔离的方式快速拉起需要开发的 feature 环境。我们只需要维护一套完整的基线环境,在增加 feature 开发环境时,只需要单独部署这个 feature 所涉及到改动的应用即可,而不需要在每个 feature 环境都部署整套的微服务应用及其配套设施。其中,基线环境包含了所有微服务应用,也包含了服务注册中心、域名、SLB、网关 等其他设施,而 feature 环境中只包含了这个 feature 中需要修改的应用。这样维护 n 套 feature 环境的成本,就变成了加法,而不是原来的乘法,由 n × m 变成了 n + m。这样算下来相当于零成本增加 feature 环境,这样我们就可以放心地扩容出多套 feature 环境。极氪团队使用微服务治理中的全链路灰度方案实现“流量泳道”,做到快速拉起隔离的开发环境,在提升研发效率的同时节省了一笔不菲的成本开销。
全链路压测与调优
为了摸清楚 APP 能够真实承载的并发容量,需要对核心业务接口进行多轮全链路压测和调优。对于系统容量评估、优化与防护主要概括为四点:压测、观测、限流、扩容。系统高可用体系建设必须从实践中出真知,极氪团队通过压测对 APP 服务能力进行性能摸底,评估性能是否能接受。如果性能不能接受的话那么需要对性能进行扩容和优化;性能符合预期,那么要配置对应的限流规则,以防超出预期的流量将服务打垮。
整个压测演练的过程中需要做到边压、边看、边限、边扩,不断对对数据进行反馈调整,最终建立保证业务系统高可用的体系。通过全链路压测,不仅让大家对 APP 系统的性能、容量做到心中有数,更增强了整套生产系统升级至云原生架构的信心。
提升任务调度类服务的运维管理效率
针对极氪 APP 内,社区定时推荐、在线订单定时确认、 用户定时通知等场景,客户利用 MSE 任务调度 SchedulerX 统一管理和调度定时任务。该方案具备以下优势。
异步任务统一管理:支持将不同来源和类型的异步任务统一管理,任务类型覆 crontab 定时任务、K8s Job,兼容开源框架 XXL-JOB、ElasticJob、Spring Schedule,并支持 Java SDK/Agent 实现自研 SchedulerX 任务,任务运行来源覆盖云上异步任务和云下 IDC。
高可靠的秒级调度能力:任务调度 server 端免运维,无需担心机器宕机等高可用风险影响重点任务调度失败,大幅降低运维成本;实时性要求高场景支持高精准调度,最小支持 1 秒级调度能力。
低成本海量数据处理:海量任务分布式并行执行,全面加快任务执行速度,相比消息队列避免调用高峰拖垮在线业务,大幅降低使用成本。
实践四:可视化数据分析系统,简化运维管理,聚焦业务开发
随着业务加速发展,公司迫切需要一个完善的 BI 数据平台来辅助各业务负责人做决策支撑。众所周知数据对于一个公司具有非常重要的价值,好的数据承载工具显得尤为重要。极数 BI 应运而生,目的是让企业资产数据快速流动起来,帮助企业构建自上而下的决策分析体系,实现业务流程和数据分析直接协同,提升企业内各种人员的数据分析效率,形成数据消费和价值洞察的企业文化。极数 BI 定位是一款面向极氪经营管理全体系的可视化数据分析系统,已覆盖订单、车辆、交付、线索、用户、市场营销、市场分析、威睿工厂等场景。随着业务的快速发展,BI 平台开始接入越来越多的业务需求,在和各业务团队落地过程中,也面临很多使用问题,比如:如何简化维护管理、如何实现多版本并行运行、如何保障业务 SLA 等。
基于 Serverless 技术的发展趋势判断,极氪选择使用 SAE 承载这部分业务。SAE 是面向业务侧提供的一站式全托管 K8s 平台,集成了云原生微服务治理和应用可观测能力,使用和维护体验更加简单,能让开发侧更加聚焦业务价值。尤其是对 BI PAAS 平台来讲,多租隔离、权限管理、应用管理、简化业务使用等关键需求,实现起来更加友好。
SAE 的使用主要在 3 个方面产生了不错的收益:
第一,聚焦业务应用,提升开发效率。极数 BI 做为公司业务团队的“决策参谋”,面临复杂多变的需求,还需要能快速开发上线,采用 SAE 可以省去环境搭建的过程,代码写好后 1 分钟左右就能部署上线进行测试验证,SAE 还集成好了日志监控能力,排查问题很方便。其他业务方接入使用的时候,也不用关心资源的创建和扩容,环境也都是一致的,大家都聚焦在业务开发和维护上,极大提升了研发效率。
第二,简化维护管理。SAE 提供了整套的应用管理能力和弹性伸缩能力,结合云效流水线实现了自动化的创建、更新流程,资源也是随开随用,业务方接入部署的时候,通过流水线自动就把资源和环境创建出来并完成应用部署,也就是应用即资源,Node 节点的高可用、扩缩容都不需要操心。
第三,多租户隔离。SAE 的命名空间提供了完美的资源隔离能力,可以非常方便的用来做环境和权限划分,极大程度上简化了我们多租隔离的实现成本。
实践五:车联网数据采集分析,免运维、弹性可扩展
为了提升智能化水平,新能源汽车对车联网的投入也是非常巨大的。其中如何实时的把海量车端数据采集到云上进行数据分析,并能支持日益增长的在线车辆数量,具备自动弹性扩容的能力至为关键。借助 OSS + FC 的组合,以完全 Serverless 化的模式接入端侧数据上报,整体具备免运维、弹性可扩展的能力。 从车端上报的数据,以加密的形式上传到 OSS,上传成功后会自动触发函数计算对数据做校验、解密和分析,然后把清洗后的数据写入到Kafka供后续的业务流程分析使用。整体方案不仅解决了弹性扩展问题,还极大的优化了资源利用率。此外,FC 天然可以应对大流量冲击,保障系统稳定性和容灾能力。
实践六:通义灵码助力极氪汽车智能研发范式
现大模型如火如荼发展,极氪基于 AI 的创新,也是基于阿里云的百炼等相关大模型的平台验证大模型对于业务的价值。对比测试了很多对应的产品,最终极氪选择了通义灵码。
第一,在个代码生成的相关的领域,通义灵码确实比较好。
第二,通义灵码给极氪开放了一些功能,例如自定义指令等,能够基于自己的需求,做一定的定制开发。
第三,在安全合规方面,通义灵码基于 VPC 的部署的方式,以及通义灵码和极氪一起共创的安全合规审计的功能,帮助极氪能够快速的在内部落地通义灵码,提升整体的研发效率。
未来展望
极氪 APP 进行云原生架构升级探索,提高了 C 端业务系统的稳定性和敏捷性,为冲击更高的销量目标提供了坚实的技术支撑。这仅仅是探索的开始,随着云原生架构的深入,业务的可用性将持续增强,从而为汽车终端用户带来更好的出行体验和乐趣。
相关文章:
极氪汽车云原生架构落地实践
云原生架构落地实践的背景 随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。 为快速响应用户的需求,例如…...
[ctfshow web入门] web16
信息收集 提示:对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo,查看phpinfo信息,搜索flag,发现flag被保存为变量…...
沧州铁狮子
又名“镇海吼”,是中国现存年代最久、形体最大的铸铁狮子,具有深厚的历史文化底蕴和独特的艺术价值。以下是关于沧州铁狮子的详细介绍: 历史背景 • 铸造年代:沧州铁狮子铸造于后周广顺三年(953年)&#…...
【Android Sdk】uiautomatorviewer.bats闪退问题如何解决?
目录 一、uiautomatorviewer.bats闪退 1. 报错场景 2. 问题原因 3. 解决方法 前言 具体操作 一、uiautomatorviewer.bats闪退 1. 报错场景 SDK的tools文件夹中uiautomatorviewer.bat双击闪退不能打开,直接双击uiautomatorviewer.bat闪退。 双击打不开uiaut…...
Redis7——进阶篇(八)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
蓝桥杯 封闭图形个数 刷题笔记
分析 写一个node结构 定义两个数一个存数值 一个存图形个数 分解每个输入的数 的每一位 为每个输入的数赋值一个封闭图形个数的值作为判断依据 重写 cmp函数作为 sort的判断依据 #include<iostream> #include<bits/stdc.h> using namespace std; const int N…...
AI大模型底层技术——结合 Prompt Engineering 的 LoRA
目录 1. 结合 Prompt Engineering 的 LoRA? (1) 定义 (2) 核心思想 2. 核心功能 3. 对比传统通用微调 4. 技术要素 (1) Prompt Engineering (2) LoRA 微调 (3) Prompt & LoRA 协同优化 5. 难点及解决 6. 技术路径 7. 具体技术实现 8. 应用场景 9. …...
7-Zip如何创建分卷压缩文件,进行分批压缩?
相信很多小伙伴在传输文件时会选择先压缩成7-Zip等压缩包后再传输,但如果压缩的文件过大大,传输速度就会很慢,或者上传压缩文件到云盘时也会受到文件大小的限制。 要解决以上问题,我们可以 把文件压缩成多个标准的压缩包…...
【蓝桥杯省赛】 02 包子凑数
题目描述 小明想知道包子铺用给定的蒸笼规格能凑出多少种无法组成的包子数目。若无法组成的数目无限,输出 INF。 输入格式 第一行为整数 N N N(蒸笼种数)接下来 N N N 行每行一个整数 A i A_i Ai(每种蒸笼的包子数&#x…...
人工智能通识速览(Part3. 强化学习)
三、强化学习 1. 基本概念 强化学习是机器学习中的一个重要领域,它涉及智能体(agent)如何在环境中采取一系列行动,以最大化累积奖励。以下是关于强化学习的详细介绍: 智能体:是一个能够感知环境并采取行动…...
深度解析LinkedList工作原理
引言 在 Java 编程中,集合框架是处理数据存储和操作的强大工具。LinkedList 作为其中的重要成员,为我们提供了一种灵活的列表实现方式。与 ArrayList 基于数组的实现不同,LinkedList 采用链表结构,这使得它在某些操作上具有独特的…...
excel的逻辑类型函数(主要包括if、and、or、not、xor、iserror、iferror、true、false、ifs、ifna、switch)
目录 1. IF 函数2. AND 函数3. OR 函数4. NOT 函数5. XOR 函数6. ISERROR 函数7. IFERROR 函数8. TRUE 与 FALSE9. IFS 函数10. IFNA 函数11. SWITCH 函数 1. IF 函数 功能: 根据指定条件判断结果,如果条件为 TRUE,则返回一个值;…...
数据驱动金融韧性升级,开启数据交换“新范式”:构建“实时、国产化强适配”的数据交换与共享平台
在金融行业,数据不只是“资产”,更是贯穿风控、合规、营销与运营的核心“生命线”。而在数字化加速与信创战略并行推进的当下,金融行业对于“实时数据流通”的需求从未如此迫切。 面对业务复杂性提升、国产化替代加速,以及监管科…...
cpp自学 day20(文件操作)
基本概念 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将数据持久化 C中对文件操作需要包含头文件 <fstream> 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的…...
Qt饼状图在图例上追踪鼠标落点
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、饼状图的关键接口二、关键代码1.鼠标移动事件2.核心判断逻辑 总结 前言 最近做了一个项目,需要当鼠标在饼状图上移动的时候展示Slice的内容&am…...
ZKmall开源商城服务端验证:Jakarta Validation 详解
ZKmall开源商城基于Spring Boot 3构建,其服务端数据验证采用Jakarta Validation API(原JSR 380规范),通过声明式注解与自定义扩展机制实现高效、灵活的数据校验体系。以下从技术实现、核心能力、场景优化三个维度展开解析&#…...
操作系统概述(3)
批处理系统 1.单道批处理系统 单道批处理系统是成批地处理作用,并且始终只有一道作业在内存中的系统。优点:提高系统资源的利用率和系统吞吐量。缺点:系统中的资源得不到充分利用。 2.多道批处理系统 引入多道程序设计技术,是…...
深入理解 Object.entries():基础用法与 Object.keys() 的核心区别
深入理解 Object.entries():基础用法与 Object.keys() 的核心区别 一、Object.entries() 是什么? Object.entries() 是 JavaScript 中的一个内置方法,用于将对象的 可枚举属性(自身的、非继承的)转换为一个数组。…...
GitHub 趋势日报 (2025年04月06日)
GitHub 趋势日报 (2025年04月06日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1microsoft/markitdownPython tool for converting files and office documents to Markdown.⭐ 548Py…...
Visual Studio 中使用 Clang 作为 C/C++ 编译器时,设置优化选项方法
在 Visual Studio 中使用 Clang 作为 C/C 编译器时,可以通过以下方法设置优化选项: 方法 1:通过项目属性设置(推荐) 右键项目 → 属性 配置属性 → C/C → 优化 优化:选择优化级别 /O0 - 禁用优化&#x…...
现场测试的特点与测试设备的基本要求
在各类测试场景中,现场测试有着不可替代的作用。不过,它也面临着诸多难题,对测试设备也有着特殊要求。今天,咱们就深入探讨一下现场测试的特点与测试设备的基本要求。 现场测试的特点 场地电磁环境噪声问题 建议环境噪声低于…...
构建一个最简单的UDP服务器和客户端并逐行解析
目录 1.服务器 (1)基本概念 (2)代码实现 3.逐行解析 1) 2) 3) 4) 5) 6) 7) 8) 1. response.getBytes(): 2.response.get…...
LeetCode 1638 统计只差一个字符的子串
标题:LeetCode 算法题 - 统计只差一个字符的子串数目 在算法学习的过程中,我们经常会遇到一些有趣的字符串问题。今天就来探讨一道这样的题目:给定两个字符串 s 和 t ,找出 s 中的非空子串的数目,这些子串满足替换一个…...
DAY 39 leetcode 18--哈希表.四数之和
题号18 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 和…...
关于lombok的异常快速解决办法
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
Android SELinux权限使用
Android SELinux权限使用 一、SELinux开关 adb在线修改seLinux(也可以改配置文件彻底关闭) $ getenforce; //获取当前seLinux状态,Enforcing(表示已打开),Permissive(表示已关闭) $ setenforce 1; //打开seLinux $ setenforce 0; //关闭seLinux二、命令查看sel…...
JavaWeb注解的原理
WebServlet("/mayikt") 是 Java Servlet 3.0 及以上版本中引入的注解,用于简化 Servlet 的配置。其原理和与 Servlet 映射关系的知识点如下: 1. 注解的作用与原理 核心功能: WebServlet 注解的作用是将当前类声明为一个 Servlet&am…...
类和对象—多态
目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态,通俗来讲就是多种形态,即对于同样的行为,不同的对象去完成会产生不同的状态。比如动物都会吃东西,小狗和小猫都…...
vscode启动vite+Vue3项目调试功能,QQ浏览器为例
1、增加launch.json配置 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"type&quo…...
Spring MVC 的执行流程以及运行原理
一.什么是 MVC? MVC 是 Model 、 View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责, MVC 是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码,降低了视图与业 务逻辑之间的…...
08-Spring MVC 请求处理流程全解析
Spring MVC 请求处理流程全解析(从 DispatcherServlet 到 Controller) Spring MVC 是构建 Web 应用的基础框架,而其中最核心的组件就是 DispatcherServlet,它作为整个请求流程的入口和协调者,掌控了从接收请求、分发到…...
pikachu靶场搭建教程,csfr实操
靶场安装 靶场下载地址 百度网盘下载地址和密码 百度网盘 请输入提取码 0278 github靶场下载地址 https://gitcode.com/Resource-Bundle-Collection/c7cc1 安装前提 这两个文件夹的配置文件都要进行更改修改数据库密码 D:\phpstudy_pro\WWW\pikachu\inc D:\phpstudy_pro…...
MCP + 数据库,一种比 RAG 检索效果更好的新方式!
大家好,欢迎来到 code秘密花园,我是 ConardLi。 在今天这一期,我们将一起学习一种基于 MCP 提高大模型检索外部知识精度的新思路,实测比 RAG 效果要好很多。 目前市面上讲 MCP 的教程比较多,但大多数都是一些概念性的…...
图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言 书接上文 OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺…...
TDengine 与 taosAdapter 的结合(一)
一、引言 在当今数字化时代,数据量呈爆发式增长,尤其是物联网、工业互联网等领域产生的海量时序数据,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、开源的时序数据库,专为这些场景设计并优化,在时序数据…...
23种设计模式-行为型模式-模板方法
文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…...
Django异步执行任务django-background-tasks
1、安装 pip install django-background-tasks 2、注册服务 INSTALLED_APPS [...background_task, ]3、生成表 // 生成迁移 python manage.py makemigrations //运行迁移 python manage.py migrate 4、创建文件,模拟任务 from background_task import backgrou…...
从零设计React-Markdown组件的实现方案
从零设计React-Markdown组件的实现方案 现在,把这些步骤整理成代码结构。首先是解析器类,用正则表达式分割文本为Token,然后生成AST。接着,编写一个React组件,接收Markdown字符串,解析成AST,遍历AST生成对应的React元素。处理代码高亮需要引入第三方库,但用户不允许用现…...
如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…...
React-Markdown 组件底层实现原理详解
如何在 React 中渲染 Markdown 文档 React-Markdown 组件底层实现原理详解 一、核心架构:基于 Unified.js 的编译流水线 React-Markdown 的底层实现依赖于 Unified.js 这一开源内容处理系统,其核心是一个可插拔的编译流水线。整个过程分为四个阶段&…...
基于单片机的防火防盗报警系统设计(论文+源码)
2.1系统的功能及方案设计 本次课题为基于单片机的防火防盗报警系统,其系统采用STC89C52单片机为控制器,并结合SIM800短信模块,DS18B20温度检测模块,MQ-2烟雾检测模块,红外人体检测模块,按键模块,…...
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
P1036 [NOIP 2002 普及组] 选数 - 洛谷 组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」 #include <bits/stdc.h> using namespace std;const int N 25; int n, k; int a[N];int ret; int path; //记录路径中所…...
网络Socket编程基于UDP协议模拟简易网络通信
一、预备知识 网络编程(Network Programming)是指编写程序来实现计算机网络之间的通信。这通常涉及到使用套接字(sockets)来建立连接、发送和接收数据。 (一)套接字 套接字(Socket࿰…...
rust 使用select退出线程
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Capture {clear: bool, // ????????interface: String, // ??times: u64, // ?? }pub async fn cmd_capture(State(web_env): State<ArcWebEnv>,Json(args): Json<C…...
C++学习day7
思维导图: 使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #includ…...
【学习笔记】CoACD: 基于碰撞感知凹性与树搜索的近似凸分解
CoACD 基于碰撞感知凹性与树搜索的近似凸分解 CoACD 官方文档 CoACD(Convex Approximation of Complex Decompositions)是一种用于将复杂网格分解为多个凸包的算法, 专为 3D 网格设计了近似凸分解算法,强调在保持物体间潜在碰撞条件的同时减…...
Three.js 系列专题 6:后处理与特效
内容概述 后处理(Post-Processing)是在渲染完成后对画面进行额外的处理,以实现模糊、辉光、颜色校正等效果。Three.js 通过 EffectComposer 提供后处理支持。本专题还将简要介绍着色器和粒子系统,为更复杂的特效打基础。 学习目标 掌握 EffectComposer 的基本使用。实现辉…...
2025 年江苏保安员职业资格考试经验分享
江苏保安行业发展成熟,2025 年考试注重对考生综合素养的考查。报考条件常规,但对诚信记录有额外关注,如有不良信用记录可能影响报考资格。 报名在江苏省各地级市公安局指定点进行,提交资料包括身份证、学历证、个人诚信报告&am…...
亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑
在跨境电商迈入精细化运营时代的背景下,亚马逊平台最新发布的《2024年Q1零售搜索趋势报告》揭示了算法驱动下的消费新图景。数据显示,北美站点月均超300万人次重复搜索特定品类商品,健康生活、智能家居等五大领域形成持续增长极。这份由亚马逊…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...