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

上下游服务间解耦的技术与管理

一、解耦为何至关重要

在当今软件研发的复杂生态中,耦合问题如影随形,困扰着众多开发者与企业。当多个模块、系统或团队紧密交织,相互依赖程度不断攀升,仿佛一张错综复杂的网,牵一发而动全身。就拿电商系统来说,订单模块、库存模块、支付模块紧密耦合,一旦订单模块出现故障,库存更新停滞,支付流程受阻,整个业务瞬间陷入僵局,用户体验大打折扣,企业也将面临巨大损失。

从技术发展历程看,早期软件规模较小,功能相对单一,耦合问题尚不突出。但随着业务的爆发式增长,软件系统日益庞大复杂,传统的紧耦合架构愈发难以应对。如今,分布式系统、微服务架构大行其道,如何实现上下游服务间的有效解耦,已然成为提升系统扩展性、灵活性与可维护性的关键突破口,也是团队高效协作、快速响应业务变化的核心要素。解耦,绝非仅仅是技术层面的优化,更是关乎企业在数字化浪潮中能否稳健前行、持续创新的战略抉择。

二、上下游服务解耦的核心概念

2.1 上下游思维定义

在 DDD(领域驱动设计)建模方法里,当我们明确了限界上下文(bounded context)后,会在上下文映射(context mapping)中用上下游来表明上下文依赖走向。其判定依据为下游得了解上游的领域知识,才能顺利开展业务,反之,上游业务能力的施展并不依赖下游业务是否存在。这意味着,上游专注于提供业务能力,下游则凭借上游输出的业务能力,作为自身开展业务的基石。

不妨以电商系统里的订单服务与派送服务为例,订单服务作为上游,掌管订单的生成、处理等关键环节,拥有订单相关的核心领域知识,像订单状态的流转规则、订单金额的计算逻辑等。派送服务作为下游,它要顺利完成派送任务,就必须知晓订单的配送地址、收件人信息等来自订单服务的领域知识,依据这些信息规划配送路线、安排配送人员。而订单服务在生成、处理订单过程中,并不需要提前知晓派送服务的具体运作细节,完全按照自身业务规则运行。如此一来,上下游各司其职,依托彼此明确的依赖关系,推动业务流程稳步前行。

2.2 耦合级别剖析

基于服务上下游的思维模式,我们从领域知识与业务可用性这两个关键维度,将服务间依赖的耦合度细致地划分为四个级别。

Level4:此级别属于高耦合状态,领域知识互为上下游,业务可用性也互为上下游。就像前面提及的订单服务与派送服务通过同步 API 紧密相连的场景,双方不仅在业务执行时要频繁交互对方领域知识,以实现 API 调用,保障功能落地,而且只要一方服务出现故障停机,整个业务流程就如同断了链的项链,瞬间陷入停滞。这种高度耦合在业务初期、规模较小时,开发便捷、沟通成本低,但随着业务扩张,牵一发而动全身的弊端会严重阻碍系统演进。

Level3:领域知识依旧互为上下游,但业务可用性变为单向上下游。为打破 Level4 中业务可用性相互捆绑的僵局,引入消息中间件是常见解法。订单与派送服务改用消息传递信息,服务间基于对方领域模型定义消息结构通信。此时,领域知识仍紧密相连,但业务可用性方面,派送服务不再因订单服务故障而立刻停摆,仅与消息中间件的可用性挂钩。这就要求我们全力保障消息中间件的稳定可靠,为业务高可用筑牢根基。

Level2:领域知识转化为单向上下游,业务可用性保持互为上下游。当领域限界上下文边界清晰后,派送服务作为上游,完成派送更新订单时,将派送详情发往订单服务,订单服务解析后更新订单状态。双方通过 API 集成,派送服务依 Open Host Service(OHS) / Published Language(PL)输出业务能力,订单服务或遵循上游领域模型,或借防腐层(Anti Cruption Layer - ACL)转换领域模型。此状态下,上下游服务在开放主机接口稳定时,能各自迭代,若接口有变,则需联动评估影响、同步调整,既保障一定独立性,又兼顾协作需求。

