软件模式之单体架构介绍

简介: 您正在开发服务器端企业应用程序。它必须支持各种不同的客户端,包括桌面浏览器、移动浏览器和本地移动应用程序。该应用程序还可能公开一个 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 应用程序都采用单体架构。

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

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

目录
相关文章
|
25天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
177 6
|
2月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
75 2
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
71 2
|
2月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
96 2
|
24天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
40 1
服务架构的演进:从单体到微服务的探索之旅
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
46 3
|
1月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
48 2
|
6天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
23天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####