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

分布式超低耦合,事件驱动架构(EDA)深度解析

目录

  1. 引言
  2. 什么是事件驱动架构(EDA)
  3. 事件驱动架构的基本原理
  4. 事件驱动架构的特点与优势
  5. 事件驱动架构与分布式系统
  6. 事件驱动架构的关键组件
  7. 事件驱动架构的实施步骤
  8. 常见的事件驱动架构模式
  9. 事件驱动架构在分布式系统中的应用场景
  10. 挑战与解决方案
  11. 总结

引言

在当今的分布式系统架构中,业务复杂性和系统间耦合度不断增加,如何有效解耦并保证系统的高可用性、灵活性与扩展性,成为了架构设计中的重要课题。事件驱动架构(Event-Driven Architecture, EDA) 作为一种应对这一挑战的解决方案,越来越受到开发者和架构师的青睐。

本文将深入分析 事件驱动架构(EDA),探讨其在 分布式系统中的应用,以及如何实现系统的 超低耦合,提升系统的可扩展性和灵活性。


什么是事件驱动架构(EDA)

事件驱动架构 是一种通过事件通知系统状态变化并触发相应操作的架构模式。与传统的请求-响应模式(如 HTTP 请求-响应)不同,EDA 聚焦于事件的生成、传递和消费。事件是一种状态变更的表现,当系统的某个状态发生改变时,会生成一个事件,这个事件可以被其他系统或组件所订阅,并基于这些事件执行相应的动作。

事件驱动架构的核心概念:

  1. 事件(Event)
    事件是对系统状态变化的表示,通常是某种动作或行为的发生。例如,“订单创建成功”或“用户注册”都可以视为事件。

  2. 事件生产者(Event Producer)
    事件生产者是产生事件的实体,它负责检测系统中的变化,并将事件传递给事件总线或消息队列。

  3. 事件消费者(Event Consumer)
    事件消费者是接收并处理事件的实体,消费者通过监听事件并执行特定的业务逻辑来响应事件。

  4. 事件总线(Event Bus)
    事件总线是事件流动的通道,负责将事件从生产者传递到消费者。事件总线可以通过消息队列、消息中间件等实现。

事件驱动架构的典型流程:

  1. 事件生成:系统内部某个组件检测到状态变化,生成事件。
  2. 事件传输:事件通过消息队列、事件总线等传递给相关的事件消费者。
  3. 事件处理:事件消费者根据接收到的事件执行特定的业务逻辑。

事件驱动架构的基本原理

松耦合与异步通信

事件驱动架构的最大优势之一就是实现了系统组件的松耦合。传统的请求-响应架构中,组件之间的依赖关系较强,一个模块的变化可能会影响到其他模块。而在事件驱动架构中,事件生产者和消费者通过事件总线解耦,生产者只需要发布事件,不需要知道谁会消费这些事件;而消费者也只需要订阅自己感兴趣的事件,不需要知道事件是由哪个生产者产生的。这种解耦降低了系统的耦合度。

异步通信与响应式编程

事件驱动架构通常采用异步通信的方式。生产者发布事件后,不需要等待事件消费者的响应,而是继续执行其他操作。消费者收到事件后异步处理,处理完成后可以通过回调、通知等方式告知生产者。这样,系统的处理能力得到增强,并且响应时间也大大缩短。

事件流与事件存储

事件流是事件驱动架构的核心。在事件驱动架构中,事件不仅仅是一个简单的通知,它可能会被存储和积累,以便于后续的分析和处理。通过事件溯源(Event Sourcing),可以在系统中记录每一条事件,形成一个完整的历史事件流,这对于审计、调试和回溯至关重要。


事件驱动架构的特点与优势

1. 超低耦合

EDA 的核心优势之一就是解耦。系统组件之间不直接通信,而是通过事件驱动机制进行消息传递,避免了直接依赖关系。无论是新增模块还是修改模块,只要不改变事件的生产与消费模式,就不会影响到其他组件。

2. 异步处理与高可扩展性

事件驱动架构采用异步模式,能够充分利用系统的处理能力。在流量高峰期,系统可以通过增加消费者的数量来提高处理能力,具有良好的扩展性。

3. 可维护性与灵活性