Level1:这是低耦合的理想态,领域知识与业务可用性皆为单向上下游。此时上下文边界与依赖关系清晰明了,消息结构由上游系统主导定义、维护。以电商促销场景为例,营销服务(上游)依据策略生成促销消息,发往订单服务(下游),订单服务依既定规则解析处理,不干扰营销服务运行,反之亦然。处于该级别,重点在于依据业务特性精细设计消息结构、集成规则,同时兼顾消息格式兼容性,确保上下游服务在松耦合下高效协同,灵活适应业务变化。

三、解耦的 “神器”:技术手段大揭秘

3.1 消息队列(MQ)

消息队列(MQ)无疑是解耦大军中的先锋利器。想象上下游服务是两个忙碌的车间,上游车间生产速度快,下游车间处理节奏慢,若直接对接,下游车间极易积压任务,导致生产停滞。MQ 恰如一个智能缓冲仓库,上游车间生产完产品(消息),只需将其丢入 MQ,无需等待下游处理,便可继续投入生产;下游车间则按照自身节奏,从 MQ 中取出产品加工,上下游车间得以异步运行,解耦成效显著。

在通信层面,MQ 实现了上下游服务的逻辑解耦与物理解耦。以电商系统为例,订单服务产生订单后,将订单消息发送至 MQ,库存服务、物流服务、支付服务等下游模块自行从 MQ 订阅消息,它们无需知晓订单服务的具体位置与实现细节,仅聚焦于 MQ 中的消息。一旦某个下游服务出现故障,如物流系统崩溃,订单服务依旧能正常向 MQ 发送订单,其他正常的下游服务不受干扰,待物流系统修复,它又能从容地从 MQ 中拉取积压订单消息处理,保障业务流程的韧性。

缓存功能也是 MQ 的一大亮点。在秒杀场景中,大量用户瞬间涌入下单,订单服务若直接调用库存服务扣减库存,库存服务大概率不堪重负而崩溃。引入 MQ 后,订单服务将订单请求快速存入 MQ,便立即向用户返回 “下单成功,正在处理” 的反馈,库存服务再从 MQ 中逐步处理订单,平滑流量高峰,既提升用户体验,又确保系统稳定。

市面上 MQ 产品众多,如 RabbitMQ、Kafka、RocketMQ 等,各自特点鲜明。RabbitMQ 基于 AMQP 协议,功能丰富,支持多种消息模型,对事务、消息确认等特性支持良好,适用于对可靠性、功能完整性要求高的场景;Kafka 依托强大的分布式架构,具备高吞吐量,在大数据处理、日志收集等场景表现卓越;RocketMQ 经阿里海量业务锤炼,性能强劲、稳定性高,适用于大规模分布式系统中的复杂业务场景。企业选型时,需综合考量业务规模、并发量、可靠性要求、技术团队熟悉程度等因素,为系统择一最优 “搭档”。

3.2 接口与数据层面优化

在接口层面,Open Host Service(OHS)/Published Language(PL)是上游服务对外提供业务能力的关键窗口。它定义清晰、稳定的接口,下游服务如同顾客,只需依照这些接口规范获取所需服务,无需深入了解上游内部复杂逻辑。下游服务的防腐层(Anti Corruption Layer - ACL)则像一道屏障,将上游传递的领域模型转换为适配自身业务的模型,避免上游领域模型的频繁变动直接冲击下游。例如,电商系统中,营销系统作为上游推出复杂多变的促销活动,订单系统作为下游,借助 ACL 将营销系统传来的促销规则数据转化为自身能高效处理的格式,既能利用上游业务能力,又保持自身业务逻辑的独立性,实现单向依赖,降低耦合风险。

