极氪汽车 APP 系统云原生架构转型实践
作者:极氪汽车
前言
新能源汽车已经成为我国汽车市场再次崛起的关键支柱,随着新能源汽车市场的快速发展,不同类型的品牌造车厂商呈现出百花齐放的态势。极氪汽车是吉利控股集团旗下高端纯电汽车新品牌,2021 年 4 月极氪发布首款高端智能电动车型–极氪 001,大获市场好评,截至 2022 年 12 月,001 车型累计交付量突破 7 万台。连续 3 个月问鼎自主品牌 30 万以上豪华纯电车型销量冠军。
极氪坚持不止于车的服务体验,除了为客户提供卓越产品的同时,还通过极氪 APP 与用户建立连接。极氪 APP 推出线上社区、订阅出行、好物商城、极氪生活等多元创新举措,实现了极氪产品的全生命周期管理以及用户旅程的全场景覆盖。从用户想要了解相关车型,到有意向进行购买、提车使用、分享感受以及售后问题迅捷解决方案等各种环节的使用场景,都被集成到了这款 APP 之上。
“我之前对极氪汽车并不是很了解,极氪这款软件对我的帮助非常大,我觉得这是很好的,同时也在极氪软件里面看到了自己想要买的车,关注极氪已经一年了,不仅可以了解极氪汽车知识还能得极分换商品希望极氪多多上新实用商品” 这是摘自 Apple App Store 的用户评价。极氪 APP 既是用户智能控车随时随地掌握车况的车主服务好帮手,又能提供购买用车好物、共享社区活动的极致出行用车体验,便于用户获取触手可得的用车信息,让出行变得更加便捷有趣。
云原生架构探索的实践历程
云原生技术发展
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。 公司副总裁刘昊表示,为快速响应用户的需求,例如缩短一辆车的制造周期、便捷平滑地升级汽车操作系统等,企业从产品到用户体验到商业模式都需要创新。然而消费互联网和传统产业发展的经验不足以完全满足产业互联网对成本、效率、质量等方面的高要求。云原生是一个确定性的技术发展趋势,能有效推动产业发展,驱动企业积极革新。极氪将持续投入,将云原生能力赋能到企业内的研、产、供、销、三电等更广泛的业务领域。
这些业务现状和云原生架构带来的核心能力不谋而合。
在极氪系统改造上云的过程中,围绕着云原生技术体系,推动极氪的各条业务线进行技术升级改造,加快数智化发展进程。在技术选型上,极氪始终遵循着2条原则:
一是全面拥抱开源开放的主流技术标准:
使用开源开放的主流技术标准,可以确保技术方案的成熟度,更便捷地从开发者社区获取技术资源和最佳实践,也能够帮助企业更好的招募技术人才。此外,这样的策略也避免了被封闭技术体系和特定云厂商所捆绑。软件技术的国产化以及自主可控,也是需要考虑的点。
二是尽可能利用云的价值:
将稳定性保障、底层技术实现、技术组件维护、弹性伸缩等非功能性需求尽可能交给云厂商解决,让技术团队将更多的精力投入到业务创新上。
这 2 个原则并不矛盾,相反,它们之间可以非常好的融合,这也是所有使用云计算的企业用户都值得借鉴的架构选型标准。比如 Kubernetes 是典型的满足开源开放标准的技术标准,阿里云提供的 Kubernetes 产品可以简化用户的搭建成本,更好地与云计算资源进行集成。同时用户依然可以基于开源 Kubernetes 的标准协议与 API 使用云产品,这就是 2 条选型原则相互融合的最好体现。
业务容器化
云原生趋势下,Kubernetes 毫无疑问已经成为了企业新一代云 IT 架构的基础设施。从 2021 年开始,极氪就开启了微服务和容器化改造计划,将 IT 系统的底座逐步从虚拟机迁移到 Kubernetes。
在 Kubernetes 平台的选择上,基于技术选型的 2 条原则,极氪选择了阿里云容器服务 ACK 。ACK 以阿里云可靠稳定的 IaaS 平台为底座,向下封装了 30+ 款云产品,形成了自动化运维和云平台交互的新界面,从而提升企业业务系统的弹性和自动化运维能力。
基于容器服务 ACK 的易用性以及集成能力,极氪 IT 系统容器化改造工作比预想中的要顺利得多。对于每一个业务系统而言,从虚拟机迁移到 Kubernetes ,仅仅是底层的承载发生了变化,不会涉及到太多的改造成本。在容器化改造的过程中,当极氪技术团队遇到疑难问题的时候,可以第一时间从阿里云获得最佳实践指导,包括集群规划、平台运维、应用适配、安全防护、可观测等多个方面,这也更进一步的提升了容器化改造的速度。
目前,极氪 APP 以及 SCRM 等系统,已经 100% 基于 Kubernetes。相比传统的基于虚拟机部署方式,容器化帮助极氪在资源利用率上提升了 20%,在运维效率上提升了 50%。 在 2022 年 9 月通过了中国信通院云原生技术架构成熟度评估, 同时极氪的技术团队也在容器化改造的过程中,掌握了管理超大规模 Kubernetes 集群的能力,并促成了更多云原生新技术的运用。
统一微服务架构
与容器化改造几乎同步进行的是对微服务架构的统一。在此之前,极氪的各个业务单元多种技术栈并存,彼此之间相互通讯复杂度高,项目成员的交接往往要耗费巨大的精力,极大程度上阻碍了数字化转型的进展,因此微服务架构统一势在必行。
极氪经历了 2 年多时间完成了这一项艰巨的工作,虽然投入精力巨大,但收益是立竿见影的,而且可以持续发挥作用:不论是内部团队还是三方 ISV ,在技术框架上都有统一的标准可以遵循,各团队共享技术栈后,研发效率成倍提升。
关系到未来多年的 IT 战略,在微服务架构的选型上,高开放性、高成熟度、高普及度这三条标准缺一不可,考虑到极氪以 Java 为主要开发语言,Spring Cloud Alibaba 就成为了微服务框架的最佳选择。
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。这些组件一部分以 SDK 的形式集成到代码中,一部分以中间件的形式独立运行,后者往往可以选择托管版云产品,以降低开发者的工作量。比如阿里云微服务引擎 MSE 就提升了开箱即用的注册配置中心 Nacos,以及云原生网关。
稳定性和效率问题愈发凸显
可以预想的,随着极氪 APP 的上线,注册车主数量呈现出了爆发式的增长,用户的使用场景也不断扩大。在这个过程中,APP 的用户使用体验变得愈发重要,如何在用户规模高速增长的同时可以保证 APP 的稳定性、敏捷性, APP 的微服务开发效率如何保证,这些都给研发团队带来了一定的挑战。
业务连续性差缺少容量规划
远程控车、在线地图、3C 商城等 APP 核心服务对业务连续性要求非常苛刻,均需保证 7*24 小时持续在线。特别是面临旺季销售活动、新车型发布、突发热点事件等情况,APP 面临着高并发大流量压力,经常会发生功能失效、页面打不开、延迟过高,甚至 APP 完全无法访问的异常,对用户体验造成严重影响。
功能版本发布迭代速度慢
随着用户场景需求的增加,越来越多的功能等待发布上线,对迭代频率的要求越来越高,但由于 APP 服务端缺少全链路灰度发布能力,为了保障业务稳定性,每次发布客户只能选择在凌晨的业务低峰期进行,开发、运维、测试同学苦不堪言,急需实现随时发版无损发布能力。
技术架构缺少整体设计
公司成立之初,为了实现 APP 快速上线,对于技术架构整体设计考虑不足,体现在业务间高度耦合、系统链路过长、技术实现标准不一、云产品选型不合理等诸多问题,例如通过调研发现某核心接口请求链路过长,导致延迟抖动率很高,影响用户使用体验。
研发团队意识到,随着业务发展的向好,这些挑战也会也越来越大。在业务快速发展中,既要保证好已有业务的稳定性,又要快速地迭代新功能,并且需要保证开发的效率并不会随着业务增长而大幅降低,毕竟存在团队招聘节奏跟不上业务发展的问题。总结来说,团队解决 APP 应用快速迭代演进的关键就是解决稳定性与效率的问题。
- 稳定性: 用户数多起来之后,系统的稳定性就显得比较重要,无论是用户在某段时间遇到异常报错增多,还是某一个功能点持续性地报错,再大到系统有一段时间完全不可用,这些都会影响产品在用户中的口碑,最后这种完全不可用的场景,甚至还可能成为微博等社交网络上的舆论热点。
- 效率: 随着用户的增多,相应的需求也越来越多,业务场景也越来越复杂,在这个时候测试可不是内部测试就能覆盖所有的场景,需要加大在测试上的投入。虽然功能需求越来越多,但是迭代的速度却要求越来越快,因为市场中已经有不少竞争者,大家竞争的一个关键就是速度,业务更需要跑得更快,开发节奏要快,测试节奏要快,发版节奏也要快。
针对以上问题,研发团队根据业务架构从流量入口到微服务再从全局视角进行微服务的系统优化与调优,围绕着成本、稳定性以及效率进行深入的微服务化探索。
业务链路入口升级
极氪架构中的网关架构并不一致,各种网关都起了一定的作用。我们可以从上图中看到流量网关、API 网关、微服务网关等众多网关存在,他们具备了安全(WAF)、API 管理、流量分发等作用,思考一下,如果一个请求链路经过多个网关,那么这个事情对成本与稳定性都有一定的挑战。
在这个时候 MSE 云原生网关出现在研发团队的视野中,云原生网关将流量网关(Kubernetes Ingress、Nginx)和微服务网关(Spring Cloud Gateway、Zuul 网关等)二合一,降低 50% 资源成本,同时缩短了请求时间,降低运维复杂度。
作为面向南北向的公网网关,使用 Waf 防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是将流量先接入Waf安全网关,过滤后再将流量转发给流量网关,最后到达微服务网关;那么升级云原生网关后,进一步需要思考的事情是,入口流量的安全能力是否还可以具备?
云原生网关通过内置 Waf 模块直接对接阿里云的 Waf 云产品,使得用户的请求链接只经过云原生网关就可以同时完成 Waf 防护能力,大大降低了网关的运维复杂度,图示如下:
网关作为链路流量的入口,除了安全能力之外,还承接着入口流量/容量的管理、高可用等职责。
微服务高可用探索
无损上下线,提升微服务稳定性
客户 APP 应用使用的是微服务架构,当进行业务发版、弹性扩缩容等场景时,会遇到请求失败率升高,POD 不断重启等问题。针对此问题,结合 MSE 产品能力,通过应用下线过程中自适应等待和主动通知、应用上线过程中就绪检查、服务预热等手段,实现微服务无损上下线发布,有效规避了发布过程中的流量损失,降低业务访问失败风险。同时通过引入MSE流量防控能力,针对核心业务场景落地相应技术手段,如接口限流降级、MQ 削峰填谷、数据库慢 SQL 限流治理等,提高服务整体稳定性。
水平拆分,提升业务弹性伸缩能力
随着业务的快速发展,极氪 APP 原架构下容量不足问题愈发突出,在面对新车发布、销售活动、突发热点情况时,无法快速进行水平扩展,并且大量核心业务库都放在同个数据库实例上,容易出现“一损俱损”。阿里云服务团队推荐使用 Polardb-X 产品,将业务库逐个剥离出来,并通过对业务大表水平拆分解决单表过大问题,提高数据库层面水平弹性扩容能力。另外针对微服务弹性能力不足的痛点,输出多可用区节点弹性伸缩、HPA、CronHPA 等容器弹性方案,提高核心服务在流量突发情况的应对能力。
流量防护与容错
想象一下,在业务高峰期,当某些下游的服务提供者遇到性能瓶颈,甚至影响业务。极氪 APP 团队正是遇到了这样的问题,在某次架构迁移的过程中,遇到预料之外的慢调用,拖慢了系统,导致整体稳定性的抖动。如何避免这类问题?需要对部分非关键服务消费者配置一个熔断规则,当一段时间内的慢调用比例或错误比例达到一定条件时自动触发熔断,后续一段时间服务调用直接返回 Mock 的结果,这样既可以保障调用端不被不稳定服务拖垮,又可以给不稳定下游服务一些“喘息”的时间,同时可以保障整个业务链路的正常运转。
突发的事情是非常多的,那么如何可以做好系统的高可用,让系统在不确定的情况下工作在最优解上?极氪 APP 团队先尝试对 APP 大的层面做微服务稳定性治理,避免出现 APP 整体宕机的情况。然后对核心服务和接口做梳理,摸清上下游,对强依赖解耦和改造,并且根据监控、可观测数据,确认核心服务配置什么合理参数。在这之后,多次对服务进行限流降级配置以及演练、优化,总结场景实践规律,制定恰当的技术规范。
开发测试效率提升:在线服务测试
极氪开始在云上进行部署、发布、测试之后,他们遇到了如下问题:
-
部署完应用之后,应用是否健康?当线上出现了一个问题,怎么能够快速发起一次请求,进行复现。
-
在服务上线之前,如何快速地验证历史功能是否都正常?
-
大版本上线前,修改的内容对性能有什么影响,上量之后会不会服务压力过大?
-
为了做到安全隔离,研发环境、测试环境、预发环境、生产环境部署在不同的专有网络 VPC 内,如果自建测试工具,需要解决测试工具到不同环境的网络互通问题,企业 IT 人员明明只想要一个简单的测试工具,却因为上云之后,要解决复杂的云上网络拓扑,远远没有结束,为了能够在办公网使用该测试工具,还需要保证该测试工具能够被办公网访问,此时又面临着网络安全的考验。
-
云上的服务测试、压测就是为了解决这个问题 。 借助 FC 的弹性计算能力,一方面打通了云上网络打通的问题,另一方面随用随弹,最大程度解决资源利用率的问题;借助服务契约提供的内容,服务测试功能可以自动填充测试参数,测试时只需要进行值的修改,就可以发起测试。还可以根据提示将服务测试进行串联,从而达到自动化回归、压测的目的。
全链路治理
全链路灰度发布,实现白天随时发版
随着极氪汽车销售越发火爆,其注册用户和每日活跃用户快速增长,需要支持的业务场景和新功能也越来越多,平均两三天一个小版本、半个月一个大版本的升级频率。为了不影响白天业务高峰,每次发版只能选择在凌晨业务低峰期进行,想象一下如果研发/运维人员每次都集中在晚上发布,那么这些参与发布的同学第二天的工作效率将会受到影响;如果晚上选择较少的人参与发布,那么当出问题的时候止血措施很可能会来不及实施,故障责任也不好划分。
阿里云服务团队帮助极氪团队一起制定和落地全链路灰度发布方案,通过部署灰度版本,并按照流量比例或客户特征进行灰度验证,验证完毕后进行生产发布并切流,满足了客户小版本白天随时发布的诉求。针对客户核心业务链路上多个微服务同时需要发版的场景,基于 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 进行云原生架构升级探索,提高了 C 端业务系统的稳定性和敏捷性,为冲击更高的销量目标提供了坚实的技术支撑。这仅仅是探索的开始,随着云原生架构的深入,业务的可用性将持续增强,从而为汽车终端用户带来更好的出行体验和乐趣。
相关文章:

极氪汽车 APP 系统云原生架构转型实践
作者:极氪汽车 前言 新能源汽车已经成为我国汽车市场再次崛起的关键支柱,随着新能源汽车市场的快速发展,不同类型的品牌造车厂商呈现出百花齐放的态势。极氪汽车是吉利控股集团旗下高端纯电汽车新品牌,2021 年 4 月极氪发布首款…...
一个UDP下载服务器的实现(模拟下载文件)
本期分享的主要是使用UDP实现文件下载功能,需要自己编写服务器和客户端,实现的功能主要有以下几个: (1)服务器可以为请求的用户下发文件数据(前提是服务器得有这个数据文件) (2&…...
01.hadoop上课笔记之hadoop介绍
1.大数据介绍 可以对未来数据预测 google通过搜索预测流感,足球球员有一 定关联…caict可以得到数据hbase hive林子雨mooc数据要进行挖掘(推断更多信息) 2.大数据是非结构化数据多:声音,图片… 3.大数据影响因素 大多快低 tb pb eb zb 1.硬件 2.网络带宽 4.大数据的特征 数据量…...

小鹏汽车Q1财报:押注G6、大力降本,明年智驾BOM降半
作者 | 德新编辑 | 王博 小鹏汽车本周发了Q1财报,数据不好看,以致于在微博端也发了公开信。 那后续呢? 小鹏第二季度指引是,总交付数量约为2.1 - 2.2万辆,收入预计约为45 - 47亿元;四季度,…...

VMware ESXi 8.0U1a 发布 - 领先的裸机 Hypervisor
VMware ESXi 8.0U1a 发布 - 领先的裸机 Hypervisor 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u1/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023-06-01, VMware vSphere 8.0U1a 发布。 详见&am…...
Unity的IPreprocessBuild:深入解析与实用案例
Unity IPreprocessBuild Unity IPreprocessBuild是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自动执行一些操作。这个功能可以帮助开发者提高工作效率,减少手动操作的时间和错误率。在本文中我们将介绍Unity IPreprocessBuild的使用方…...

htmlCSS-----CSS选择器(下)
目录 前言: 2.高级选择器 (1)子代选择器 (2)伪类选择器 (3)后代选择器 (4)兄弟选择器 相邻兄弟选择器 通用兄弟选择器 (5)并集选择器 &am…...

RDK X3 Module发布,全新软硬件平台加速实现量产级产品落地
机器人开发是一段美妙的旅程。GEEKROS创始人杨状状是地平线社区的一名开发者,热衷于鼓捣各类机器人,2022年,状状第一时间就拿到了地平线旭日X3派(简称旭日X3派),基于TogetheROS™.Bot机器人操作系统&#x…...
【面试实战】Redis缓存设计
文章目录 Redis缓存出现的问题🙎♂️面试官:什么是缓存雪崩?🙎♂️面试官:怎样解决缓存雪崩?🙎♂️面试官:什么是缓存击穿?🙎♂️面试官:怎样解决缓存击穿?🙎♂️面试官:什么是缓存穿透?🙎♂️面试官:怎样解决缓存穿透?🙎♂️面试官:…...
如何解决js定时器不准确问题
为什么会出现定时器不准确呢? 这个其实就得提到js执行机制了,叫做事件循环Eventloop 循环机制中,异步事件 setInterval 到时后会把回调函数放入消息队列中Event Queue,主线程的宏任务执行完毕后依次执行消息队列的微任务ÿ…...

学习笔记——vue中使用el-dropdown组件报错
今天在工作中,发现使用el-select做的下拉框,下拉菜单展开后,鼠标点击下拉框之外的区域时,下拉菜单没有收起。然后,我打开控制台,发现了这个错误。 Uncaught TypeError: Cannot read properties of null (re…...
Java之旅(八)
Java 条件运算符 Java 条件运算符用于根据一个条件表达式的布尔值来决定程序执行的流程。条件运算符有三种类型:if、else 和 switch。 if 语句的一般格式如下: if (condition) {// 条件为 true 执行的代码块 } 其中,condition 是一个 bool…...
华为OD机试真题(Java),四则运算(100%通过+复盘思路)
一、题目描述 输入一个表达式(用字符串表示),求这个表达式的值。 保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。 数据范围:表达式计算结果和过程中满足∣val∣≤1000 ,字符串长度满…...

HTML表单标签form分析
说明:在html的标签中,表单标签与后台联系密切,像用户登录、注册,都是用到页面的表单标签,用户将信息填入到表单中,提交到后端业务中校验处理,再将结果反馈给前端页面。 表单内的标签分别有&…...
Qt 项目文件Pri详解
在Qt项目中,pri文件(.pri)是一种类似于makefile的文件,用于定义Qt项目中的编译规则。通常可以用pri文件来配置Qt库、头文件、源文件、链接库等信息,这样可以把这些信息定义在一个文件中,避免在每个工程中都进行重复配置࿰…...

Keil 5 MDK 发律师函警告了,如何用STCubeIDE开发标准库的程序(STM32F103C8T6为例)
用STCubeIDE进行标准库开发 1、CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE 2、CubeIDE下载 点击上面的链接,登录即可下载 3、搭建Demo工程 新建一个工作空间 创建一个工程 选择芯片-STM32F103C8T6 填写工程信息 添加标准库到工程 标…...

接口测试--apipost接口断言详解
在做接口测试的时候,会对接口进行断言,一个完整的接口测试,包括:请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言: apt.asser…...

YYDS练手 130道python练习题 完整版PDF
近年来,Python在编程语言界里赚足了风头,无论是受欢迎程度,还是薪资待遇,都非常可观,相应的,Python岗位要求也越来越高,无论你是零基础还是老前辈,在Python面试中都不能轻视。 不打…...

2-python的变量类型
内容提要 主要回顾了python中的变量类型,区分它们和c中的区别 python中的数字没有long python中的字符串不能被改变,也就是说不能对其内字符元素进行赋值操作 python中列表的数据类型与c访问方式有一定的区别列表的下标可以是负数,无论正负&…...

Python之并发编程一背景知识
一、开篇介绍 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...