当前位置: 首页 > 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网通研发部基建团队 公司介绍 杭州铭师堂,是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育,让中国人都有好书读”的使命,致力于用“互联网教育”的科技手段让更多的孩子都能享有优…...

chrome浏览器的更新提示弹窗无法更新Chrome解决方法

使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本,家庭版系统没有组策略功能。 按下Win R键,打开 “运行” 对话框,输入gpedit.msc并回车,打开组策略编辑器。 在组策略编辑器中,依次展开 “计算机…...

LLM prompt提示构造案例:语音回复内容;o1思维链

1、语音回复内容 目的: 语音聊天助手的prompt,让大模型来引导聊天内容,简短和友好,从而文字转语音时候也比较高效。 ## 角色设定与交互规则 ### 基本角色 你是用户的好朋友. 你的回答将通过逼真的文字转语音技术阅读. ### 回答规则…...

OceanBase 学习计划全攻略:开启分布式数据库探索之旅

《OceanBase 学习计划全攻略:开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代,数据库作为企业信息存储与管理的核心基础设施,其性能、可靠性和扩展性至关重要。OceanBase 作为一款具有卓越分布式特性的国产数据库,正…...

Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式

Linux 虚拟机与windows主机之间的文件传输 设置共享文件夹方式 在虚拟机中打开终端查看是否已经新建完成,到文件夹中找到它看一下,这个位置就能存储东西啦...

React Context用法总结

1. 基本概念 1.1 什么是 Context Context 提供了一种在组件树中共享数据的方式,而不必通过 props 显式地逐层传递。它主要用于共享那些对于组件树中许多组件来说是"全局"的数据。 1.2 基本用法 // 1. 创建 Context const ThemeContext React.createC…...

Linux好用软件

力荐软件 apt-fast:更快速的软件管理安装过程会进入一个图形界面,配置线程数等信息,全部默认即可 sudo add-apt-repository ppa:apt-fast/stable sudo apt-get update sudo apt-get -y install apt-fast 以后安装应用,把apt-get直接替换成apt-fast即可,例如安装vlc sudo…...

【MYSQL】

文章目录 1.DDL 1.DDL --添加字段 ALTER TABLE table_name add COLUMN embed_model VARCHAR(32) NOT NULL COMMENT 名称备注 COLLATE utf8mb4_bin AFTER config_code;--修改字段 ALTER TABLE table_name CHANGE COLUMN column_a column_b VARCHAR(500) NOT NULL COMMENT 配置信…...

webrtc之rtc::ArrayView<const uint8_t>

rtc::ArrayView<const uint8_t> 是 WebRTC&#xff08;或其他基于 rtc 命名空间的库&#xff09;中常见的一个类型&#xff0c;它通常用于表示一块 只读的内存区域&#xff0c;该内存区域由一系列 uint8_t 类型&#xff08;无符号 8 位整数&#xff09;元素组成。 1. rt…...

深入理解 MySQL 的 EXPLAIN 工具

1. 什么是 EXPLAIN 工具&#xff1f; EXPLAIN 是 MySQL 中用来分析 SQL 查询执行计划的命令&#xff0c;它能够显示查询在执行时会如何访问表、使用哪些索引、扫描多少行等信息。通过 EXPLAIN 工具&#xff0c;开发者可以直观地了解查询的执行过程&#xff0c;从而进行针对性的…...

谷歌Google、紫鸟浏览器插件开发

对于跨境电商行业的IT部门来说&#xff0c;经常需要获取各种店铺相关数据&#xff0c;但是仅靠官方提供的接口来获取数据远远不够&#xff0c;这个时候我们就需要插件或者RPA的方式来获取数据。 以下是关于自研紫鸟插件的简单demo&#xff0c;紫鸟浏览器使用的是火狐和谷歌的插…...

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…...

Win32汇编学习笔记09.SEH和反调试

