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

软件架构的演变与趋势(软件架构演变的阶段、综合案例分析:在线电商平台架构演变、开发补充)

随着软件开发技术的不断进步,软件架构从最初的简单结构演变为如今的复杂系统,架构设计不再是简单的代码组合,而是战略性的系统设计,确保系统具备可扩展性、可靠性、安全性和可维护性。

文章目录

  • 1. 软件架构演变的阶段
    • 1.1 单体架构 (Monolithic Architecture)
      • 示例:
    • 1.2 分层架构 (Layered Architecture)
      • 示例:
    • 1.3 微服务架构 (Microservices Architecture)
      • 示例:
    • 1.4 服务网格架构 (Service Mesh Architecture)
      • 示例:
    • 1.5 云原生架构 (Cloud-Native Architecture)
      • 示例:
  • 2. 综合案例分析:在线电商平台架构演变
    • 阶段 1:单体架构 —— 系统初创期
    • 阶段 2:微服务架构 —— 业务增长期
    • 阶段 3:服务网格架构 —— 稳定发展期
    • 阶段 4:云原生架构 —— 大规模扩展期
      • 总结
  • 3. 开发补充
    • 3.1 渐进式架构演进
    • 3.2 结合团队能力与组织结构
    • 3.3 技术选型要务实
    • 3.4 可观测性与监控体系建设
    • 3.5 业务需求驱动与架构技术演进的平衡

1. 软件架构演变的阶段

软件架构的演变可以大致分为以下几个阶段:

阶段主要特点典型案例
单体架构所有功能集中在一个代码库中,模块之间紧耦合。早期的银行系统,CRM系统
分层架构通过分离关注点,拆分为表示层、业务逻辑层和数据访问层。MVC架构模式,早期的ERP系统
微服务架构将系统划分为多个独立部署的小服务,服务之间通过API通信。Netflix, Amazon
服务网格架构专注于微服务间的通信管理、安全、负载均衡等问题。Istio, Linkerd
云原生架构利用云计算的能力构建弹性、高可用的分布式系统。Kubernetes,AWS Lambda

1.1 单体架构 (Monolithic Architecture)

在软件开发的早期,单体架构是最主流的设计。所有的功能和模块都包含在一个大代码库中,系统模块之间紧耦合。这种架构简单、易于开发,但随着系统复杂度增加,维护和扩展难度极大。

  • 优点:

    • 开发初期简单,易于部署。
    • 整个应用作为一个整体进行测试和交付。
  • 缺点:

    • 随着应用增长,代码库变得庞大且难以维护。
    • 发布周期缓慢,任何小变动都需要重新部署整个应用。
    • 难以做到弹性扩展(scale horizontally)。

示例:

+--------------------+
|                    |
|    单体应用         |
|                    |
+--------------------+

在这个模型中,所有业务逻辑、数据库访问、UI渲染等都位于一个应用程序中。任何模块的更改都需要重新构建和部署整个系统。

1.2 分层架构 (Layered Architecture)

为了解决单体架构中关注点分离不清的问题,分层架构通过分离关注点,将系统分为表示层(UI层)、业务逻辑层(Service层)和数据访问层(DAO层)。这种方式促进了代码的可维护性和可扩展性。

  • 优点:

    • 模块化设计,便于开发和维护。
    • 通过明确的层次结构,每一层可以独立更改和替换。
  • 缺点:

    • 层与层之间的依赖导致系统的复杂性增加。
    • 系统仍然是一个整体,扩展和部署问题依旧存在。

示例:

+--------------------+
|      表示层(UI层)  |
+--------------------+
|  业务逻辑层(Service层) |
+--------------------+
|  数据访问层(DAO层) |
+--------------------+

1.3 微服务架构 (Microservices Architecture)

随着企业应用规模的进一步扩大,单体架构和分层架构的缺点愈发明显。微服务架构将一个大系统拆分为多个独立部署的小服务,每个服务专注于一个功能,并通过轻量的通信协议(如HTTP REST, gRPC)进行交互。

  • 优点:

    • 每个服务可以独立开发、部署和扩展。
    • 增强了系统的容错性,一个服务的故障不会影响到其他服务。
    • 支持技术多样性,可以针对不同的服务使用最合适的技术栈。
  • 缺点:

    • 服务间通信复杂度增加,可能需要设计合适的API网关。
    • 数据一致性和事务处理变得复杂。
    • 分布式系统带来的运维复杂性增加。

