首页 > 编程语言 >现代C++软件架构--架构风格

现代C++软件架构--架构风格

时间:2025-01-19 20:59:07浏览次数:3  
标签:单体 架构 -- 应用程序 风格 软件架构 服务 事件 C++

架构风格

有状态风格和无状态风格

有状态软件的行为依赖于其内部状态。我们以Web服务为例,如果服务记住了自己的状态,该服务的使用者可以在每个请求中发送更少的数据,因为该服务记住了这些请求的上下文。然而,虽然节省了发送请求大小和带宽数据的开销,但在Web服务方面有一项隐藏的成本。如果用户同时发送很多请求,则服务必须同步这些请求。由于可能会有多个请求同时改变服务状态,没有同步机制可能会导致数据争用。

如果服务是无状态的,那么每个指向它的请求都需要包含成功处理它所需的所有数据。这意味着请求数据将变得更多,消耗更多的带宽,但服务将拥有更好的性能和可伸缩性。
无状态编程的许多优点都源于它的函数式编程本质。

单体风格

开发应用程序最简单的架构风格是单体风格,所以许多项目在开始的时候都使用这种风格。单体应用程序像一个大代码块,应用程序功能独立的部分,如I/O部分、数据处理部分和用户界面都是交织在一起的,而不是放在单独的架构组件中。这种架构风格的一个有名的例子是Linux内核。注意,内核是单体的并不妨碍它同时也是模块化的。

缺乏模块化是单体系统的一个固有特性,这是该架构许多缺陷的根源。

单体架构只适用于简单的小型应用程序。然而,还有一种情况,使用单体架构可能是一个好主意。如果你特别在意性能,与微服务相比,单体服务有时可以在延迟或吞吐量方面帮你挤出更多水分。进程间的通信总是会产生一些开销,而单体应用程序不会产生这些开销。

服务和微服务

面向服务的架构(Service-Oriented Architecture,SOA)意味着业务功能被模块化,并作为单独的服务供客户使用。每个服务都应该有一个能够自我描述的接口,并隐藏实现细节,例如内部架构、技术或所使用的编程语言。
SOA的支持者提出了一份宣言,该宣言主要包括以下几点:
❑业务价值高于技术战略。
❑战略目标高于特定项目的收益。
❑内在互操作性高于定制的集成。
❑共享的服务高于特定目标的实现。
❑灵活性高于优化。
❑不断演进的提炼高于在最开始追求完美。
最常见的两种服务类型是SOAP和REST。除此之外,最近还有第三个类型越来越受欢迎:基于gRPC的服务。

微服务,在微服务这种软件开发模式中,应用程序被分割为一组松耦合的服务,这些服务使用轻量级协议进行通信。
微服务的优点
❑模块化,这是这种架构风格固有的特点。
❑易测试。
❑替换系统模块(如单个服务、数据库、消息代理或云厂商)时更灵活。
❑可与旧系统集成:不需要迁移整个应用程序,只需要迁移当前开发的部分。
❑支持分布式开发:开发团队可以并行地处理多个微服务。
❑可伸缩性:一个微服务可以独立于其他微服务进行扩展。
微服务的缺点
❑需要成熟的DevOps方法并依赖于CI/CD自动化。
❑更难调试,并且需要更好的监控和分布式追踪机制。
❑对较小的应用程序来说,额外的开销(需要用辅助服务的话)可能会超过带来的好处。

基于事件的架构

基于事件的系统是指架构围绕着处理事件来设计的系统。这个系统包含生成事件的组件、事件传播的通道,以及对这些事件做出反应的侦听器,侦听器也可能触发新的事件。这种架构提高了异步性,降低了耦合度,提高了性能和可伸缩性,同时也易于部署。

事件驱动架构的两种主要拓扑结构分别是基于代理(broker)的和基于中介(mediator)的。这两种拓扑结构的区别是事件在系统中的流动方式不同。

当一个事件需要多个任务或步骤,而这些任务或步骤都可以独立执行时,适合使用中介拓扑结构。
在这里插入图片描述
代理是一个轻量级的组件,它包含所有的队列,但不对事件的处理进行编排。它可以要求事件接收方订阅特定类型的事件,然后简单地转发订阅事件。许多消息队列都依赖于代理,例如ZeroMQ,它是用C++编写的,目标是实现零浪费和低延迟。
在这里插入图片描述
事件溯源架构图
在这里插入图片描述

分层架构

你可以将代码按层结构化,可以创建多层微服务,或者将此模式应用于你认为有价值的其他领域。分层可以使抽象和关注点分离,这也是引入它的主要原因。分层还可以降低复杂性,同时改善解决方案的模块化、可重用性和可维护性。