数据层面,数据库读写分离是常用解耦策略。读操作频繁的业务场景下,将读库与写库分离,写库专注处理数据写入、更新,读库全力应对数据查询,各自优化。如内容管理系统,作者发布文章写入写库,大量用户浏览文章从读库获取数据,两者互不干扰,提升性能。垂直拆分数据库也是一大利器,依据业务模块将数据库拆分为多个独立实例,用户数据库、订单数据库、商品数据库各自为政。以电商平台为例,订单数据库故障时,商品浏览、用户注册等业务依托独立数据库仍可正常运行,缩小故障影响范围,降低模块间数据耦合度,为系统稳健运行筑牢根基。

3.3 合理运用域名与服务

域名在解耦之路上扮演着不可或缺的角色。传统以 IP 地址连接上下游服务,犹如用固定坐标定位,一旦 IP 变更,如服务器升级、迁移,所有上游依赖服务都需同步修改配置、重启,牵一发而动全身。将 IP 替换为域名则如同赋予服务一个灵活的 “别名”,运维人员更新域名指向的 IP 后,无需上游服务配合重启,流量便自动迁移至新 IP,大幅降低配置联动,减少耦合麻烦。

在服务与公共库管理领域,精准施策至关重要。对于个性鲜明、与特定业务线紧密捆绑的公共库,如电商平台中房产业务独有的房源展示逻辑代码,将其从通用公共库拆分,封装成房产业务线专属的 jar 包。此后房产业务迭代优化,仅在自身 jar 包内调整,不波及其他业务线,避免 “一人生病,全家吃药” 的尴尬。反之,通用性强、多业务线共用的公共库,如用户认证、权限管理模块,将其下沉为独立服务,通过标准化接口对外提供服务。各业务线以接口调用方式获取服务,如同从公共充电桩获取电力,便捷又解耦,既保障公共功能的一致性,又使各业务线能独立发展,互不干扰,为系统的扩展性与灵活性注入强大动力。

四、“软实力” 支撑:管理策略全知道

4.1 精准定位解耦点

解耦点的精准定位堪称上下游服务解耦的关键 “棋眼”。以服装供应链为例,在快时尚潮流驱动下,其采用混合的精敏供应链策略。上游精益部分,依托平准化生产追逐规模效益;下游敏捷部分,则凭借快速响应拥抱多品种小批量产出。此时,解耦点便是精益与敏捷供应链的 “分水岭”,决定着两者的集成程度。

定位解耦点需综合考量多方面因素。从市场需求看,若消费者对时尚潮流的更迭需求急切,解耦点应适当下移,让下游敏捷环节更贴近市场,快速推出新品;从生产能力出发,若上游生产设备先进、工艺成熟,能稳定输出标准化产品,解耦点可上移,充分发挥上游规模优势。企业需动态权衡,找到契合自身发展的最优解耦位置,实现平准化生产与快速响应需求的精妙平衡,驱动整个供应链高效运转,在激烈市场竞争中脱颖而出。

4.2 团队协作与沟通

在上下游服务解耦的征程中,团队协作与沟通是不可或缺的 “润滑剂”。跨团队紧密合作,方能打通业务流程的 “任督二脉”。上下游团队需主动共享业务知识,下游团队深入了解上游业务逻辑,上游团队洞察下游需求痛点,双方知己知彼,携手共进。

建立高效沟通机制至关重要。定期组织跨团队会议,犹如搭建交流的 “桥梁”,团队成员畅所欲言,同步项目进展、商讨难题解决方案;借助专业文档工具,详细记录接口规范、数据格式、业务流程等关键信息,实现知识沉淀与共享,确保信息传递准确无误。一旦业务需求变更,下游团队及时发出通知,上游团队迅速响应,共同评估影响范围,协同推进系统迭代,让业务需求与技术实现无缝对接,保障项目平稳前行。

4.3 监控与反馈

“千里之堤,溃于蚁穴”,完备的监控与反馈体系是守护解耦后系统稳定运行的坚固 “堤坝”。建立全方位的服务监控体系,犹如为系统配备 “鹰眼”,实时追踪上下游服务的性能指标、可用性状态。从接口响应时间、吞吐量,到服务器资源利用率、错误日志,无一遗漏,精准捕捉系统运行的细微变化。