示例:

+-------------------+      +-------------------+
|     服务A          |  --> |     服务B          |
+-------------------+      +-------------------+↓                     ↓+-------------+      +--------------+|   API 网关   | <--> |    服务C       |+-------------+      +--------------+

1.4 服务网格架构 (Service Mesh Architecture)

在微服务架构的基础上,随着服务数量的不断增加,服务间的通信、负载均衡、安全、认证等问题日益突出。服务网格架构为了解决这些问题应运而生。它为服务之间的通信提供了一种专用的基础设施层,独立于业务逻辑之外。

  • 优点:

    • 提供全面的服务发现、流量管理和安全控制。
    • 提高了微服务间的可观察性和可靠性。
  • 缺点:

    • 增加了架构复杂性,管理和运维成本上升。
    • 对团队的技术要求更高,通常需要专门的DevOps团队。

示例:

+-------------------------------------------+
|                                           |
|                服务网格                   |
|   +---------+  +---------+  +---------+   |
|   |  服务A  |  |  服务B  |  |  服务C  |   |
|   +---------+  +---------+  +---------+   |
|                                           |
+-------------------------------------------+

1.5 云原生架构 (Cloud-Native Architecture)

随着云计算的广泛应用,企业越来越多地采用云原生架构来构建弹性、高可用的分布式系统。云原生架构通常结合容器化技术(如Docker)、编排工具(如Kubernetes)以及无服务器架构(Serverless)来构建和部署应用。

  • 优点:

    • 自动扩展、容错机制和高可用性。
    • 弹性架构,能够应对动态的工作负载需求。
    • DevOps友好,支持快速迭代和持续集成。
  • 缺点:

    • 依赖于云服务提供商,可能存在供应商锁定问题。
    • 开发和运维门槛较高。

示例:

+-------------------------------+
|    Kubernetes 编排平台         |
+-------------------------------+
|   +---------+   +---------+    |
|   | 容器A   |   | 容器B   |    |
|   +---------+   +---------+    |
+-------------------------------+

2. 综合案例分析:在线电商平台架构演变

让我们以一个假设的 在线电商平台 为例,来展示软件架构如何随着业务需求和技术挑战逐渐演变。这个案例可以帮助理解从单体架构到微服务架构,再到云原生架构的过程。

阶段 1:单体架构 —— 系统初创期

背景
当电商平台刚刚上线时,团队规模较小,业务需求较为简单,主要集中在用户登录、商品展示、购物车和订单等基础功能上。此时,系统采用单体架构,所有功能都集中在一个代码库中,部署一个大规模的应用程序。

架构特点

  • 模块:用户、商品、购物车、订单等功能模块都在同一个应用内。
  • 数据库:一个共享的关系型数据库,用于存储所有模块的数据。
  • 发布周期:每次发布时,所有代码一起打包和部署。
+-------------------------------------------------+
|                    单体架构                     |
|   +----------+  +-----------+  +-------------+  |
|   |  用户模块  |  |  商品模块  |  |  订单模块   |  |
|   +----------+  +-----------+  +-------------+  |
|                 +--------------------+          |
|                 | 共享数据库            |        |
|                 +--------------------+          |
+-------------------------------------------------+

优点

  • 开发初期简单,团队不需要复杂的架构设计,快速上线。
  • 一个部署包,方便管理和调试。

缺点

  • 扩展性差:系统负载增加时,整个应用只能进行垂直扩展(例如升级服务器配置),无法单独扩展某个模块。
  • 发布效率低:每次改动都需要重新部署整个应用,即使修改的只是一个模块。
  • 维护难度大:随着代码规模增长,模块间的耦合变得越来越紧,bug容易传播到不同模块。

业务挑战

  • 用户量快速增长,尤其是在促销期间,系统负载激增,影响了整个网站的性能。
  • 每次发布新功能或修复bug时,都需要重新构建整个应用,导致上线时间变长。

阶段 2:微服务架构 —— 业务增长期

背景
随着电商平台的业务扩展,功能不断增加,包括用户个性化推荐、订单管理优化、库存管理等。单体架构难以适应快速变化的需求,于是系统逐步演变为微服务架构。每个模块被拆分为独立的微服务,负责单一功能,并通过API进行通信。

