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

杭州铭师堂的云原生升级实践

作者:升学e网通研发部基建团队

公司介绍

杭州铭师堂,是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育,让中国人都有好书读”的使命,致力于用“互联网+教育”的科技手段让更多的孩子都能享有优质的教育,促进他们的全面成长。

成立十余年以来,铭师堂不断汇聚优质的全国各地教育资源,并展开先进科学技术在学校教育智能化领域、学生个性化学习领域的应用研究。杭州铭师堂始终坚守使命,持续创新,“赋能学校、培养学生”,在教育信息化 2.0 趋势下,致力于促进线上教育与线下教育的高度融合,以学校为核心场景,与学校携手共建互联网学习空间,为学校与学生提供学习解决方案,极大促进教学效率的提升。

升学e网通是由杭州铭师堂公司运营的针对高中生的综合性在线教育品牌。重点打造了教育智能化系统、优质资源系统和大数据信息系统,涵盖互联网生涯规划、互联网在线学习以及互联网心理解决方案等内容。针对不同学校,打破物理空间的限制,量身定制虚拟的网络学习空间,希望用互联网教育推进个性化学习的实现,促进优质资源的跨地域流动,促进每一位高中生更全面发展。

业务全量上云,为云原生化打好基础

在 2022 年之前,杭州铭师堂全栈系统主要搭建在 IDC 之上,仅在寒暑假高峰期时会在云上部署一定资源来应对预期外的流量,过程中初步享受到云计算的红利,了解到云的魅力,对云有了一个比较浅显的认知。具体架构为:基础设施层利用自建 K8s 进行应用部署管理,中间件层包含:自建注册配置中心、自建数据库(Redis、MySQL、MongoDB 等)、自建消息队列(Kafka、RabbitMQ)、自建大数据 Hadoop 集群,应用层为 Spring Cloud 构建的 Java 服务,网关层为基于 Zuul 1.0 开发 Gateway 服务,入口层通过 Nginx 进行统一管理,配套工具有自建 ELK、Pinpoint、Zabbix。

随着业务的高速发展,杭州铭师堂的业务流量在平峰期和高峰期之间的 Gap 从几倍增长到几十倍,原本的这套技术架构逐渐暴露出诸多问题:

  1. 稳定性问题多: 随着业务发展,高峰期流量逐年增长,以自建形式搭建的集群,会面临各种各样前所未有的挑战,导致问题频发、SLA 无法有效保障,业务发展带来系统压力和稳定性保障复杂度成为焦点矛盾。
  2. 资源弹性能力不足: 当实际流量超过预留值时,无法实现快速扩容和响应,复杂的招采流程导致时长以小时甚至日级别。
  3. 成本管控难度高: IDC 机器不具备弹性能力,必然需要日常做好资源预留,导致资源空闲。
  4. 运维成本和复杂高: 采用大量自建服务,需要配套足够且专业的人员进行维护,一旦遇到复杂问题,排查起来非常棘手,响应速度无法跟上业务诉求。

基于以上的痛点,杭州铭师堂成立上云项目组,经过深入方案调研,最终选择阿里云,在上云项目组和阿里云专家团队的共同合作和努力下,在 2022 年杭州铭师堂成功完成了业务的全量上云,为下一步云原生化打好基础。

全面拥抱云原生,保障稳定性

随着业务全量上云后,如何利用云更好的保障系统稳定性成为了杭州铭师堂的重点课题。不同于业界大厂 618、双十一的护航,杭州铭师堂的暑期高峰期长达 86 天,日活百万+,峰值 QPS 几万+,系统压力较平时有几十上百倍的差异,要保障好全栈系统不出问题,是一项非常有挑战性的任务。考虑到这一课题范围较广,涵盖微服务领域、大数据领域、运维领域、可观测性领域、安全领域等等,这里重点围绕微服务领域进行展开讲解,实践的整体思路先从基础设施,再到微服务应用,最后到统一入口层,逐步进行云原生化,建设一套规范化、先进化、灵活化的稳定性系统,助力业务快速发展,做好技术的充分赋能。

基础设施:注册配置中心迁移

面临的问题