Win32汇编学习笔记09.SEH和反调试-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…...

计算机组成原理(九):乘法器

乘法器原理 乘法器的工作原理可以用二进制乘法来说明。二进制乘法和十进制乘法类似&#xff0c;通过部分积的累加得到结果。 部分积的生成 在二进制乘法中&#xff0c;每一位的乘积是两个二进制数位的 与运算&#xff08;0 0 0&#xff0c;1 0 0&#xff0c;0 1 0&…...

前端开发中常用的插件库

ahooks 一个高质量且可靠的React Hooks库。class-variance-authority&#xff08;CVA&#xff09; 是一个专注于解决CSS类管理问题的库。classnames 是一个在React开发中非常流行的JavaScript工具库&#xff0c;它可以帮助开发者有条件地连接类名字符串。copy-to-clipboard 一个…...

认识+安装ElasticSearch

1. 为什么要学习ElasticSearch? 一般的来说,项目中的搜索功能尤其是电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 1.1 数据库搜索所存在的问题 1.1.1 查询效率较低 由于数据库模糊查询不走索引&…...

Nginx | 解决 Spring Boot 与 Nginx 中的 “413 Request Entity Too Large“ 错误

关注&#xff1a;CodingTechWork 引言 在 Web 开发中&#xff0c;413 Request Entity Too Large 是一种常见的 HTTP 错误&#xff0c;它指示客户端请求的实体&#xff08;例如文件或数据&#xff09;超出了服务器允许的最大大小。对于使用 Spring Boot 和 Nginx 的应用程序来说…...

CAD批量打印可检索的PDF文件

本文虽介绍CAD使用方法&#xff0c;但还是劝告大家尽早放弃使用CAD软件。。。。太TM难用了 当你打开CAD时发现如下一堆图纸&#xff0c;但是不想一个一个打印时。你可以按照下面操作实现自动识别图框实现批量打印。 1.安装批量打印插件 2.安装后打开CAD&#xff0c;输入命令Bp…...

理解Unity脚本编译过程:程序集

https://docs.unity3d.com/Manual/script-compilation.html 关于Unity C#脚本编译的细节&#xff0c;其中一个比较重要的知识点就是如何自定义Assembly。 预定义的assembly 默认情况下&#xff0c;Unity会按照这个规则进行编译。 PhaseAssembly nameScript files1Assembly-…...

Linux-Ubuntu之SPI串行通信陀螺仪和加速度计

Linux-Ubuntu之SPI串口通信陀螺仪和加速度计 一&#xff0c;SPI通信原理二&#xff0c;ICM-20608六轴传感器控制三&#xff0c;代码1.小tip 一&#xff0c;SPI通信原理 SPI&#xff1a;串行全双工通信&#xff0c;最高能达到百MHZ&#xff0c;通常一个主设备跟多个从设备&…...

【C++/控制台】2048小游戏

源代码&#xff1a; #include <iostream> #include <windows.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h>// #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)…...

github gitbook写书

github创建新的仓库 在仓库中添加目录 ‘SUMMARY.md # Summary * [简介](README.md)gitbook 新建一个site https://www.gitbook.com/ 注册账号 取名字 一路 next&#xff0c;注意选免费版 最后 gitbook同步到github 你在主页可以看到 刚刚的test网站 点击右上角圈出来…...

鸿蒙中调整应用内文字大小