一旦发现异常,如接口响应超时、服务频繁报错,系统立即发出警报,运维与开发人员迅速响应,依据预先制定的应急预案,精准定位问题根源,及时修复。同时,基于监控数据深度剖析,不断优化解耦策略,调整技术参数、优化接口设计、改进业务流程,持续提升系统稳定性与性能表现,为业务发展保驾护航,让企业在数字化浪潮中稳健前行。

五、实战演练:案例解析

5.1 电商订单系统解耦实践

在电商领域,订单系统堪称业务核心枢纽,与众多上下游服务紧密交织。以某大型电商平台为例,其订单处理流程起初为紧耦合模式:用户下单后,订单系统同步调用库存系统扣减库存、支付系统发起支付、物流系统分配运单号,且需等待各系统响应后,才更新订单状态反馈给用户。如此一来,业务高峰时,问题频发。某次促销活动,订单量瞬间飙升,库存系统因频繁读写数据库响应迟缓,导致订单处理阻塞,大量用户长时间未收到下单反馈,纷纷投诉,支付、物流环节也因订单积压混乱不堪,销售额大幅受损。

痛定思痛,该电商引入 RabbitMQ 进行解耦。订单生成后,订单系统将订单详情封装成消息,发送至 RabbitMQ 特定交换机,依据不同业务规则,路由至库存、支付、物流等队列。库存服务监听库存队列,接收到订单消息后,异步执行库存扣减操作,成功则向 RabbitMQ 发送库存更新消息;支付系统类似,引导用户支付,完成支付流程后,通知 RabbitMQ 支付成功;物流系统获取订单配送信息,分配运单号,将物流单号更新消息回传。订单系统订阅这些关键反馈消息,依据消息内容及时更新订单状态,如支付成功、已发货等,用户界面实时刷新,展示订单最新动态。

经此番解耦改造,系统性能与用户体验显著提升。在后续 “618” 大促中,面对海量订单冲击,各服务依自身节奏从 RabbitMQ 取消息处理,即便库存系统偶现卡顿,订单系统仍能快速将订单存入 MQ,用户即时知晓下单成功,待库存更新后,订单稳步推进后续流程,系统吞吐量提升 50%,用户投诉率骤降 80%,成功助力电商业务腾飞。

5.2 内容平台审核与发布解耦

内容平台业务流程中,审核与发布是关键环节。某知名自媒体平台,创作者发布文章后,起初审核与发布流程紧密绑定:审核服务对文章进行内容、合规等审核,审核通过后直接触发发布流程,将文章推送至前端展示,期间两者代码高度耦合,共用数据库表存储中间状态。随着业务拓展,引入多种审核机制,如机器初审、人工复审,且需对接第三方专业审核机构,同时发布渠道不断丰富,涵盖网页、APP、小程序等多端,原有紧耦合架构弊端尽显。一次系统升级,审核规则调整,因代码相互牵连,发布功能受波及出现漏洞,部分文章未经完整审核即被错误发布,引发舆论风波,平台信誉受损严重。

为化解危机,平台对审核与发布流程大刀阔斧解耦。审核服务作为上游独立模块,聚焦文章审核,审核完成后,不再直接驱动发布,而是向 MQ(选用 Kafka 保障高吞吐量与稳定性)发送审核结果消息,消息含文章 ID、审核状态、审核意见等关键信息。发布服务作为下游,订阅 Kafka 对应主题,接收审核结果,依据结果决定是否启动发布流程。同时,双方重新规划数据库设计,审核服务有专属审核库,记录审核轨迹;发布服务面向多端发布需求,构建独立发布库,存储文章发布状态、各端推送记录等信息,通过数据接口交互必要数据,实现数据隔离。

如此改造后,两边团队可独立迭代。审核团队优化审核算法、拓展审核渠道,不影响发布稳定性;发布团队升级发布引擎、适配新终端,无需顾虑审核逻辑变更。后续业务增长,新审核需求与特色发布功能上线,均能高效融入现有架构,平台内容管理愈发稳健,成功重塑品牌形象,吸引更多创作者与用户入驻,实现业务可持续发展。