架构特点

  • 模块解耦:每个服务独立开发和部署,比如用户服务、订单服务、商品服务、库存服务等。
  • 数据库分离:每个服务拥有自己的数据库或数据库表,避免数据访问的冲突。
  • 通信方式:服务之间通过轻量协议(如REST API或gRPC)进行通信。
+-------------------------------------------+
|                API 网关                   |
+--------+-----------+----------+-----------+
|        |           |          |           |
| 用户服务 |  商品服务  | 订单服务  | 库存服务  |
+--------+-----------+----------+-----------+
| 数据库 1 |  数据库 2 | 数据库 3 | 数据库 4   |
+--------+-----------+----------+-----------+

优点

  • 弹性扩展:可以根据流量动态扩展不同服务。例如在促销活动期间,仅扩展商品服务和订单服务,而不用扩展整个系统。
  • 独立部署:每个微服务可以独立部署,减少了发布的复杂性。只需更新有变化的服务,而不是重新部署整个系统。
  • 容错性:某个服务的故障不会影响整个系统,其他服务可以正常运行。

缺点

  • 复杂性增加:微服务之间的通信、服务发现、负载均衡等问题增加了系统的复杂性。需要专门设计API网关、服务注册与发现机制。
  • 数据一致性:由于服务分离,跨服务的数据一致性变得复杂,通常需要引入分布式事务或者最终一致性方案。

业务挑战

  • 系统需要处理更多的跨服务通信,例如订单服务需要调用库存服务检查商品库存,用户服务需要处理用户的订单历史等。
  • 由于数据分散到不同服务,如何保证数据一致性和事务性成为新的挑战。
  • 系统运维的复杂度显著增加,需要对每个服务进行独立的监控和管理。

阶段 3:服务网格架构 —— 稳定发展期

背景
随着电商平台的用户量不断增长,微服务之间的依赖关系也变得越来越复杂。团队面临微服务之间通信、流量控制、安全管理和监控等难题。此时,平台引入了服务网格架构,以更好地管理微服务之间的通信、安全和可观测性。

架构特点

  • 服务网格:通过引入服务网格(如Istio或Linkerd),系统不再需要在微服务内部处理复杂的通信逻辑。服务网格负责流量控制、认证、负载均衡和监控等功能。
  • Sidecar 代理模式:每个微服务旁边部署一个sidecar代理,负责服务间的通信。这样业务代码可以专注于核心功能,而不必处理通信、安全等问题。
+-------------------------------------------+
|                服务网格                   |
|   +---------+  +---------+  +---------+   |
|   | 用户服务 |  | 订单服务 |  | 商品服务 |   |
|   +----+----+  +----+----+  +----+----+   |
|        |              |             |     |
|  +-----+----+    +----+-----+   +----+----+|
|  | Sidecar  |    | Sidecar  |   | Sidecar  |
+--+----------+----+----------+---+----------+

优点

  • 统一管理:服务网格提供统一的管理平台,控制服务间的流量、监控和安全策略,简化了微服务管理。
  • 负载均衡和流量分配:能够基于服务网格自动进行流量控制,如蓝绿发布、灰度发布、服务重试等。
  • 服务可观察性:可以通过服务网格收集各个服务的通信数据,提供详细的监控、日志和分布式追踪信息,增强系统的可观察性。

缺点

  • 引入复杂性:虽然服务网格简化了业务代码,但整体架构的复杂性增加,运维和管理服务网格本身也需要经验和能力。
  • 性能开销:Sidecar模式会带来一定的网络和计算开销,可能影响系统性能。

业务挑战

  • 系统内部服务之间的通信和安全变得复杂,需要通过流量控制、认证和加密来保障通信的可靠性和安全性。
  • 服务网格的引入带来了运维和管理的额外成本,需要确保服务网格的高可用性和性能。

阶段 4:云原生架构 —— 大规模扩展期

背景
为了应对电商平台不断增长的用户需求,系统需要具备高弹性和动态扩展能力。同时,业务不再局限于单一市场,平台需要全球部署和跨区域的高可用性支持。此时,引入云原生架构,结合容器化、Kubernetes编排和Serverless架构来实现全自动化扩展和部署。

架构特点

  • 容器化:所有微服务都以容器的形式运行,确保环境的一致性和隔离性。
  • Kubernetes 编排:通过Kubernetes来进行容器的自动化管理,实现服务的动态扩展、弹性负载和自动恢复。
  • 无服务器架构:部分服务可以采用Serverless架构(如AWS Lambda),按需执行函数,进一步提高资源利用率和成本效益。