1、ui Stack() {Row() {ForEach([1, 2, 3, 4], (item: number) > {Text().width(3).height(20).backgroundColor(Color.Black).margin(item 2 ? { left: 8 } : item 3 ? { left: 7 } : { left: 0 })})}.width(97%).justifyContent(FlexAlign.SpaceBetween).padding({ ri…...

欧拉公式和傅里叶变换

注&#xff1a;英文引文机翻&#xff0c;未校。 中文引文未整理去重&#xff0c;如有异常&#xff0c;请看原文。 Euler’s Formula and Fourier Transform Posted byczxttkl October 7, 2018 Euler’s formula states that e i x cos ⁡ x i sin ⁡ x e^{ix} \cos{x} i …...

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …...

Robot---奇思妙想轮足机器人

1 背景 传统机器人有足式、轮式、履带式三种移动方式&#xff0c;每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动&#xff0c;能源利用率高、移动速度快&#xff0c;但是仅以轮子与地面接触&#xff0c;缺乏越障能力和对复杂地形的适应能力&#xff0c;尤其面对…...

升级 Spring Boot 3 配置讲解 —— 如何处理文件上传下载?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 1. 环境准备 在开始之前&#xff0c;确保你已经具备以下环境&#xff1a; JDK 17 或更高版本&#xff08;Spring Boot 3 要求的最低 JDK 版本&#xff09;Maven 或 Gradle 构建工具Spr…...

(四)结合代码初步理解帧缓存(Frame Buffer)概念

帧缓存&#xff08;Framebuffer&#xff09;是图形渲染管线中的一个非常重要的概念&#xff0c;它用于存储渲染过程中产生的像素数据&#xff0c;并最终输出到显示器上。简单来说&#xff0c;帧缓存就是计算机图形中的“临时画布”&#xff0c;它储存渲染操作生成的图像数据&am…...

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下&#xff0c;实时通信已然稳稳扎根于人们生活与工作的方方面面&#xff0c;成为了其中不可或缺的关键一环。回首日常生活&#xff0c;远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟&#xff0c;齐聚一堂共商…...

Python文件操作

文件的编码 文件编码 思考&#xff1a;计算机只能识别&#xff1a;0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢&#xff1f; 答案&#xff1a;使用编码技术&#xff08;密码本&#xff09;将内容翻译成0和1存入。 编码技术即&am…...

【渗透测试术语总结】

Top 渗透测试常用专业术语 相信大家和我一样&#xff0c;搞不清这些专业名词的区别&#xff0c;所以我来整理一下。 1. POC、EXP、Payload与Shellcode POC&#xff1a;全称 Proof of Concept &#xff0c;中文 概念验证 &#xff0c;常指一段漏洞证明的代码。 EXP&#xf…...

利用ArcGIS快速准确地统计出地块的现状容积率

研究目的 根据建筑.dwg、建筑.dwg Annotation、建筑.dwg Polygon&#xff0c;地籍边界.shp等数据&#xff0c;利用GIS快速准确地统计出地块的现状容积率。 研究思路 加载数据图层&#xff1a;建筑.dwg Polygon、建筑.dwg Annotation&#xff0c;使用空间连接功能把建筑层数数…...

Linux:守护进程

一、套路 直接来&#xff0c;不铺垫了&#xff1b; #include<iostream> #include<string> #include<cstdlib> #include<unistd.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<funtl.h> const …...

《Spring Framework实战》3:概览

欢迎观看《Spring Framework实战》视频教程 Spring Framework 为基于现代 Java 的企业应用程序提供了全面的编程和配置模型 - 在任何类型的部署平台上。 Spring 的一个关键要素是应用程序级别的基础设施支持&#xff1a;Spring 专注于企业应用程序的 “管道”&#xff0c;以便…...

【云商城】高性能门户网构建

第3章 高性能门户网构建 网站门户就是首页 1.OpenResty 百万并发站点架构 ​ 1).OpenResty 特性介绍 ​ 2).搭建OpenResty ​ 3).Web站点动静分离方案剖析 2.Lua语法学习 ​ 1).Lua基本语法 3.多级缓存架构实战 ​ 1).多级缓存架构分析 用户请求网站&#xff0c;最开始…...

IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