六、总结与展望

上下游服务解耦既是一门技术,更是一种艺术,它贯穿于软件系统的全生命周期,从初始设计的蓝图勾勒,到迭代演进的精雕细琢,再到运维保障的保驾护航。通过消息队列、接口优化、数据架构调整、域名与服务的合理运用等技术手段,配合精准的解耦点定位、无间的团队协作、严密的监控反馈等管理策略,企业能够逐步挣脱紧耦合的枷锁,释放系统的潜能,拥抱变化、迎接挑战。

展望未来,随着云计算、大数据、人工智能等前沿技术的迅猛发展,业务需求将愈发多元复杂,上下游服务解耦的探索永无止境。我们需时刻关注行业动态,积极引入新技术、新思维,持续优化解耦方案,方能让系统在数字化浪潮中稳健前行,助力企业在激烈竞争中脱颖而出,实现从优秀到卓越的跨越,书写属于自己的辉煌篇章。

相关文章:

上下游服务间解耦的技术与管理

一、解耦为何至关重要 在当今软件研发的复杂生态中,耦合问题如影随形,困扰着众多开发者与企业。当多个模块、系统或团队紧密交织,相互依赖程度不断攀升,仿佛一张错综复杂的网,牵一发而动全身。就拿电商系统来说&#…...

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐,需要添加四个功能,并且有些还不能生效! 大多数都是教程: 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …...

【Spring】Spring DI(依赖注入)详解——注入参数的细节处理-内部Bean的注入

引言 在现代Java开发中,Spring框架已经成为了构建企业级应用的标准工具之一。Spring的核心特性之一就是依赖注入(Dependency Injection,DI),它通过将对象的依赖关系从代码中解耦出来,提升了代码的可维护性…...

Docker: 教程07 - ( 如何对 Docker 进行降级和升级)

如果我们使用 docker 来管理容器,那么保持 docker 引擎的更新将会是十分重要的,这一篇文章我们将会讨论如何对Docker 进行降级和升级。 准备工作 - docker 环境 我们需要拥有一个安装好 docker 的运行环境。 如果你需要了解如何安装 docker 可以通过如…...

CV-LLM经典论文解读|VTimeLLM: Empower LLM to Grasp Video MomentsVTimeLLM:赋能大语言模型理解视频片段