+--------------------------------------------------+
|          Kubernetes 集群                          |
+-----------------------+--------------------------+
|   +---------+   +---------+   +---------+        |
|   | 容器A   |   | 容器B   |   | Lambda  |        |
|   +---------+   +---------+   +---------+        |
|   自动扩展、负载均衡、服务发现、弹性伸缩          |
+--------------------------------------------------+

优点

  • 弹性和可扩展性:系统可以根据实际的流量需求自动扩展或缩减资源,提升了服务的弹性和可靠性。
  • 快速部署和迭代:通过容器和编排工具,能够快速部署和更新

系统,支持持续交付和快速迭代。

  • 全球可用性:通过云平台的支持,可以轻松实现跨区域的服务部署,提供全球用户的高可用性服务。

缺点

  • 依赖云平台:依赖于云提供商的基础设施,可能存在供应商锁定问题。
  • 运维复杂性:尽管云原生架构带来了自动化和弹性,但对于运维团队来说,管理Kubernetes集群、容器和Serverless等组件仍然需要较高的技术门槛。

业务挑战

  • 全球用户的高并发需求和复杂的跨区域部署要求系统具备高度的弹性和可靠性。
  • 云原生架构虽然解决了资源弹性问题,但如何优化资源利用率和成本控制仍然是一个难题。

总结

通过这一案例分析,我们可以清晰看到系统架构的演变过程。架构的演进是伴随业务增长和技术挑战逐步进行的,而每种架构都有其适用的阶段和场景。在架构设计过程中,团队需要结合实际业务需求、技术能力和未来发展计划,选择合适的架构模式,逐步引入新技术,以确保系统具备良好的扩展性、稳定性和维护性。

3. 开发补充

在架构设计的过程中,架构的演变并不是一蹴而就的,往往需要结合业务需求、技术发展趋势和团队的技术能力,逐步引入合适的架构模式。以下是我从开发中总结的一些经验,供大家在设计系统时参考。

3.1 渐进式架构演进

架构的演进不是一次性的大规模重构,而是一个渐进的过程。在系统初创阶段,单体架构往往是最简单、最合适的选择,因为它易于开发、测试和部署。随着系统的发展,业务复杂度增加,才逐步引入微服务、服务网格或云原生架构。

  • 避免过早优化:不要一开始就引入复杂的架构,特别是在业务和技术不成熟时。过早地引入微服务或云原生架构可能带来不必要的复杂性和技术负担。
  • 分阶段重构:将架构重构作为一个持续的过程,逐步将单体架构拆分为独立的服务或模块,保证每次重构带来的风险最小化。

3.2 结合团队能力与组织结构

架构不仅是技术选择,还应反映团队的组织结构和能力。在不同的架构演变阶段,团队能力和组织形式将直接影响到架构设计的复杂度和成功率。

  • 组织适配架构:在大规模系统中,微服务架构往往反映了团队的组织结构。每个独立的微服务往往由一个团队独立开发和维护。因此,在引入微服务架构时,需要保证团队之间的职责清晰且能独立负责各自的服务。
  • 技术培训与引导:随着架构的演进,引入新的技术(如Kubernetes、服务网格等)需要确保团队有足够的能力进行维护和开发。这不仅包括开发人员,还需要DevOps团队的支持。

3.3 技术选型要务实

技术选型是架构演变过程中极其重要的一环。虽然新兴技术(如Serverless、服务网格、云原生等)非常流行,但并不总是最优选择。务实的技术选型需要结合项目的实际需求、团队技术栈以及可持续发展计划。

  • 业务优先:在做技术选型时,首先考虑的是业务需求。比如,如果系统目前的瓶颈是性能问题,那么优先选择能解决性能问题的技术,而非追求时髦的新技术。
  • 技术稳定性:尽量选择有较好社区支持、经过验证的技术栈,以减少日后的维护成本。对于非常前沿的技术,除非有明确的业务需求,不应轻易引入。

3.4 可观测性与监控体系建设