由于事件驱动架构的模块化特点,各个组件可以独立演化、独立部署,极大提高了系统的灵活性。在发生变化时,只需要调整事件生产者或消费者,不需要重新部署整个系统,降低了维护成本。

4. 高容错性与高可用性

EDA 系统能够在部分服务失败时保证系统整体的可用性。当一个事件消费者不可用时,事件可以通过消息队列等方式暂存,待消费者恢复后再处理,系统不会受到单点故障的影响,提供了更高的容错性。


事件驱动架构与分布式系统

在分布式系统中,事件驱动架构能够很好地应对系统间的通信问题。在分布式系统中,各个服务和模块通常是独立部署的,事件驱动架构能够通过异步消息传递实现跨服务、跨进程的通信,极大地减少了服务间的耦合度。

1. 服务间通信的解耦

分布式系统中,服务之间的通信通常通过 HTTP、RPC 或消息队列等方式进行。在传统的同步通信模式下,一个服务需要等待另一个服务的响应,才能继续执行其他操作。而事件驱动架构采用异步消息机制,事件消费者在后台处理业务逻辑,不会阻塞生产者的请求,从而实现了高效、低耦合的通信。

2. 高可扩展性与高可用性

分布式系统中的事件驱动架构,能够支持横向扩展。系统可以根据业务量动态增加或减少消费者实例,提高系统的可扩展性。同时,由于事件被异步处理,系统的容错性和高可用性也得到了保证。


事件驱动架构的关键组件

1. 事件总线

事件总线是事件驱动架构中传递事件的核心组件。它可以是一个消息队列(如 Kafka、RabbitMQ)或基于事件的消息传递系统。事件总线负责将事件从生产者传递到消费者,并确保事件的可靠性、顺序性和吞吐量。

2. 消息队列

消息队列是事件驱动架构中的常用组件,它作为事件传递的中介,能够异步传递事件,并且支持持久化、优先级、顺序控制等功能。常见的消息队列有 Kafka、RabbitMQ、ActiveMQ 等。

3. 事件存储

事件存储用于存储所有产生的事件,支持事件溯源(Event Sourcing)。事件存储不仅仅是一个日志系统,它保存了每一个事件及其执行状态,并且提供查询、回溯等功能,帮助开发者分析和恢复系统状态。


事件驱动架构的实施步骤

  1. 需求分析与架构设计
    在引入事件驱动架构之前,需要充分分析业务需求,确定需要触发的事件和事件的消费者。

  2. 选择合适的事件总线和消息队列
    选择一个稳定且适合的消息队列或事件总线,用于承载事件的流动。

  3. 定义事件与消费者
    明确事件的定义,包括事件的类型、数据结构、生产方式

等,同时确定消费者的设计模式。

  1. 实现事件发布与订阅机制
    通过代码实现事件的发布与订阅机制,确保事件能够被正确传递与处理。

  2. 测试与优化
    在实现后进行压力测试,确保系统的吞吐量和容错能力,优化性能,确保系统稳定。


常见的事件驱动架构模式

  1. 发布-订阅模式(Pub/Sub)
    生产者发布事件,多个消费者可以订阅并处理该事件。通过事件总线或消息队列实现。

  2. 事件溯源(Event Sourcing)
    所有的状态变化都通过事件记录,事件存储提供完整的历史记录,便于回溯和分析。

  3. CQRS(命令查询责任分离)
    将读操作和写操作分离,写操作通过事件驱动的方式进行,读操作则通过查询操作进行。


事件驱动架构在分布式系统中的应用场景

  1. 微服务架构
    在微服务架构中,事件驱动架构通过异步通信解耦各个微服务,避免了同步通信带来的性能瓶颈。

  2. 实时数据流处理
    事件驱动架构非常适合处理实时数据流,如日志分析、监控系统、IoT 数据处理等。

  3. 金融系统
    在金融领域,事件驱动架构可以用于资金流动、交易处理等业务,确保高效、可靠的事件传递。


挑战与解决方案

  1. 事件的顺序性
    在分布式系统中,确保事件的顺序性是一个挑战。通过使用有序消息队列分布式事务等技术,可以解决这一问题。

  2. 事件重复消费
    由于网络波动或系统故障,事件可能会被重复消费。可以使用幂等性设计去重机制来确保事件只被处理一次。

  3. 事件丢失问题
    通过使用持久化消息队列事务保证机制,确保事件不会丢失。