论文标题 VTimeLLM: Empower LLM to Grasp Video Moments VTimeLLM:赋能大语言模型理解视频片段 论文链接: VTimeLLM: Empower LLM to Grasp Video Moments论文下载 论文作者 Bin Huang, Xin Wang, Hong Chen, Zihan Song, Wenwu Zhu (Tsinghua Un…...

新手学习yolov8目标检测小记2--对比实验中经典模型库MMDetection使用方法(使用自己的数据集训练,并转换为yolo格式评价指标)

一、按照步骤环境配置 pip install timm1.0.7 thop efficientnet_pytorch0.7.1 einops grad-cam1.4.8 dill0.3.6 albumentations1.4.11 pytorch_wavelets1.3.0 tidecv PyWavelets -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -U openmim -i https://pypi.tuna.t…...

Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …...

浙江安吉成新的分布式光伏发电项目应用

摘 要:分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上,利用太阳能进行发电的一种可再生能源利用方式,与传统的大型集中式光伏电站相比,分布式光伏发电具有更灵活的布局、更低的建设成本和更高…...

Git - 记录一次由于少输入了一个命令导致的更改丢失

Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时,中途没有进行commit存档。准备睡觉时,我想创建一个新的分支并将今晚所有更改提交到新分支上(似乎应该开发时候就创建?)。 然后因…...

【Nginx】设置https和http同时使用同一个端口访问

以下是一个同时使用 HTTP 和 HTTPS 并通过 8070 端口的配置示例: server {listen 8070;server_name your_domain.com;location / {root /var/www/html;index index.html;} }server {listen 8070 ssl;server_name your_domain.com;# SSL 证书和私钥的路径ssl_certif…...

Vue 组件开发:构建高效可复用的 UI 构建块

在现代前端开发中,Vue.js 凭借其简洁的 API、渐进式框架设计和强大的生态系统,已经成为众多开发者的首选。Vue 组件化开发是其核心特性之一,它允许我们将复杂的 UI 拆分成多个独立、可复用的组件,从而提高代码的可维护性和可扩展性…...

【Uniapp-Vue3】v-if条件渲染及v-show的选择对比

如果我们想让元素根据响应式变量的值进行显示或隐藏可以使用v-if或v-show 一、v-show 另一种控制显示的方法就是使用v-show,使用方法和v-if一样,为true显示,为false则不显示。 二、v-if v-if除了可以像v-show一样单独使用外,还…...

浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开

问题描述 部署完成Kubernetes Dashboard后,打开HTTPS的web页面,Chrome和Edge浏览器都无法正常加载页面,会提示您的连接不是私密连接的报错。 ​​​​​​​​​​​​ 原因: 浏览器不信任这些自签名的ssl证书,为了…...

asp.net core 属性路由和约定路由

在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。 1. 路由概述 …...

机器学习之模型评估——混淆矩阵,交叉验证与数据标准化

目录 混淆矩阵 交叉验证 数据标准化 0-1标准化 z 标准化 混淆矩阵 混淆矩阵(Confusion Matrix)是一种用于评估分类模型性能的工具。 它是一个二维表格,其中行表示实际的类别,列表示模型预测的类别。 假设我们有一个二分类问题&…...

Java实现UDP与TCP应用程序

三、Java实现UDP应用程序 3.1 InetAddress类 java.net.InteAddress类是用于描述IP地址和域名的一个Java类; 常用方法如下: public static InetAddress getByName(String host):根据主机名获取InetAddress对象public String getHostName()…...

[python3]Excel解析库-calamine,10倍openpyxl性能

calamine 是一个用于读取多种电子表格格式(如 Excel、LibreOffice Calc 等)的 Python 库。它支持 .xls, .xlsx, .ods 和 .csv 文件格式,提供了简单易用的 API 来加载和处理电子表格数据。calamine 的一大特点是它的轻量级和高效性&#xff0c…...

Clisoft SOS设置Server和Project

Clisoft SOS设置Server和Project 一、关于SOS Servers、Clients、Projects和Work Areas 以下三个图是官方文档中介绍的三种情况 图1:带有两个客户端的SOS服务器 图2:使用本地缓存服务器 图3:远程设计团队的缓存服务器 因为SOS软件需要…...

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 (1);里程计费功能:3公里以内起步价8元,超过3公里后每公里2元,其中…...

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢,改为pip下载 复制下载链接到迅雷下载 激活虚拟环境,安装whl,即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl...

Hello 2025(A-C)

补题链接&#xff1a;Dashboard - Hello 2025 - Codeforces A. MEX Table 思路 除了含0的列和行其他的都是0&#xff0c;输出max(n,m)1即可 代码 #include<bits/stdc.h> using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); co…...

Burpsuite20241102macM1版安装

1、安装jdk11 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew update brew install openjdk11 echo export PATH"/opt/homebrew/opt/openjdk11/bin:$PATH" >> ~/.zshrc source ~/.zshrc j…...

jenkins入门10--自动化构建

build periodically&#xff1a;设定类似cron周期性时间触发构建 * * * * * (五颗星&#xff0c;中间用空格隔开&#xff09; 第一颗表示分钟&#xff0c;取值0~59 第二颗表示小时&#xff0c;取值0~23 第三颗表示一个月的第几天&#xff0c;取值1~31 第四颗表示第几月&#xf…...

Java基础概念

自动装箱 Integer i 10; //装箱 int n i; //拆箱 普通数据类型‌&#xff1a;直接在栈内存中分配空间&#xff0c;存储的是具体的值。‌包装类‌&#xff1a;作为对象在堆内存中分配空间。包装类实际上是对普通数据类型的封装&#xff0c;每个包装类都包含了对应的数据类…...

57.在 Vue 3 中使用 OpenLayers 点击选择 Feature 设置特定颜色

在 Web 开发中&#xff0c;地图应用是非常常见的需求&#xff0c;而 OpenLayers 是一个非常强大的地图库&#xff0c;它提供了丰富的地图操作功能。今天&#xff0c;我们将一起学习如何在 Vue 3 中结合 OpenLayers 使用点击事件来选择地图上的 Feature&#xff0c;并设置特定的…...

HTML——61. 单行文本框和密码输入框(主讲input元素的type属性)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单行文本框和密码输入框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单行文本框:1.type"text"2.可…...

h264之多视点mvc编码及解码过程(JMVC平台举例)

h264标准参考平台JMVC是针对MVC标准的&#xff0c;JMVC支持多视点编码、合流、多视点解码操作。可以利用JMVC生成h264 mvc码流和解码。 JMVC的下载地址是&#xff1a;jvet / JMVC GitLabH.264/AVC multi-view coding (MVC) extension JMVC reference softwarehttps://vcgit.hh…...

深度学习blog-深刻理解线性变换和矩阵

深度学习中避免不了矩阵运算&#xff0c;或者张量&#xff08;其实是矩阵数组&#xff09;运算。卷积是矩阵加、乘法&#xff0c;注意力也是一样。本质都一样&#xff0c;所谓注意力&#xff0c;卷积、滤波&#xff0c;是对不必了解数学的人说的&#xff0c;底层都是矩阵运算&a…...

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…...

[笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境

随着 DevOps 流程的普及&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;已成为现代软件开发中不可或缺的一部分。Jenkins 作为一款开源的自动化服务器&#xff0c;广泛应用于 CI/CD 管道的构建与管理。它不仅支持多种编程语言和工具链&am…...

【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】

将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…...

深入浅出:深层网络处理技术的教学指南

引言 在人工智能的浪潮中&#xff0c;深层网络处理技术&#xff08;Deep Learning&#xff09;无疑是最耀眼的明星之一。无论是图像识别、自然语言处理&#xff0c;还是语音识别&#xff0c;深层网络都展现出了强大的能力。然而&#xff0c;对于初学者来说&#xff0c;深层网络…...

深入浅出Node.js-1(node.js入门)

全新专栏带你快速掌握node.js Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;5…...

Django的runserver

当年执行 python manage runserver命令时 1. 先执行 runserver 中的 handle方法 2. 执行 self.run()方法 3. 执行 self.inner_run() 3.1 inner_run 下 run方法的封装 3.1.1 接着看 handle 怎么来的 封装了一个方法 接着找返回函数 3.1.2在 basehttp 下 3.1.3 get_wsgi_appl…...

MySQL 存储引擎

InnoDB InnoDB是MySQL的默认存储引擎&#xff0c;自MySQL 5.5版本起开始使用。它提供了具有提交、回滚和崩溃恢复能力的事务安全&#xff08;ACID兼容&#xff09;存储引擎。 主要特性&#xff1a; 事务支持&#xff1a;完全支持ACID&#xff08;原子性、一致性、隔离性、持久…...

React知识盲点——组件通信、性能优化、高级功能详解(大纲)

组件通信 React 组件通信详解 在 React 中&#xff0c;组件通信是一个核心概念&#xff0c;主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式&#xff0c;包括&#xff1a;父子组件通信&…...

Maven 详细配置:Maven 项目 POM 文件解读

Maven 是 Java 开发领域中广泛使用的项目管理和构建工具&#xff0c;通过其核心配置文件——POM&#xff08;Project Object Model&#xff09;文件&#xff0c;开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心…...

selenium

pythonselenium selenium是一个第三方库&#xff0c;python有很多库&#xff1b; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式&#xff0c;用代码去实现自动化操作和验证的行为。 2、ui自动化的优点&#xff1f; &#xff08;1&#xff09;解决重复性的功能测试…...

网络安全:设备原理与操作

设备型号概述 网络安全企业有哪些&#xff1f; 国外&#xff1a;思科&#xff0c;Juniper&#xff0c;惠普&#xff0c;3Com&#xff0c;。。。。 国内&#xff1a;华为&#xff0c;中性&#xff0c;锐捷&#xff0c;蓝盾&#xff0c;绿盟&#xff0c;山石网科&#xff0c;36…...

pytorch中nn.Conv2d详解及参数设置原则

文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数&#xff1f;1. **in_channels 和 out_channels&#xff08;输入…...

select下拉框,首次进入页面没有显示value的情况

bug场景&#xff1a; 类似这种bug情况排查如下&#xff1a; 首先 理解含义 options就是存放键值对的&#xff0c;id就是key&#xff0c;对上了它就自动把label显示 而且如果你用来当作key和label的字段&#xff0c;与后端返回的不一致&#xff0c;还可以进行更改 其次 排查接…...

接口项目操作图-thinkphp6-rabbitmq

一、用户开户流程 用户首次需要联系商务开通账户&#xff0c;需要提供手机号及来访问的IP。开好户之后&#xff0c;平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…...

thinkphp6.0常用设计模式实例

单例模式 (Singleton) 场景&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 实际业务&#xff1a;数据库连接、日志记录器、配置管理等。 ThinkPHP 6.0 实现&#xff1a; namespace app\common;class DatabaseConnection {private static $instance …...

微服务保护——Sentinel

什么是微服务保护&#xff1f; 微服务保护是一系列用于保障微服务架构稳定、可靠运行的策略与技术手段&#xff0c;在复杂的分布式微服务系统里&#xff0c;它能避免局部故障引发连锁反应&#xff0c;从而维持整个系统的可用性&#xff0c;主要涵盖以下几个关键部分&#xff1a…...

php 多进程那点事,用 swoole 如何解决呢 ?

在 PHP 中&#xff0c;多进程的处理通常会遇到一些挑战&#xff0c;比如资源共享、进程间通信、性能优化等。Swoole 是一个高性能的协程和多进程框架&#xff0c;旨在为 PHP 提供异步、并发、协程等功能&#xff0c;解决了传统 PHP 环境中的多进程管理问题。通过使用 Swoole&am…...

STM32+ADC+DMA快速循环转换

测试平台&#xff1a;STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }...

移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析

摘要&#xff1a;本文旨在探讨移动电商的崛起背景、特点及其对传统电商模式的革新影响&#xff0c;并以开源AI智能名片21链动模式S2B2C商城小程序为具体案例&#xff0c;深入分析其在移动电商领域的创新实践。随着移动互联网技术的飞速发展&#xff0c;移动电商已成为电商行业的…...

QT实现 端口扫描暂停和继续功能 3

上篇QT给端口扫描工程增加线程2-CSDN博客 为按钮pushButton_Stop添加clicked事件&#xff0c;功能为暂停扫描&#xff0c;并在暂停后显示继续按钮&#xff0c;点击继续按钮之后继续扫描 1.更新UI 添加继续按钮 点击转到槽则会自动声明 2. 更新 MainWindow.h 需要新增的部分…...

C_字符数组存储汉字字符串及其索引

字符串就是字符数组&#xff0c;可以定义一个char类型的数组来存储字符串。 如果要存储多个字符串则可以定义一个char类型的二维数组。 存储多个汉字字符串的话&#xff0c;可以考虑用char类型的二维数组。 不过要注意&#xff0c;一个汉字在内存中占用的字节数确实大于一个…...

Linux标准IOday1

1:思维导图 2:将 student.c这个练习题&#xff0c;改成链表后实现 头文件link.h #ifndef __STRUCT_H__ #define __STRUCT_H__ #include <stdio.h> #include <stdlib.h> typedef struct Student{char name[20];double math;double chinese;double english;double…...