随着架构的复杂化(特别是在微服务和云原生架构下),系统的可观测性和监控变得至关重要。一个分布式系统的故障排查要比单体架构复杂得多,因此需要确保系统具有良好的监控、日志和追踪体系。

  • 全链路追踪:在分布式系统中,引入全链路追踪工具(如Jaeger、Zipkin),能够帮助开发者快速定位跨服务调用中的性能瓶颈和故障原因。
  • 监控和告警:搭建完善的监控系统(如Prometheus、Grafana)来跟踪服务的健康状态、响应时间、CPU和内存使用情况,及时发现和应对问题。

3.5 业务需求驱动与架构技术演进的平衡

架构演进往往是为了应对快速变化的业务需求,但过度的技术驱动架构变革可能会导致与实际业务需求脱节。因此,架构设计应以业务需求为主导,技术演进应服务于业务的长期发展。

  • 适时引入新技术:技术的引入应服务于业务需求,而非为新技术而引入。如果当前架构能够满足业务需求,那么可以推迟引入复杂的微服务、云原生架构等。
  • 技术债务的管理:在架构演进过程中,可能会积累一些技术债务,这些债务应在合适的时候得到清理,以避免影响系统的可维护性和稳定性。

通过以上几点补充,可以看到,架构演进不仅仅是一个技术问题,它需要结合实际业务需求、团队能力和技术栈,稳步推进。同时,在开发过程中,务实的技术选型、有效的监控和观测系统,以及团队能力的培养,都是确保架构演进成功的重要因素。

相关文章:

软件架构的演变与趋势(软件架构演变的阶段、综合案例分析:在线电商平台架构演变、开发补充)

随着软件开发技术的不断进步&#xff0c;软件架构从最初的简单结构演变为如今的复杂系统&#xff0c;架构设计不再是简单的代码组合&#xff0c;而是战略性的系统设计&#xff0c;确保系统具备可扩展性、可靠性、安全性和可维护性。 文章目录 1. 软件架构演变的阶段1.1 单体架…...

Shopify独立站运营必知必会:选品与防封技巧

独立站和第三方平台是目前最常见的跨境电商销售模式&#xff0c;相比于第三方平台&#xff0c;独立站的商家可以自己建站&#xff0c;自行决定运营模式和营销手段等策略&#xff0c;尤其是在准入门槛上&#xff0c;难度会更低&#xff0c;这些特点吸引了不少商家选择独立站开店…...

Unity开发绘画板——03.简单的实现绘制功能

从本篇文章开始&#xff0c;将带着大家一起写代码&#xff0c;我不会直接贴出成品代码&#xff0c;而是会把写代码的历程以及遇到的问题、如何解决这些问题都记录在文章里面&#xff0c;当然&#xff0c;同一个问题的解决方案可能会有很多&#xff0c;甚至有更好更高效的方式是…...

R语言的基础知识R语言函数总结

R语言与数据挖掘&#xff1a;公式&#xff1b;数据&#xff1b;方法 R语言特征 对大小写敏感通常&#xff0c;数字&#xff0c;字母&#xff0c;. 和 _都是允许的(在一些国家还包括重音字母)。不过&#xff0c;一个命名必须以 . 或者字母开头&#xff0c;并且如果以 . 开头&…...

龙年国庆专属姓氏头像

关注▲洋洋科创星球▲一起成长&#xff01; 2024年&#xff0c;我们迎来了龙年&#xff0c;龙年国庆姓氏头像&#xff01; 慢慢找&#xff01; 你的和你朋友的都有。 01赵 02 钱 03 孙 04 李 05 周 06 吴 07 郑 08 王 09 冯 010 陈 011 褚 012 卫 013 蒋 014 沈 015 韩 姓氏…...

基于Es和智普AI实现的语义检索

1、什么是语义检索 语义检索是一种利用自然语言处理&#xff08;NLP&#xff09;和人工智能&#xff08;AI&#xff09;技术来理解搜索查询的语义&#xff0c;以提供更准确和相关搜索结果的搜索技术&#xff0c;语义检索是一项突破性的技术&#xff0c;旨在通过深入理解单词和…...

URI和URL的区别