配置中心和注册中心的作用,技术发展至今,相比大家都已经非常清楚,这里就不做赘述。升级前,杭州铭师堂采用 Eureka 集群作为注册中心,采用 Apollo 管理业务应用配置,采用 Spring Cloud Config 管理中间件配置,在过往使用中,针对这三款组件,业界通用问题都遇到过,例如:如集群不可用、Eureka 无法及时摘除下线实例、配置推送不及时等,在业务关键时期,因为注册中心或者配置中心的不可用,是绝对不能容忍的。

针对性的解法

基于此,先解决微服务下这一关键基础设施的稳定性问题。通过充分调研和论证,MSE Nacos 产品能够很好的满足诉求,具体优势如下:

杭州铭师堂联合阿里云一起共建,基于 MSE Sync 实现了 MST-Sync,让注册中心实现了丝滑平迁:

针对配置中心,因为使用 Apollo+Spring Cloud Config 两类组件,因此也针对性自研开发了配套迁移工具,同样实现了丝滑平迁。

取得的成果

配置注册中心 SLA 提升到 100%,再无一例因其稳定性或者功能性问题导致应用不可用案例发生。此外,杭州铭师堂实践了一套管理标准,让原本杂乱的配置实现了规范化。

  • namespace:环境,目前有四套,开发、测试、预发、生产
  • group:组,定义为业务线
  • dataId:配置标识,分为公共配置和应用私有配置:
    • 全栈公共配置:要求 group 为 public,dataId 为 public-{配置文件名}.{扩展名}。
    • 业务域公共配置:要求 group 为业务线,dataId 为 public-{配置文件名}.{扩展名}。
    • 业务配置:group 为业务线,dataId 为{应用名称}.{扩展名},如果有扩展配置,可定义为{应用名称}-{自定义名称}.{扩展名}。
    • 业务敏感配置:group 为业务线,dataId 为{敏感配置文件名}.{扩展名},提供给后续结合 KMS 实现敏感配置的加密处理。

服务治理全面落地与实践

随着上云后,虽然基础设施弹性问题得以解决,但系统所面临的压力与挑战并未减轻,问题和风险在变更态和运行态显得尤为突出。因此,杭州铭师堂结合 MSE 微服务引擎的多项能力,不断打磨和实践,成功做到了服务运行时的高可用防护 & 服务变更时的可观测、可灰度、可回滚。接下来,从高可用三大利器、安全发布两大法宝(无损上下线、全链路灰度),展开进行详细介绍。

高可用三大利器:限流、熔断、降级

面临的问题

针对单应用运行时的高可用,随着业界技术发展,已经形成了一套通用的解决方案,也就是今天说的三大利器:限流、熔断、降级。从 2018 年 .NET 转 Java 开始,杭州铭师堂一直沿用 Spring Cloud 这套微服务框架来搭建业务系统,在高可用防护这块,一直依赖于 Spring Cloud Hystrix 的能力。使用过 Hystrix 的同学应该都了解,它所具备的防护能力非常的局限,缺点非常明显:

  • 防护能力不足,无法以 QPS 维度限制接口访问。
  • 线程池隔离占用资源高:在暑期高峰期,复杂的核心应用因为使用线程池隔离策略,光内存占用就多了几个 GB,实在是过于繁重。
  • 规则无法实时性等等。线上监控发现答题接口被刷,无法利用 Hystrix 立即进行防护手段的干预,需要调整代码才能处理,非常被动。

针对性的解法

随着阿里开源的 Sentinel 这一神器,慢慢替代 Hystrix 成为业界高可用解决方案的标准。经过调研和对比,最终杭州铭师堂选择了商业版 Sentinel 产品 AHAS,后来统一合并到 MSE 微服务引擎流量治理中。对比 Hystrix,其具备了明显的优势:

  • 多维的防护能力: 基于 QPS 的限流、基于并发数的隔离、基于异常数或者慢调用的熔断机制等等。
  • 轻量的资源占用: 借助并发数的隔离机制,远远不需要像线程池方式这么重量级,内存资源占用节省至少 10 倍以上。
  • 规则实时生效: 针对突发情况能够快速进行响应,在关键时候能解燃眉之急。