一个现实世界的例子是自动驾驶汽车,分层后可以按层决策:最低层将处理汽车的传感器数据,上一层将消耗传感器数据以便实现单一特性,再上一层将利用所有特性实现安全驾驶。当另一种车型更换传感器时,只需要更换最低层即可。

在这里插入图片描述
创建高效的分层架构的挑战在于如何在各层之间设计稳定且定义良好的接口。

服务于前端的后端模式
在这里插入图片描述

基于模块的架构

如果需要以尽可能少的停机时间运行一个组件,但出于某些原因不能应用通常的容错模式,例如服务的备份,那么使用基于模块的组件可以节省时间。
使用基于模块的架构示例包括一些IDE(如Eclipse)、软件定义网络(Software Defined Networking,SDN)项目(如OpenDaylight)或家庭自动化软件(如OpenHAB)。

参考:现代C++软件架构

标签:单体,架构,--,应用程序,风格,软件架构,服务,事件,C++
From: https://blog.csdn.net/haolindy/article/details/145244849

相关文章

  • oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法
    问题概述使用oracle的casewhen函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。样例演示现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型,COL02字段是VARCHAR2类型。场景一使用case简单函数,case后面的内容和when......
  • 【读书与思考】我的年度读书报告
    【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】分享一下我的年度读书报告中我觉得有意思的一些片段不知道它的词云是怎么算的,我其实对作者没有特别的偏好,也从不迷信任何作者,不过这几个作者的某些书确实非常不错读书可能不是越......
  • 考研机试:水仙花数
    描述春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:现在要求输出所有在 m 和 n范围内的水仙花数。输入格式输入包含多组测试数据。每组数据占一行,包含两个整数 m和 n......
  • Android JecPack组件之LifeCycles 使用详解
    一、背景LifeCycle是一个可以感知宿主生命周期变化的组件。常见的宿主包括Activity/Fragment、Service和Application。LifeCycle会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。LifeCycle的出现主要是为了解决:系统组件的生命周期与......
  • 7、智能驾驶域控电源介绍
    在智能驾驶系统中,域控制器作为核心部件,其硬件电源的性能直接关系到系统的稳定性和安全性。为了确保域控制器能够高效、稳定地支撑L2+级别的智能驾驶功能,硬件电源需满足以下详细要求:一、通用要求域控制器硬件电源需严格遵循智能驾驶控制器硬件平台的通用要求。这包括电源的尺......
  • 虚拟主机绑定域名后仍无法访问首页
    将域名绑定到虚拟主机后,尝试通过域名访问首页时,提示“无效”或无法找到默认首页文件。即使域名实名认证已完成,仍然无法正常访问。解决方案:步骤描述确认域名解析确保域名已正确解析到虚拟主机的IP地址,并且DNS记录已生效。通常需要等待一段时间(如24-48小时)以确保DNS更改......
  • 虚拟机连不上云服务器
    尝试通过远程桌面或其他方式连接虚拟机时,无法成功登录。输入正确的用户名和密码后,仍然提示连接失败或超时。解决方案:步骤描述检查网络连接确认本地网络设备和服务器之间的网络连接正常。可以使用ping命令测试服务器IP地址的连通性。如果网络不通,远程连接将无法建立。......
  • 线性表
    线性表1.基本概念线性表是包含若干数据元素的一个线性序列,记为:\(L=(a_0,...a_{i-1},a_i,a_{i+1}...a_{n-1})\)其中,L为表名,\(a_i(0\leqi\leqn-1)\)为数据元素;n为表长,n>0时,线性表为非空表,否则为空表。二元组形式表述:​ $$L=(D,R)$$即线性表L包含数据元素集......
  • 数据库密码安全修改:保护织梦网站账户安全的黄金法则
    严格权限控制:仅授予最小化权限给真正需要访问数据库的人,避免不必要的暴露风险。定期清理过期账号,防止非法入侵。日志记录完善:开启详细的日志记录功能,记录下每一次登录、退出、增删改查等关键事件。一旦发现问题可以迅速定位原因并采取相应措施。步骤描述备份数据优先......
  • 前端项目上线过程中的常见问题及解决方案
    在前端项目的上线过程中,经常会遇到各种问题,这些问题可能会导致项目无法正常部署或运行。本文将详细讨论三个常见的问题及其解决方案:问题1:打包时使用 copy-webpack-plugin 引入外部配置文件,但项目发布后拿到的配置文件是错误的问题描述在使用copy-webpack-plugin打包时,虽然......