总结

事件驱动架构(EDA)通过实现超低耦合的消息机制,帮助我们解耦分布式系统中的各个组件,提升系统的可扩展性、容错性和高可用性。虽然实施事件驱动架构面临一些挑战,但随着技术的不断发展,这些问题也能得到有效解决。通过合理选择事件总线、消息队列及事件存储等组件,结合实际的业务需求,事件驱动架构能够为分布式系统提供强大的支撑。

随着技术的发展,EDA 将在越来越多的行业和应用场景中得到广泛应用。

相关文章:

分布式超低耦合,事件驱动架构(EDA)深度解析

目录 引言什么是事件驱动架构(EDA)事件驱动架构的基本原理事件驱动架构的特点与优势事件驱动架构与分布式系统事件驱动架构的关键组件事件驱动架构的实施步骤常见的事件驱动架构模式事件驱动架构在分布式系统中的应用场景挑战与解决方案总结 引言 在当…...

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…...

轻松拿捏Spring

目录 Spring基础 什么是Spring框架 Spring 包含的模块有哪些? Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架 Spring 是一款开源的轻量级 Java 开发框…...

使用 `du` 命令可以查看根目录下每个子目录占用的磁盘空间大小

使用 du 命令可以查看根目录下每个子目录占用的磁盘空间大小。 查看根目录下子目录大小的命令 sudo du -sh /*解释: du:显示文件和目录的磁盘使用情况。-s:只显示每个目录的总大小(不递归显示子目录)。-h&#xff1…...

Python练习之列表的使用

(搭配主页知识点) 【练习要求】 针对知识点列表定义、追加、列表元素读取、查找安排的本实例。要求实现:有一个列表,内容是:[21,25,21,23,22,20],记录的是一批学生的年龄请通过列表的功能(方法),对其进行…...

深入理解 HTTP HEAD 请求:节省带宽、提高效率的秘密武器

序言: 在HTTP协议中,HEAD请求是一种非常实用且被忽略的请求方法。与GET请求相似,HEAD请求同样从服务器获取资源,但与GET请求的最大不同之处在与,HEAD请求 仅返回响应的头部信息,不包含内容提。这使得HEAD请…...

电商数据流通的未来:API接口的智能化与自动化趋势

在数字化时代,电子商务行业正在以前所未有的速度发展,而API(应用程序编程接口)接口作为电商领域的重要组成部分,其应用和发展趋势也日益受到关注。API接口作为电商系统与外部服务或平台交互的桥梁,对电商数…...

[python]使用flask-caching缓存数据

简介 Flask-Caching 是 Flask 的一个扩展,为任何 Flask 应用程序添加了对各种后端的缓存支持。它基于 cachelib 运行,并通过统一的 API 支持 werkzeug 的所有原始缓存后端。开发者还可以通过继承 flask_caching.backends.base.BaseCache 类来开发自己的…...

13.罗意文面试

1、工程化与架构设计(考察项目管理和架构能力) 1.1 你负责的可视化编排项目中,如何设计组件的数据结构来支持"拖拉拽"功能?如何处理组件间的联动关系? // 组件数据结构示例 {components: [{id: comp1,type…...

有监督学习 vs 无监督学习:机器学习的两大支柱

有监督学习 vs 无监督学习:机器学习的两大支柱 有监督学习 vs 无监督学习:机器学习的两大支柱一、有无“老师”来指导二、解决的问题类型不同三、模型的输出不同 有监督学习 vs 无监督学习:机器学习的两大支柱 在机器学习的奇妙世界里&#…...

创建第一个QML项目

文章目录 使用 Qt Creator 创建 Qt Quick 项目详解为什么选择 Qt Creator?1. 打开 Qt Creator2. 选择项目模板3. 设置项目名称与路径4. 定义项目细节5. 配置构建套件6. 检查项目配置7. 编译并运行项目后续操作修改界面添加功能 总结 使用 Qt Creator 创建 Qt Quick …...

【k8s集群应用】K8S二进制安装大致步骤(简略版)

文章目录 K8S二进制安装部署etcd测试etcd集群(可选)恢复etcd数据库 部署master组件部署node组件K8S kubeadm安装关键命令更新kubeadm安装的K8S证书有效期方法一方法二查看证书有效期 K8S二进制安装 部署etcd 使用cfssl工具签发证书和私钥下载解压etcd软…...

cudnn版本gpu架构

nvcc --help 可以看 --gpu-architecture 写到的支持的架构 NVIDIA 的 GPU 架构是按代次发布的,以下是这些架构的对应说明: NVIDIA Hopper: 这是 NVIDIA 于 2022 年推出的架构之一,面向高性能计算(HPC)和人工智能&…...

智能体实战(需求分析助手)一、需求概述及迭代规划

需求分析助手开发迭代规划 功能概述 需求分析助手是一款基于大模型的智能系统,旨在帮助用户高效完成需求获取、需求分析、需求文档编写及需求验证的全流程工作。通过对用户输入的智能处理和分析,需求分析助手能够简化需求管理流程,并根据不同业务场景提供定制化支持。 核心…...

二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++

二叉搜索树 III B:在二叉搜索树II中加入delete指令,创建程序对二叉搜索树T执行如下指令。 插入 k:将key k 插入到 T 中。 find k:报告T中是否存在key k。 delete k:删除key为 k 的节点。 打印:使用中序树遍…...

基于ceres优化的3d激光雷达开源算法

以下是一些基于CERES优化的开源激光雷达SLAM或相关算法: (1) LOAM (Lidar Odometry And Mapping) 简介: LOAM是一种经典的激光雷达里程计和建图算法,它通过提取特征点(角点和平面点),利用ICP(Iterative Cl…...

2023.9 Explainability for Large Language Models: A Survey

问题 可解释性问题:大语言模型(LLMs)内部机制不透明,难以理解其决策过程,如在自然语言处理任务中,不清楚模型如何根据输入生成特定的预测结果。模型评估问题:缺乏有效的评估指标和方法来衡量解…...

集成方案 | Docusign + 金蝶云,实现合同签署流程自动化!

本文将详细介绍 Docusign 与金蝶云的集成步骤及其效果,并通过实际应用场景来展示 Docusign 的强大集成能力,以证明 Docusign 集成功能的高效性和实用性。 在当今商业环境中,流程的无缝整合与数据的实时性对于企业的成功至关重要。金蝶云&…...

[LeetCode-Python版] 定长滑动窗口3——1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

题目 给你一个二进制字符串 s 和一个整数 k 。如果所有长度为 k 的二进制字符串都是 s 的子串,请返回 true ,否则请返回 false 。 示例 1: 输入:s “00110110”, k 2 输出:true 解释:长度为 2 的二进制…...

简单工厂模式和策略模式的异同

文章目录 简单工厂模式和策略模式的异同相同点:不同点:目的:结构: C 代码示例简单工厂模式示例(以创建图形对象为例)策略模式示例(以计算价格折扣策略为例)UML区别 简单工厂模式和策…...

Docker容器五种网络驱动模式详解

Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行,同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动,Docker 可以创建不同类型的网络,以满足各种应用场景的需求。 传统上&am…...

从客户跟进到库存管理:看板工具赋能新能源汽车销售

在新能源汽车市场日益扩张的今天,门店销售管理变得更加复杂和重要。从跟踪客户线索到优化订单流程,再到团队协作,效率低下常常成为许多门店的“隐形成本”。如果你曾为销售流程不畅、客户管理混乱而苦恼,那么一种简单直观的工具—…...

汽车IVI中控开发入门及进阶(41):视频播放器MPlayer

版本: MPlayer 1.5 2022年已发布。 MPlayer 1.5与最新FFmpeg版本(5.0)和当前FFmpeg开发版本(FFmpeg master)兼容。tarball已经包含一个FFmpeg快照,因此不需要单独获取它。如果想遵循MPlayer和FFmpeg的最新改进,强烈建议你使用开发版本。 MPlayer - The Movie Playerht…...

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进,客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径,以强化自身运营,并优化购物体验。达成此目标的最为行之有效的方式之一,便是将 AI 呼叫助手融入您的电子商务平台。我们…...

看板工具助力餐饮与酒店行业实现数字化转型,提升管理与运营效率

在餐饮与酒店行业,服务质量和客户体验是衡量企业成功的关键因素。随着客户需求的不断多样化以及市场竞争的加剧,传统的管理模式逐渐难以满足高效运营的需求。尤其在高峰期,如何优化内部流程、提高服务效率和响应速度,成为了许多餐…...

网络安全(3)_安全套接字层SSL

4. 安全套接字层 4.1 安全套接字层(SSL)和传输层安全(TLS) (1)SSL/TLS提供的安全服务 ①SSL服务器鉴别,允许用户证实服务器的身份。支持SSL的客户端通过验证来自服务器的证书,来鉴别…...

国标GB28181网页直播平台EasyGBS:网络摄像机中的音频及音频编码技术解析

在网络摄像机领域,音频质量及其编码方式对于视频监控系统的整体性能至关重要。音频作为视频监控系统的重要组成部分,不仅能够提供现场的声音信息,增强监控的实时性和准确性,还能在事件发生后为调查提供宝贵的语音证据。 一、网络摄…...

为何VisualRules更适合技术人员使用

什么是规则引擎 规则引擎是一种软件组件,它允许将业务规则从应用程序的核心代码中分离出来,以一种更加灵活、易于管理和维护的方式来定义、存储和执行这些规则。简单来说,它就像是一个专门处理规则的 “大脑”,可以根据预先设定的…...

PyTorch 2.0 以下版本中设置默认使用 GPU 的方法

PyTorch 2.0 以下版本中设置默认使用 GPU 的方法 在 PyTorch 2.0以下版本中,默认情况下仍然是使用 CPU 进行计算,除非明确指定使用 GPU。在 PyTorch 2.0 以下版本中,虽然没有 torch.set_default_device 的便捷方法,但可以通过显式…...

Redis篇-19--运维篇1-主从复制(主从复制,读写分离,配置实现,实战案例)

1、概述 Redis的主从复制(Master-Slave Replication)是一种数据冗余机制,它允许将一台Redis服务器的数据复制到其他Redis服务器。在主从复制中,有一台主服务器(Master)和一个或多个从服务器(Sl…...

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大,容错率低&am…...

Unbuntu下怎么生成SSL自签证书?

环境: WSL2 Unbuntu 22.04 问题描述: Unbuntu下怎么生成SSL自签证书? 解决方案: 生成自签名SSL证书可以使用OpenSSL工具,这是一个广泛使用的命令行工具,用于创建和管理SSL/TLS证书。以下是生成自签名…...

Ubuntu18.04——换源

一、前提说明 系统自带的源往往下载很慢,通过换源操作后,往往下载/更新 速度大幅提升 每种版本对应的不一样,例如Ubuntu18.04和Ubuntu20.04的有差异,所以换源需要根据不同版本对应的命令 二、操作步骤 0.备份原先的 /etc/apt/sou…...

crictl和ctr与docker的命令的对比

crictl是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像 ctr是containerd的一个客户端工具, 接下来就是crictl的的常见命令,其中能完全替代docker命令的参照下列表格 操作crictldocker查看运行容器…...

Java 技术面试常见问题解析

1.说说Mybatis的缓存机制: MyBatis 是一个优秀的持久层框架,它简化了企业应用开发中数据库操作的代码。MyBatis 提供了一级缓存和二级缓存机制来优化对数据库的访问。 一级缓存 (SqlSession级别的缓存) 一级缓存是 MyBatis 中默认开启且无法关闭的缓存机制。它存…...

数据结构,链表的简单使用

任意位置删除&#xff1a; void Any_Del(LinkListPtr h,int a)//任意删 {if(NULLh||a>h->len){printf("删除失败");}LinkListPtr ph;for(int i0;i<a-1;i){pp->next;}LinkListPtr p2p;p2p2->next;p->nextp->next->next;free(p2);p2NULL;h-&g…...

go引用包生成不了vendor的问题

比如我要引入github.com/jinzhu/gorm这个包. 1. 首先获取包 go get github.com/jinzhu/gorm 这时go.mod文件中也有这个包依赖信息了. 2. 然后构建vendor go mod vendor 结果发现vendor目录下没有生成对应的包, 而且modules.txt也注释掉这个包了. 原因是没有其进行引用, go…...

C语言——实现求出最大值

问题描述&#xff1a;利用C语言自定义函数求出一维数组里边最大的数字 //利用函数找最大数#include<stdio.h>int search(int s[9]) //查找函数 {int i , max s[0] , max_xia 0;for(i0;i<9;i){if(s[i] > max){max_xia i;max s[max_xia];}}return max; } in…...

【CSS in Depth 2 精译_081】 13.1:CSS 渐变效果(下)——CSS 径向渐变(13.1.3)+ CSS 锥形渐变(13.1.4)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点&#xff08;上&#xff09;13.1.2 颜色插值方法&#xff08;中&#xff09;13.1.3 径…...

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用&#xff08;以后的重点&#xff09; 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…...

创建项目以及本地仓库和远程仓库并上传项目

创建项目以及本地仓库和远程仓库并上传项目 其详细流程如下&#xff1a; 1、本地创建项目 2、创建本地仓库&#xff08;若使用idea在创建项目时选择了创建.git本地仓库&#xff0c;则此步骤省略&#xff09; 进入到你需要上传的项目的目录下&#xff0c;右键找到Git Bah He…...

代码开发相关操作

使用Vue项目管理器创建项目&#xff1a;&#xff08;vue脚手架安装一次就可以全局使用&#xff09; windowR打开命令窗口&#xff0c;输入vue ui&#xff0c;进入GUI页面&#xff0c;点击创建-> 设置项目名称&#xff0c;在初始化git下面输入&#xff1a;init project&…...

ElasticSearch系列:利用runtime field实现日期字符串实现日期范围查询

在Elasticsearch中&#xff0c;如果你有一个时间字符串字段&#xff0c;并且你希望在查询时将其转换为date类型以便进行日期范围查询或其他日期相关的操作&#xff0c;你可以使用runtime_fields来实现这一转换。不过&#xff0c;与转换为UNIX时间戳不同&#xff0c;Elasticsear…...

前端:如何在静态目录下显示一张图片

假设已经配置&#xff08;或默认配置好&#xff09;public文件夹是静态资源文件夹&#xff0c;public文件夹中的资源会直接映射到根URL。 1. 我的前端图片保存路径是&#xff1a; F:\front\public\icon-favo.png 前端地址是&#xff1a;http://localhost:20002 我想要访问…...

Java设计模式 —— 【结构型模式】桥接模式详解

前言 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。 首先我们看看用继承来实现&#xff1a; 我们可以发现有很多的类&#xff0c;假如我们再增加一个形状或再增加一种颜色&#xff0c;就需要创建更多的类。 试想&#xf…...

Qt同步读取串口

头文件 #include "InsScpi.h" #include <QObject> #include <QSerialPort>class TestSerial : public QObject {Q_OBJECT public:explicit TestSerial(QObject *parent nullptr);//打开设备bool openDevice(const QString &portName);//关闭设备…...

MySQL高可用

MySQL主从复制的过程是怎么样的 分为3个阶段&#xff1a; 写入binlog&#xff1a;主库修改数据后&#xff0c;会写入binlog日志&#xff0c;从库连接到主库后&#xff0c;主库会创建一个log dump线程&#xff0c;用于发送bin log的内容同步binlog&#xff1a;从库会专门创建一…...

OpenHarmony-3.HDF Display子系统(6)

Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多&#xff0c;各厂商的显示屏器件也各有不同&#xff0c;随之针对器件的驱动代码也不尽相同&#xff0c;往往是某一款器件驱动&#xff0c;只适用于某单一内核系统或 SOC&#xff0c;如果要迁移到其他内核或者…...

第10章:CSS最佳实践 --[CSS零基础入门]

代码组织 在CSS开发中&#xff0c;良好的代码组织和最佳实践对于项目的可维护性和扩展性至关重要。以下是两个示例&#xff0c;展示了如何遵循CSS最佳实践来组织代码。 示例 1: 使用 BEM&#xff08;Block Element Modifier&#xff09;命名法 BEM 是一种用于提高 CSS 可读性…...

备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!

完整的思路代码模型见文末 2025 美赛数学建模 C 题 模拟题&#xff1a;城市交通拥堵指数的预测与管理策略 背景 随着全球城市化进程的加快&#xff0c;交通拥堵问题成为城市发展的重要挑战之一。交通拥堵不仅影响居民出行效率&#xff0c;还增加了能源消耗和碳排放。近年来&…...