如上图所示,杭州铭师堂在实践中落地了一套 SOP 机制:

  • 在网关层进行粗粒度的限流控制,来防止当前超出系统容量下的流量,规则命中后日志接入 SLS,配套监控告警,及时感知后,进行干预,针对合理请求进行系统容量扩容,预留足够的响应时间。
  • 在应用层进行细粒度的限流、熔断、降级组合控制,让强依赖在可控范围内进行调用,针对弱依赖可降级降级,不可降级进行熔断,避免被下游慢调用拖垮。配合应用各项指标监控告警,充分利用 MSE 流量治理的实时性能力,及时调整,保障应用高可用。

取得的成果

生产环境应用 100% 完成接入和应用,针对不同场景共配置几十项规则实现高可用防护。通过以上措施的落地实施,全栈系统未再出现过一例因外部突增流量或者下游慢调用而拖垮大盘的情况,效果可谓是立竿见影。

安全发布第一法宝:无损上下线

面临的问题

业务需求开发完成,在发版日准备发版,会发现应用发布后,总会有 5xx 相关的告警,通过 TraceId 一排查,就会发现是这个应用刚启动的新副本实例,经过深入分析,基本对应到以下这几类情况:

  • 非优雅下线:
    • 服务无法及时下线,导致上游应用还在继续调用已下线的副本实例,从而请求处理失败。
  • 非优雅上线:
    • 应用发布后,K8s 就绪检查以健康检查接口来判定,而健康检查接口里包含大量检测依赖服务的检查,耗时过久,造成健康检查不通过。
    • 一些应用在初始化时存在复杂逻辑,导致时间比较长,此时流量过大,会造成大量请求超时、阻塞等问题。

针对性的解法

针对以上问题,分成两个阶段进行针对性解决。

阶段一:采用自研方式

具体做法如下:

  • 非优雅下线:
    • 通过对 Nacos 源码的研究,了解到 Nacos 服务端存在 1 分钟对服务实例元数据记忆逻辑,借助 K8S preStop 机制,Sleep 60s,来达到应用及时准确的下线。
  • 非优雅上线:
    • 统一规范应用健康检查机制,在原有/health 接口里将逻辑变薄,去除原有复杂逻辑,让健康检查足够轻量。
    • 针对初始化逻辑复杂的应用,增加延迟注册的时间,让其在初始化完成后对外提供服务。

阶段二:采用云产品能力

经过上述尝试后,虽然有损发布的情况得到好转,但是在业务高峰期,总是还会遇到,问题并没有得到根本解决。于是,经过详细的方案调研,在自研和云产品之间,杭州铭师堂最终选择了使用 MSE 无损上下线的能力,避免了自己去针对各类场景投入资源进行处理的成本。

取得的成果

实现了 100+Java 应用,下线 100% 无损,上线(不使用 Sharding-JDBC 组件)应用 100% 无损,让发布更有底气,能够将更多的精力聚焦到业务需求本身。

背后的原理

问题得到解决,这背后的原理自然是有必要进行深入的了解,具体如下:

无损下线

MSE Agent 实现上下游的主动通知机制,在下游应用副本下线时,能够做到及时的通知上游应用,剔除已下线副本实例,从而避免了上游应用仍旧调用下游已下线实例,造成 Connect Refused 等相关错误。

无损上线

MSE Agent 结合延迟注册能力和小流量预热能力,有效保障在服务初始化完成后,才对外进行服务的提供。在外部流量进入实例时,采用线性增长的方式控制进入的请求数,避免流量过高导致超时、阻塞等问题。

安全发布第二法宝:全链路灰度

面临的问题

解决了有损发布的问题后,从单应用维度,就已经做到了安全发布,不用再担心发布造成的业务功能不可用的问题。但是,从全链路的角度,单个应用的安全发布,还远远不够。应用发布后,新功能如何让内部人员先进行验证?内部人员验证后,如何让小部分真实用户进行验证?验证发现问题后,如何快速进行恢复?这一系列复杂的问题,需要靠全链路灰度的能力来进行解决。

针对性的解法

