软件模式之单体架构介绍

简介: 您正在开发服务器端企业应用程序。它必须支持各种不同的客户端,包括桌面浏览器、移动浏览器和本地移动应用程序。该应用程序还可能公开一个 API 供第 3 方使用。它还可以通过 Web 服务或消息代理与其他应用程序集成。应用程序通过执行业务逻辑来处理请求(HTTP 请求和消息);访问数据库;与其他系统交换消息;并返回 HTML/JSON/XML 响应。有对应于应用程序不同功能区域的逻辑组件。

背景

您正在开发服务器端企业应用程序。它必须支持各种不同的客户端,包括桌面浏览器、移动浏览器和本地移动应用程序。该应用程序还可能公开一个 API 供第 3 方使用。它还可以通过 Web 服务或消息代理与其他应用程序集成。应用程序通过执行业务逻辑来处理请求(HTTP 请求和消息);访问数据库;与其他系统交换消息;并返回 HTML/JSON/XML 响应。有对应于应用程序不同功能区域的逻辑组件。

问题

应用程序的部署架构是什么?

限制

  • 有一个开发团队正在开发该应用程序
  • 新的团队成员必须迅速变得富有成效
  • 应用程序必须易于理解和修改
  • 您想练习应用程序的持续部署
  • 您必须在多台机器上运行应用程序的多个实例以满足可伸缩性和可用性要求
  • 您想利用新兴技术(框架、编程语言等)

解决方案

构建具有单体架构的应用程序。例如:

  • 一个 Java WAR 文件。
  • Rails 或 NodeJS 代码的单个目录层次结构

例子

假设您正在构建一个电子商务应用程序,该应用程序从客户那里接收订单,验证库存和可用性,然后发货。该应用程序由几个组件组成,包括实现用户界面的 StoreFrontUI,以及一些用于检查信用、维护库存和运输订单的后端服务。

该应用程序被部署为单个应用程序。例如,Java Web 应用程序由一个在 Web 容器(如 Tomcat)上运行的 WAR 文件组成。Rails 应用程序由单个目录层次结构组成,使用例如 Apache/Nginx 上的 Phusion Passenger 或 Tomcat 上的 JRuby 部署。您可以在负载均衡器后面运行应用程序的多个实例,以扩展和提高可用性。

结果上下文

这个解决方案有很多好处:

  • 易于开发 - 当前开发工具和 IDE 的目标是支持单片应用程序的开发
  • 易于部署 - 您只需在适当的运行时部署 WAR 文件(或目录层次结构)
  • 易于扩展 - 您可以通过在负载均衡器后面运行应用程序的多个副本来扩展应用程序

但是,一旦应用程序变大并且团队规模扩大,这种方法就会有许多缺点,这些缺点变得越来越明显:

  • 庞大的单体代码库吓倒了开发人员,尤其是团队新手。该应用程序可能难以理解和修改。因此,开发速度通常会放缓。此外,由于没有硬模块边界,模块化会随着时间的推移而分解。此外,由于很难理解如何正确实施更改,因此代码的质量会随着时间的推移而下降。这是一个向下的螺旋。
  • IDE 过载 - 代码库越大,IDE 越慢,开发人员的生产力就越低。
  • 重载的 Web 容器 - 应用程序越大,启动所需的时间就越长。这对开发人员的生产力产生了巨大的影响,因为等待容器启动的时间被浪费了。它也影响部署。
  • 持续部署很困难——大型单体应用程序也是频繁部署的障碍。为了更新一个组件,您必须重新部署整个应用程序。这将中断后台任务(例如 Java 应用程序中的 Quartz 作业),无论它们是否受到更改的影响,并可能导致问题。尚未更新的组件也有可能无法正确启动。因此,与重新部署相关的风险会增加,从而阻碍频繁更新。这对于用户界面开发人员来说又是一个问题,因为他们通常需要快速迭代并频繁重新部署。
  • 扩展应用程序可能很困难 - 单体架构是它只能在一个维度上扩展。一方面,它可以通过运行更多的应用程序副本随着交易量的增加而扩展。一些云甚至可以根据负载动态调整实例数量。但另一方面,这种架构无法随着数据量的增加而扩展。应用程序实例的每个副本都将访问所有数据,这会降低缓存效率并增加内存消耗和 I/O 流量。此外,不同的应用程序组件具有不同的资源需求——一个可能是 CPU 密集型的,而另一个可能是内存密集型的。使用单体架构,我们无法独立扩展每个组件
  • 扩展开发的障碍 - 单体应用程序也是扩展开发的障碍。一旦应用程序达到一定规模,就可以将工程组织划分为专注于特定功能领域的团队。例如,我们可能希望拥有 UI 团队、会计团队、库存团队等。单体应用程序的问题在于它阻止了团队独立工作。团队必须协调他们的开发工作和重新部署。团队做出改变和更新产品要困难得多。
  • 需要对技术堆栈做出长期承诺——单体架构迫使您与您在开发之初选择的技术堆栈(在某些情况下,与该技术的特定版本)结合。对于单体应用程序,可能难以逐步采用更新的技术。例如,假设您选择了 JVM。您可以选择一些语言,因为除了 Java 之外,您还可以使用与 Java 很好地互操作的其他 JVM 语言,例如 Groovy 和 Scala。但是用非 JVM 语言编写的组件在您的单体架构中没有一席之地。此外,如果您的应用程序使用的平台框架随后变得过时,那么将应用程序逐步迁移到更新和更好的框架可能具有挑战性。

相关模式

微服务架构(我们将在接下来的讲解会介绍微服务架构模式)是解决单体架构局限性的另一种模式。

已知案例

Netflix、Amazon.com 和 eBay 等知名互联网服务最初采用单体架构。作者开发的大多数 Web 应用程序都采用单体架构。

目前很少有企业使用单体模式

敬请期待下一遍:软件模式之微服务架构介绍

目录
相关文章
|
2天前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
18天前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
2月前
|
分布式计算 负载均衡 API
微服务架构设计原则与模式
【8月更文第29天】随着云计算和分布式计算的发展,微服务架构已成为构建大型复杂应用的一种流行方式。这种架构模式将单个应用程序分解成一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。本文将探讨微服务架构的基本设计原则、常用模式以及如何有效地划分服务边界。
164 3
|
2月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
69 0
|
2月前
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
66 0
|
2月前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
90 0
|
2月前
|
设计模式 测试技术 数据处理
|
2月前
|
负载均衡 监控 JavaScript
探索微服务架构下的API网关模式
【8月更文挑战第31天】在微服务的大潮中,API网关不仅是流量的守门人,更是服务间通信的桥梁。本文将带你深入理解API网关的核心概念、设计要点及其在微服务架构中的重要作用,同时通过代码示例揭示如何利用API网关提升系统的灵活性与扩展性。
|
15天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
15天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1