1: 将 URI 转换为 URL import java.net.URI; import java.net.URL;public class UriToUrlExample {public static void main(String[] args) {// 创建一个 URI 对象URI uri = new URI("http://example.com/path/to/resource");// 将 URI 转换为 URLtry {URL url = u…...

Java 入门指南:获取对象的内存地址

文章目录 hashCode()应用重写 hashCode() 方法示例 Symstem . indentityHashCode()应用 注意事项 在 Java 开发中&#xff0c;了解对象的内存管理是十分重要的&#xff0c;尽管 Java 的设计初衷是让开发者更专注于业务逻辑而非底层资源管理。但在某些情况下&#xff0c;了解对象…...

【Linux】项目自动化构建工具-make/Makefile 详解

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

嵌入式开发中学习C++的用处?

这个问题一直有同学在问&#xff0c;其实从我的角度是一定是需要学的&#xff0c;最直接的就是你面试大厂的嵌入式岗位或者相关岗位&#xff0c;最后一定会问c&#xff0c;而很多人是不会的&#xff0c;这就是最大的用处&#xff0c;至于从技术角度考量倒是其次&#xff0c;因为…...

基于SAM大模型的遥感影像分割工具,用于创建交互式标注、识别地物的能力,可利用Flask进行封装作为Web后台服务

如有帮助&#xff0c;支持一下&#xff08;GitHub - Lvbta/ImageSegmentationTool-SAM: An interactive annotation case developed based on SAM for remote sensing image annotation, which can generate corresponding segmentation results based on point, multi-point, …...

Selenium入门

Selenium 是一个用于自动化 web 应用程序测试的工具&#xff0c;它支持多种浏览器和编程语言。 下载驱动程序&#xff1a;根据你的浏览器类型和版本&#xff0c;下载相应的 WebDriver。例如&#xff0c;Chrome 浏览器需要 ChromeDriver。 安装 Selenium 库 pip install sele…...

USB 3.1 Micro-A 与 Micro-B 插头,Micro-AB 与 Micro-B 插座,及其引脚定义

连接器配对 下表列出 USB 插座可接受的插头&#xff1a; USB 3.1 Micro-B 连接器 USB 3.1 Micro-B 插头和 USB 3.1 Micro-B 插座连接器是为小型手持设备和其他可能使用小尺寸连接器的应用而定义的。其定义使得 USB 3.1 Micro-B 插座既可以接受 USB 3.1 Micro-B 插头&#xff…...

MySQL多版本并发控制MVCC实现原理

MVCC MVCC 是多版本并发控制方法&#xff0c;用来解决读和写之间的冲突&#xff0c;比如脏读、不可重复读问题&#xff0c;MVCC主要针对读操作做限制&#xff0c;保证每次读取到的数据都是本次读取之前的已经提交事务所修改的。 概述 当一个事务要对数据库中的数据进行selec…...

【并查集】[ABC372E] K-th Largest Connected Components 题解

题意 前置阅读&#xff1a;并查集算法介绍 洛谷链接 Atcoder 链接 给定 n ( 1 ≤ n ≤ 2 1 0 5 ) n(1 \leq n \leq 2\times 10^5) n(1≤n≤2105) 个点&#xff0c;初始没有边&#xff0c;您要进行以下操作&#xff1a; 1 a b&#xff0c;表示连接一条 ( a , b ) (a,b) …...

HarmonyOS面试题(持续更新中)

1、用过线程通信吗&#xff0c;线程是怎么进行通信的&#xff1f; emitter 和 eventHub 相同&#xff1a; 都是基于事件总线的 区别是&#xff1a; ① eventHub当前线程内通信 ② emitter是同一进程不同线程或者同一进程和同一线程也可以通信 2、页面和组件的生命周期 …...

QT中QWidget和QObject的区别与联系是什么

在Qt框架中&#xff0c;QWidget和QObject是两个核心类&#xff0c;它们各自扮演着不同的角色&#xff0c;但又紧密相连。以下是关于它们区别与联系的详细解释&#xff1a; 区别 基类和功能定位&#xff1a; QObject是Qt中所有类的基类&#xff0c;包括几乎所有的Qt对象。它提供…...

解决macOS安装redis以后不支持远程链接的问题

参考文档:https://blog.csdn.net/qq_37703224/article/details/142542179?spm1001.2014.3001.5501 安装的时候有个提示, 使用指定配置启动: /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf那么我们可以尝试修改这个配置文件: code /opt/homebrew/…...

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛&#xff08;也就是华为杯&#xff09;&#xff0c;也是和本校的两个数学学院的朋友在网上组的队伍。昨天&#xff08;9.25&#xff09;通宵干完论文&#xff08;一条…...

绝了,自从用了它,我每天能多摸鱼2小时!

大家好&#xff0c;我是可乐。 俗话说的好&#xff1a;“摸鱼一时爽&#xff0c;一直摸鱼一直爽”。 作为一个程序员&#xff0c;是否有过调试代码熬到深夜&#xff1f;是否有过找不到解决方案而挠秃头顶&#xff1f; 但现在你即将要解放了&#xff0c;用了这款工具——秘塔…...

用Keras和MNIST数据集,5分钟搞定一个图像去噪的CNN自编码器(附完整代码)

5分钟实战&#xff1a;用Keras构建图像去噪自编码器的极简指南 当一张布满噪点的老照片在AI处理后重现清晰画面时&#xff0c;这种"数字魔法"背后往往是自编码器在发挥作用。作为深度学习领域的瑞士军刀&#xff0c;自编码器不仅能用于图像去噪&#xff0c;还在数据压…...

C++运行时类型识别实战:从typeid().name()到可读类型名

1. 为什么我们需要关心运行时类型识别&#xff1f; 在C开发中&#xff0c;我们经常会遇到需要知道某个变量或表达式具体类型的情况。特别是在调试复杂代码、编写泛型程序或进行元编程时&#xff0c;能够准确获取类型信息就显得尤为重要。想象一下&#xff0c;当你看到一个日志输…...

从单一AI到智能体集群:构建模块化AI协作系统的核心原理与实践

1. 项目概述&#xff1a;当AI学会“开会”&#xff0c;一个开源智能体集群的诞生最近在GitHub上看到一个挺有意思的项目&#xff0c;叫daveshap/OpenAI_Agent_Swarm。光看名字&#xff0c;你可能会觉得这又是一个调用OpenAI API的简单封装库。但如果你点进去&#xff0c;花上十…...

3个技巧让SD-PPP插件提升Photoshop设计效率300%

3个技巧让SD-PPP插件提升Photoshop设计效率300% 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 还在为Photoshop和AI工具之间的频繁切换而烦恼吗&#xff1f;每次都要导出PSD、上传到AI平台、等待生成、再导回Phot…...

Arduino蓝牙HID键盘实战:Bluefruit LE模块AT命令与控制器模式详解

1. 项目概述与核心价值如果你正在寻找一种能让你的Arduino项目“开口说话”或者“隔空操作”手机、电脑的方法&#xff0c;那么Adafruit的Bluefruit LE系列蓝牙低功耗模块绝对是一个绕不开的明星选手。它不仅仅是一个简单的蓝牙串口模块&#xff0c;更是一个集成了丰富AT命令集…...

从零开始通过Taotoken平台文档快速完成首个大模型API调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从零开始通过Taotoken平台文档快速完成首个大模型API调用 对于初次接触大模型API的开发者而言&#xff0c;面对众多模型厂商、复杂…...

别再只怪USB线了!i.MX6Q用Mfgtools烧录rootfs.tar.bz2报错的深层硬件排查指南

i.MX6Q烧录故障的硬件级诊断&#xff1a;从USB OTG冲突到电源完整性排查 当Mfgtools在rootfs.tar.bz2传输阶段突然报错"Push error"或"No Device Connected"时&#xff0c;多数开发者会本能地检查USB线缆或驱动配置。但真正棘手的故障往往潜伏在硬件交互层…...

航空发电机综合测试系统设计【附代码】

✨ 长期致力于航空发电机、测试系统、控制方法、LabVIEW研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;设计直流拖动调速系统的双闭环自适应模糊PID控…...

电解电容核心参数解析:从ESR、纹波电流到选型实战

1. 项目概述&#xff1a;从“黑疙瘩”到电路心脏在电子工程师的物料盒里&#xff0c;电解电容绝对是个让人又爱又恨的家伙。它不像电阻那样温顺稳定&#xff0c;也不像芯片那样精密复杂&#xff0c;它就是个黑乎乎的圆柱体&#xff0c;或者扁平的方块&#xff0c;上面印着一些让…...

书成紫微动,律定凤凰驯:海棠山铁哥的道,从来不是嘴上说的,是写在作品里的

文坛从不缺大道理&#xff0c;也不缺高谈阔论的传道者&#xff0c;历来最缺的&#xff0c;是知行合一、落地成真的真大道。一、乱象&#xff1a;言道者多&#xff0c;行道者少口头标榜实际行径文脉传承随波逐流初心坚守妥协功利拒绝流量收割热度敬畏真诚唯数据论 语言可以伪装人…...