针对全链路灰度实践,杭州铭师堂分成两个阶段:

  • 早期,通过开源 Nepxion Discovery 框架自研了一套解决方案,在业务流量不高,场景不复杂的情况下,这套解决方案还是可以满足组织要求,慢慢随着使用深度的增加,SDK 升级不够灵活、性能达不到要求、改造成本越来越高的问题逐步暴露,此时,就需要一套更加轻量级的解决方案。
  • MSE 全链路灰度产品提供以 Agent 方式进行动态接入,接入成本低;默认支持当下主流框架,不需要使用方进行开发,接入即可用,使用难度低;能力设计开放性强,满足个性化流量染色诉求,灵活性高。

接下来,针对目前现有的全链路灰度能力,做下详细讲解,大致分为几个核心模块:

  • MST 发布系统:提供灵活的应用 MAM 模型,可以动态接入 MSE Agent。
  • MST 流量治理平台:自研灰度规则的管理平台,提供符合 MST 特色的灰度场景使用规则。
  • MST 统一入口网关:Go 语言开发的自研 wasm 插件,进行灰度规则判定,实现核心染色逻辑。
  • MST 静态渲染服务:自研前端静态资源的控制服务,实现前端页面的灰度能力。
  • 阿里云 MSE Agent:实现 Java 应用间染色标记透传。

取得的成果

基于以上核心模块,杭州铭师堂实现了前后端链路在流量层面和配置层面的灰度能力,并形成一套规范化的使用 SOP:

  • 业务需求上线,先通过内部用户进行功能充分验证。

  • 验证通过后,则按照比例将新功能覆盖到外部用户中,1% -> 5% -> 10%。

  • 选取一定比例外部用户使用新功能,观察符合预期后,则进行灰度转全量,将新版本代码推到 baseline 中,提供给所有用户使用。

全量接入云原生网关:保障统一入口层稳定性

面临的问题

讲完了基础设施层和微服务应用层,视角从下到上,聚焦到统一入口层。一方面,网关作为全栈业务的统一入口,它的重要性不言而喻。另一方面,在高峰期网关需要承载峰值数万+QPS,单日近数十亿次调用的访问压力。二者结合,要保障好网关的稳定性,是一件非常有难度的事情。

从 IDC 到上云,网关架构从 1.0 演变成 2.0:

  • 2018、2019 年第一代网关架构,上层采用 Nginx 作为流量网关,下层采用 Spring Cloud Zuul 1.0 搭建的业务网关。规则管理和配置复杂度高,缺乏热加载能力,规则修改后生效时间长。
  • 2022 年第二代网关架构,流量网关从 Nginx 替换为 APISIX,下层依旧是 Spring Cloud Zuul 1.0 搭建的业务网关。APISIX 较 Nginx,具备更好的灵活性和可扩展性,但是因为引入了 etcd 集群,增加运维复杂度。另外,针对自定义插件的更新成本较高,缺乏版本化管理和秒级升级与回滚能力。
针对性的解法

2023 年第三代网关架构,利用 MSE 云原生网关合并流量网关和业务网关,整体链路从两层变一层,作为 Higress 的商业版,其性能和稳定性较前两代网关架构而言具有非常显著的优势。

取得的成果

通过云原生网关的落地,为组织带来了诸多收益,其中 SLA 提升至 100%,财务成本降低 67%,算力成本降低 75%,每次请求 RT 减少 5ms。

背后的原理

以上成果得益于云原生网关的核心能力:

高可用

基于 MSE 体系的高可用能力建设,生产环境使用至今近 9 个月的时间,历经寒暑假 2 轮高峰期数十万在线人数的压力,从未发生过网关不可用问题。

高性能

通过软硬结合的方式,提供了 HTTPS 硬件加速、OS 内核调优、Envoy 参数调优等多种手段,QPS 性能远远超出预期。

高扩展

原本在 APISIX 里基于 Go 语言自研的灰度 wasm 插件,可以平滑迁移到云原生网关使用,并在灰度插件迭代过程中,能够提供秒级升级和回滚的能力,从原本小时级别缩短到秒级别,极大的降低了升级成本,充分解放生产力。

未来展望(精益用云,增效降本,引领业务)

在短短 2-3 年间,杭州铭师堂完整经历了云计算应用的四个关键阶段:从“启动上云”到“全量上云”,再到“全栈用云”,最终达到“精益用云”。也从云计算的第一次浪潮,迈过了第二次浪潮,顺利的进入到了 第三次浪潮 AI + 云。