日前&#xff0c;IvorySQL 4.0 重磅发布&#xff0c;全面支持 PostgreSQL 17&#xff0c;并且增强了对 Oracle 的兼容性。关于 IvorySQL 4.0 的介绍&#xff0c;各位小伙伴可以通过这篇文章回顾&#xff1a;IvorySQL 4.0 发布&#xff1a;全面支持 PostgreSQL 17. 在 IvorySQL…...

GESP202312 四级【小杨的字典】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202312 四级] 小杨的字典 题目描述 在遥远的星球&#xff0c;有两个国家 A 国和 B 国&#xff0c;他们使用着不同的语言&#xff1a;A 语言和 B 语言。小杨是 B 国的翻译官&#xff0c;他的工作是将 A 语言的文章翻译成 B 语言的文章…...

数据库_解决SQL Server数据库log日志过大,清理日志文件方法

SQL Server数据库日志文件过大的原因主要有几个方面&#xff1a; 事务日志记录了所有对数据库进行修改的操作&#xff0c;如插入、更新和删除&#xff0c;这些操作会不断增加日志文件的大小。 长时间运行且未正确结束的事务会持续占用事务日志中的空间&#xff0c;导致日志文…...

Java 的单例模式详解及优化

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢

本篇目录 1. 问题背景2. 部署gitlab 17.52.1 添加repo源2.2 添加repo源 下载17.5.0的charts包2.3 修改values文件2.3.1 hosts修改如下2.3.2 appConfig修改如下2.3.3 gitlab下的sidekiq配置2.3.4 certmanager修改如下2.3.5 nginx-ingress修改如下2.3.6 <可选> prometheus修…...

[python3]xlrd不支持Excel xlsx文件类型

https://xlrd.readthedocs.io/en/latest/ xlrd is a library for reading data and formatting information from Excel files in the historical .xls format. 解决办法&#xff1a;指定支持的版本1.2.0&#xff0c;pip3 install xlrd1.20 pip3 install xlrd1.2.0 Looking …...

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…...

【网络协议】动态路由协议

前言 本文将概述动态路由协议&#xff0c;定义其概念&#xff0c;并了解其与静态路由的区别。同时将讨论动态路由协议相较于静态路由的优势&#xff0c;学习动态路由协议的不同类别以及无类别&#xff08;classless&#xff09;和有类别&#xff08;classful&#xff09;的特性…...

DevOps:CI、CD、CB、CT、CD

目录 一、软件开发流程演化快速回顾 &#xff08;一&#xff09;瀑布模型 &#xff08;二&#xff09;原型模型 &#xff08;三&#xff09;螺旋模型 &#xff08;四&#xff09;增量模型 &#xff08;五&#xff09;敏捷开发 &#xff08;六&#xff09;DevOps 二、走…...

网络安全 | WAF防护开通流程与技术原理详解

关注&#xff1a;CodingTechWork 引言 随着互联网安全形势的日益严峻&#xff0c;Web应用防火墙&#xff08;WAF, Web Application Firewall&#xff09;逐渐成为网站和应用的标准防护措施。WAF能够有效识别和防止如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、恶意流…...

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…...

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…...

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat

1.思维导图 2.练习 1&#xff1a;使用C语言编写一个简易的界面&#xff0c;界面如下 1&#xff1a;标准输出流 2&#xff1a;标准错误流 3&#xff1a;文件流 要求&#xff1a;按1的时候&#xff0c;通过printf输出数据&#xff0c;按2的时候&#xff0c;通过p…...

人工智能知识分享第九天-机器学习_集成学习

集成学习 概念 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器&#xff08;基学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知的样本进行预测时…...

腾讯云AI代码助手编程挑战赛-武器大师

作品简介 对话过程能够介绍二战 各种武器 冷战 武器 现代的 各种武器装备&#xff0c;陆海空三军都知道。 技术架构 使用全后端分离的架构&#xff0c;前端使用Vue脚手架&#xff0c;腾讯云修改样式css 开发环境、开发流程 系统&#xff1a;win11 开发工具&#xff1a;VS…...