架构风格
有状态风格和无状态风格
有状态软件的行为依赖于其内部状态。我们以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++ From: https://blog.csdn.net/haolindy/article/details/145244849参考:现代C++软件架构