时光荏苒,最初上云是希望借助云的极致弹性,保障产品稳定性的基本盘,杭州铭师堂始终坚持站在巨人的肩膀上进行创新,过程中做擅长的事情,将背后交给阿里云非常专业的产研团队,历经双十一的千锤百炼,共同助力业务。

当下,在连续拿下稳定性目标后,接下来,将更多的关注开发和测试阶段研发过程中质量与效率问题,力求在需求迭代更早阶段做好质量和效率的建设,保障业务高效率、高质量的完成交付。此外,在业务多个方面进行着 AI 领域的探索,期望以云 + AI 的方式进行业务创新,用新思路、新方法来重塑升级业务能力。

未来,杭州铭师堂将持续深耕云计算 与 AI,在云计算的第三次浪潮上,披荆斩棘,迎风破浪,去助力业务,引领业务,最终走向经营业务,给客户带来更好产品体验的同时,带着对教育创新的热忱与使命感,为共同推动教育事业走向更为优质、更为创新的发展做出更大贡献。

相关文章:

杭州铭师堂的云原生升级实践

作者:升学e网通研发部基建团队 公司介绍 杭州铭师堂,是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育,让中国人都有好书读”的使命,致力于用“互联网教育”的科技手段让更多的孩子都能享有优…...

计算机网络之---MAC协议

MAC协议的作用 在数据链路层中,MAC(媒介访问控制)协议负责控制设备如何访问共享的通信介质(如以太网、无线电波等),确保在多台设备共享同一传输媒介时能够有效地进行数据传输,避免冲突、控制流…...

微服务面试相关

Spring Cloud Spring Cloud五大组件 注册中心:Eureka、Nacos Ribbon负载均衡、负载均衡策略、自定义负载均衡 Ribbon负载均衡流程 Ribbon负载均衡策略 自定义负载均衡 服务雪崩、熔断降级 微服务监控-skywalking 业务相关 微服务限流(令牌桶、漏桶算法…...

Google发布图像生成新工具Whisk:无需复杂提示词,使用图像和人工智能将想法可视化并重新混合

Whisk 是 Google Labs 的一项新实验,可使用图像进行快速而有趣的创作过程。Whisk不会生成带有长篇详细文本提示的图像,而是使用图像进行提示。只需拖入图像,即可开始创建。 whisk总结如下: Whisk 是 Google 实验室最新的生成图像实…...

docker pull(拉取镜像)的时候,无法下载或者卡在Waiting的解决方法

docker pull的时候,卡在Waiting的解决方法 一般情况(大部分镜像都可以拉取)更换镜像源 进一步(如es等拉取不到)在镜像同步站搜索详细步骤 还可以在挂载的时候,让其下载对应的版本 一般情况(大部…...

51c~Pytorch~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12311033 一、Pytorch~训练-使用 这里介绍了Pytorch中已经训练好的模型如何使用 Pytorch中提供了很多已经在ImageNet数据集上训练好的模型了,可以直接被加载到模型中进行预测任务。预训练模型存放在Pytorch的…...

windows下,golang+vscode+delve 远程调试

1 先在远程服务器安装golang和delve golang的安装,通过官网直接下载安装包安装接口 go install github.com/go-delve/delve/cmd/dlvlatest 如果dlv和golang版本不匹配,这里把latest换成匹配的版本,比如1.20.0 2 编译带调试信息的程序 go bu…...

弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了

网址: (63条消息) DSIStudio简体中文汉化版(2022年7月)-算法与数据结构文档类资源-CSDN文库...

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接:https://arxiv.org/pdf/2412.19761 项目链接:https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题,目标是利用 I2V 模型的生成能力,将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…...

多维方向性增强分割通过大规模视觉模型实现|文献速递-视觉大模型医疗图像应用

Title 题目 Multidimensional Directionality-Enhanced Segmentation via large visionmodel 多维方向性增强分割通过大规模视觉模型实现 01 文献速递介绍 黄斑疾病影响全球约2亿人,已成为视力损害的主要原因之一。黄斑是视网膜中光感受器密度最高的区域&#…...

【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在 Linux 系统中,静态库和动态库是开发中常见的两种库文件类型。它们在编译、链接、内存管理以及程序的性能和可维护性方面有着…...

远程和本地文件的互相同步

文章目录 1、rsync实现类似git push pull功能1. 基础概念2. 示例操作3. 定制化和进阶用法4. 定时同步(类似自动化) 2 命令简化1. 动态传参的脚本2. Shell 函数支持动态路径3. 结合环境变量和参数(更简洁)4. Makefile 支持动态路径…...

自然语言处理之jieba分词和TF-IDF分析

jieba分词和TF-IDF分析 目录 jieba分词和TF-IDF分析1 jieba1.1 简介1.2 终端下载1.3 基本语法 2 TF-IDF分析2.1 什么是语料库2.2 TF2.3 IDF2.4 TF-IDF2.5 函数导入2.6 方法 3 实际测试3.1 问题解析3.2 代码测试 1 jieba 1.1 简介 结巴分词(Jieba)是一个…...

探索式测试

探索式测试是一种软件测试风格,它强调独立测试人员的个人自由和职责,为了持续优化其工作的价值,将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动,在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…...

服务器数据恢复—raid5故障导致上层ORACLE无法启动的数据恢复案例

服务器数据恢复环境&故障: 一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统,部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动,ORACLE数据库也无法启动。 服…...

ISP各模块功能介绍

--------声明,本文为转载整理------- ISP各个模块功能介绍: 各模块前后效果对比: 黑电平补偿(BLC) 在理想情况下,没有光照射的像素点其响应值应为0。但是,由于杂质、受热等其它原因的影响&…...

Python 数据建模完整流程指南

在数据科学和机器学习中,建模是一个至关重要的过程。通过有效的数据建模,我们能够从原始数据中提取有用的洞察,并为预测或分类任务提供支持。在本篇博客中,我们将通过 Python 展示数据建模的完整流程,包括数据准备、建…...

深入学习RocketMQ

参考&#xff1a;RocketMQ从从入门到精通_rocketmq入门到精通-CSDN博客 1、消息的类型 普通消息 顺序消息 延时消息 批量消息 事务消息 2、在java中使用 2.1、pom.xml中加入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId…...

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本&#xff1a;关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时&#xff0c;部分文档已经修改&#xff0c;而大部分没有修改&#xff0c;为了减少在众多已打开文档中来回跳转的不便&#xff0c;可以将没有修改的文档全部关闭&#xff0c;但目前提供的快速关闭窗…...

数据结构二叉树-C语言

数据结构二叉树-C语言 1.树1.1树的概念与结构1.2树的相关术语1.3树的表示1.4树形结构实际运用场景 2.二叉树2.1概念与结构2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3二叉树存储结构2.3.1顺序结构2.3.2链式结构 3.实现顺序结构的二叉树4.实现链式结构二叉树4.1前中后序遍…...

Python基于YOLOv8和OpenCV实现车道线和车辆检测

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 1、系统主要功能 车道检测&am…...

代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ

94. 城市间货物运输 I 2、Bellman_ford队列优化算法&#xff08;又名SPFA&#xff09; SPFA是对Bellman_ford算法的优化&#xff0c;由于Bellman_ford 算法 每次都是对所有边进行松弛&#xff0c;其实是多做了一些无用功。其实只需要对 上一次松弛的时候更新过的节点作为出发节…...

人工智能学习路线全链路解析

一、基础准备阶段&#xff08;预计 2-3 个月&#xff09; &#xff08;一&#xff09;数学知识巩固与深化 线性代数&#xff08;约 1 个月&#xff09;&#xff1a; 矩阵基础&#xff1a;回顾矩阵的定义、表示方法、矩阵的基本运算&#xff08;加法、减法、乘法&#xff09;&…...

C++语言的学习路线

C语言的学习路线 C是一种强大的高级编程语言&#xff0c;广泛应用于系统软件、游戏开发、嵌入式系统和高性能应用等多个领域。由于其丰富的功能和灵活性&#xff0c;C是一门值得深入学习的语言。本文旨在为初学者制定一条系统的学习路线&#xff0c;帮助他们循序渐进地掌握C语…...

用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(3) —— 基于 LangChain 框架的文档检索与问答功能以及RAG Tool的使用

介绍基于 LangChain 框架的文档检索与问答功能&#xff0c;目标是通过查询存储的向量数据库&#xff08;VectorDB&#xff09;&#xff0c;为用户的问题检索相关内容&#xff0c;并生成自然语言的答案。以下是代码逻辑的详细解析&#xff1a; 代码结构与功能 初始化环境与加载…...

20250110doker学习记录

1.本机创建tts环境。用conda. 0.1安装。我都用的默认&#xff0c;你也可以。我安装过一次&#xff0c;如果修复&#xff0c;后面加 -u bash Anaconda3-2024.10-1-Linux-x86_64.sh等待一会。 (base) ktkt4028:~/Downloads$ conda -V conda 24.9.2学习资源 Conda 常用命令大…...

MPU6050: 卡尔曼滤波, 低通滤波

对于MPU6050(一种集成了三轴加速度计和三轴陀螺仪的惯性测量单元),对加速度值进行卡尔曼滤波,而对角速度进行低通滤波的选择是基于这两种传感器数据的不同特性和应用需求。以下是详细解释: 加速度值与卡尔曼滤波 为什么使用卡尔曼滤波? 噪声抑制: 加速度计信号通常包含…...

C++的标准和C++的编译版本

C的标准和C的编译版本&#xff1a;原理和概念 理解 C标准 和 C编译版本 的关系是学习 C 的一个重要部分。这两者虽然看似相关&#xff0c;但实际上分别涉及了不同的概念和技术。下面将通过层次清晰的解释&#xff0c;帮助新手理解这两个概念的差异、特点及其相互关系。 一、C标…...

python学习笔记—17—数据容器之字符串

1. 字符串 (1) 字符串能通过下标索引来获取其中的元素 (2) 旧字符串无法修改特定下标的元素 (3) index——查找字符串中任意元素在整个字符串中的起始位置(单个字符或字符串都可以) tmp_str "supercarrydoinb" tmp_position1 tmp_str.index("s") tmp_p…...

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…...

判断网站是什么系统做的/广州广告公司

之前想做去雾算法在果园对靶的应用&#xff0c;想要搜集一些资料&#xff0c;包括何凯明博士在IEEE收录的一篇去雾论文Single Image Haze Removal Using Dark Channel Prior-IEEE-Xplore官网论文链接 如果没有特殊渠道获取&#xff0c;得是IEEE允许的一些机构&#xff0c;并且需…...

主流网站开发语言有哪些/网站seo的方法

windows下Sublime Text3 java开发环境的配置:1.编写批处理脚本run.bat放在jdk的bin目录下,例如我的就放在"D:\Java\bin".runbat内容:开始(本行不复制)ECHO OFFcd %~dp1ECHO Compiling %~nx1.......IF EXIST %~n1.class (DEL %~n1.class)javac -encoding UTF-8 %~nx1I…...

小语种网站建设及推广/企业培训机构有哪些

Android中Service的绑定过程时序图 参考&#xff1a; 《Android源代码情景分析》...

网站底部关键词内链/网络推广营销方式

如果问现代人一个问题&#xff0c;你身边最不能缺少的一样物品是什么&#xff0c;估计很多人会回答手机吧&#xff01;手机作为人类最先进便捷的通信工具&#xff0c;改变了我们工作、学习、生活&#xff0c;几乎可以完全代替电脑、电视等&#xff0c;其地位日益提高。随着需求…...

中国体育直播在线观看斯诺克赛/西安seo网站关键词

AngularJS 1.2版本中提供了Controller As语法&#xff0c;简单说就是可以在Controller中使用this来替代$scope&#xff0c;使得Controller更像一个传统的JS类&#xff0c;相对于$scope的继承树要理解上要简单一些。 基础用法 传统的Controller是这样写的&#xff1a; app.contr…...

西安专业做网站建/恩施seo整站优化哪家好

还记得学习 Maven 之前&#xff0c;项目是直接导入 JAR 的&#xff0c;那时候用 Eclipse 还需要 Build Path 一下&#xff0c;那么使用 IDEA 呢。 References https://jingyan.baidu.com/article/0f5fb0993e9e1f6d8334ead2.html...