单体架构

如何深度理解整体架构设计? 一. 什么是架构和架构本质        在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。        Linux... 阅读详情

背景

在开发服务端企业应用时,应用需要支持各种不同类型的客户端,比如桌面浏览器、移动浏览器以及原生移动应用。应用还需要向第三方提供可访问的API,并通过Web Service或者消息代理与其它应用实现集成。应用通过执行业务逻辑、访问数据库、与其它系统交换信息、并返回一条HTML/JSON/XML响应,来处理请求(HTTP请求与消息)。

应用采用多层架构或者六角架构,主要由以下几类不同组件构成:

  • 展现组件——负责处理HTTP请求并响应HTML或者JSON/XML(对于web Services APIs)
  • 业务逻辑——应用的业务逻辑
  • 数据库访问逻辑——用于访问数据库的数据访问对象
  • 应用集成逻辑——消息层,例如基于Spring Integration

不同逻辑组件分别响应应用中的不同功能模块。

问题

应用的部署架构是什么?

需求(Forces)

  • 应用需要由一个开发者团队专门负责
  • 团队新成员需要快速上手
  • 应用应该易于理解和修改
  • 对应用能够进行持续部署
  • 需要在多台设备上运行应用副本,从而满足可扩展性与可用性的要求
  • 使用各种新技术(框架、编程语言等)

方案

使用单体架构构建应用。例如:

  • 单个Java WAR文件。
  • 单个Rails或者NodeJS代码目录层级。

举个栗子

假设需要构建一款电子商务应用程序,使其能够接收来自客户的订单、验证库存信息与可用信用额度,而后进行发货。该应用程序会包含多个组件,其中StoreFrontUI负责实现用户界面,而其它后端服务则分别负责检查信用额度、维护库存信息以及发送订单。

应用被当作一个单体进行部署。例如:一个 Java Web 应用仅包含一个运行在 Tomcat 之类的 Web 容器上 WAR 文件。一个 Rails 应用由单一目录层级构成,该目录层级的部署通过在 Apache/Nginx 上使用 Phusion Passenger,或者在 Tomcat 上使用 JRuby 得以实现。为了提高扩展性和可用性,你可以在负载均衡器之后运行此应用的多个实例。

结果(Resulting context)

这类解决方案拥有以下优势:

  • 易于开发 — 当前开发工具与IDE的设计目标即在于支持单体应用的开发。
  • 易于部署 — 你只需要将该WAR(或者目录层级)部署在合适的运行环境中即可。
  • 易于扩展 — 你可以在负载均衡器后面运行多个应用副本实现扩展。

然而,一旦应用变大、团队扩大,这种方案的弊端将会变得愈发明显:

  • 单体应用巨大的代码库可能会让人望而生畏,特别是对那些团队新成员来说。应用难以被理解和进行修改,进而导致开发速度减慢。由于没有清晰的模块边界,模块化会逐渐消失。另外,由于难以正确把握代码变化,导致代码质量逐步下滑,陷入恶性循环。
  • 过载的IDE——代码库越大,IDE速度越慢,开发者的生产效率越低。
  • 过载的Web容器——应用越大,Web容器启动时间越长。容器启动耗费时间,极大影响到开发者的生产效率。对部署工作也有负面影响。
  • 持续部署困难——巨大的单体应用本身就是频繁部署的一大障碍。为了更新一个组件,你必须重新部署整个应用。这会中断那些可能与更改无关的后台任务(例如Java应用中的Quartz任务),同时可能引发问题。另外,未被更新的组件有可能无法正常启动。重新部署会增加风险,进而阻碍频繁更新。因为用户界面开发者经常需要进行快速迭代与频繁重新部署,所以这对用户界面开发者而言更加是个难题。
  • 应用扩展困难——单体架构只能进行一维伸缩。一方面,它可以通过运行多个应用副本来增加业务容量,实现扩展。一些云服务甚至可以根据负载量动态调整实例数量。但在另一方面,数据量增大会使得该架构无法伸缩。每个应用实例需要访问所有数据,导致缓存低效,加大内存占用和I/O流量。另外,不同的应用组件有不同的资源需求——有的是CPU密集型的,另外一些是内存密集型的。单体架构无法单独伸缩每个组件。
  • 难于进行规模化开发——单体应用是规模化开发的障碍。应用一旦达到特定规模,需要将现有组织拆分成多个团队,每个团队负责不同的功能模块。举例来说,我们可能需要设立UI团队、会计团队、库存团队等等。单体应用的问题在于它使团队无法独立展开工作。团队需要在工作进度和重新部署上进行协调。对于各团队而言,这使得变更和更新产品变得异常困难。
  • 需要长期关注同一套技术栈——单体架构迫使我们长期使用在开发初期选定的技术堆栈(在某些情况下,可能是某些技术的特定版本)。单体应用是渐进采用新技术的障碍。举例来说,如果我们选择了JVM,那么我们可以选择Java以外的一些语言,因为Groovy和Scala等基于JVM的语言也可以和Java进行良好的互操作。但此时以非JVM语言编写的组件就无法在该单体架构中使用。另外,如果大家所使用的应用平台框架已经过时,那么我们将很难将应用迁移到其它更新并且更完善的框架当中。有时候为了采用一套新型平台框架,我们甚至需要重写整个应用,这是风险很大的工作。

来源:https://microservices.io/patterns/cn/monolithic.html

【软件系统架构】单体架构 单体架构是一种将所有功能模块(如业务逻辑、数据访问、用户界面等)都打包在一个单一的可执行程序中的软件架构。就像是一个大的容器,里面包含了应用程序的所有部分,各个部分紧密耦合,共享代码库、数据库等资源。 阅读详情

相关推荐

单体架构和微服务架构的优缺点

单体架构:单体架构就是把所有的业务模块编写在一个项目中,最终会打包成一个war,然后进行部署运行 单体架构的优点: 1.由于是完整的

ToBeWhatYouWant 1万+

架构演进史之整体式架构

构建整体式架构一直是默认的建筑风格。我的意思是,一开始我们每个应用程序都有一个文件,然后我们开始拥有包含多个文件的应用程序,直到1990年代,我们才开始看到由其他应用程序组成的应用程序(尽管第一次实验是在1980年代)。

杨海吉 602

单体架构 vs 微服务架构的全面比较

软件架构是指软件系统的高层设计和组织方式。它定义了系统的结构、组件、它们之间的交互以及它们如何满足系统的需求。有各种软件架构模式,每种都有其自身的优点和权衡。两种常见的架构模式是微服务架构和单体架构。

wjianwei666的专栏 1559

微服务架构设计方案详解(4大常见方案)

大型互联网公司都会采用微服务,但是采用什么样的微服务架构设计方案呢?这就非常的重要了,本篇重点谈谈微服务设计常见方案首先,我从微服务谈起,这样大家更能了解微服务的本质。微服务的本质:在于将一个复杂的大型应用程序,拆分为多个独立的小服务。每个服务之间,通过轻量级的通信机制(比如:RPC、或者HTTP/REST、消息队列…等形式),交互通信。每个微服务,都围绕特定的业务功能或能力展开,聚焦于做一件事,并将其做好。比如:用户服务、交易服务、商品服务…职责非常分明,每个服务专注自己的事情。

m0_59235699的博客 2298

模块化单体架构

对数据库中的相关表进行分组是引入逻辑隔离的一种方式。每个模块都有一个唯一的架构,其中包含模块的表。首先,将要提取的模块的表移动到单独的数据库中。如果您需要在模块之间设置严格的数据隔离规则,则可以采用这种方法。模块化单体内部的模块应该是独立的。下一个数据隔离级别是将每个模块的数据移动到单独的数据库中。与使用架构的数据隔离相比,此方法具有更多的约束。对于您的用例来说,这可能是一个值得的权衡。这里的想法是相似的:您正在使用单独的数据库进行数据隔离。我经常看到的单片架构的一个问题是组件之间的紧密耦合。

weixin_43958365的博客 1472

分布式单体架构

当我们需要设计一套在线课程发布和订阅系统(以下简称“在线课程”系统)时,传统做法就是采用早已烂熟的逻辑三层架构:用户界面层、业务逻辑层和数据访问层,如果遵循领域驱动设计(DDD)的经典分层架构,基本上也就是四层:表现层、应用层、业务层以及基础结构层。在系统刚刚开始发布上线的时候,用户量和每日请求量并不是特别大,所以我们可以将来自于各个层的组件全部部署在一台物理机器上,因此,层(Layers,逻辑层)与层(Tiers,物理层)之间并非是一对一的关系。当然,也有可能会将用户界面层、业务逻辑层以及数据访问层分别部

qfzhaohan的博客 2596

微服务架构

微服务部分总结

animals_wind的博客 2826

微服务架构 VS 单体架构

在软件行业,微服务架构是一种重要的发展趋势。这一趋势,不仅仅是对企业内的IT信息系统建设,甚至在企业向数字化转型方面,都有着深远的影响。微服务架构与传统的单体软件架构代表着IT产业处理软件开发方式的一个根本性转变,Netflix、Google、亚马逊等组织均已成功采用这一转变。但是,与传统的单体架构相比,微服务的优势是什么呢? 1) 微服务架构vs单体架构 首先,让我们来看下微服务架构和单...

nausealiu的博客 6144

单体架构的总结

把项目打包时,需要安装JDK 可以在控制台中输入mvn clean package -DskipTests中进行打包 这种方法是跳过测试,如果不加-DskipTests则时需要测试 也可以在java的编写软件中来进行编写,如果是StS则可以在mavan中进行打包,打包的jar包在target中,你就可以有jar包和本地数据库就可以运行该项目了 进行springbootActuator健康监测是可以...

Result_lei的博客 6880

使用K8s管理有状态服务

普元云计算架构师宋潇男,分享了Kubernetes中支持有状态服务的相关特性和普元MySQL集群服务的相关案例。

宋潇男-Docker+与+K8S+在企业基础设施服务的应用

普元 Pworld2016 宋潇男-Docker+与+K8S+在企业基础设施服务的应用

单体架构和微服务架构的区别

一、单体架构 单体架构就是把所有的业务模板编写在一个项目中,最终会打包成一个war包,然后进行部署运行。单体服务架构如下: 单体架构的优点: 1、部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可 2、技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。 3、用人成本低:单个程序员可以完成业务接口到数据库的整个流程。 单体架构的缺点; 1、系统启动慢,一个进程包含了所有的业务逻辑,涉及到的启动模块多,导致系统的启动,重启周期长; 2、系统的错误隔离性差,可用性差,任何一个模块的错

不会写程序的穷二代的博客 6467

qlite:基于微服务框架的NewSQL分布式存储数据库

QLite [] QLite 是基于微服务的 NewSQL 型数据库系统,与传统的一体化数据库不同,该系统将本该内置的多种数据结构(STL)拆分成多个服务模块,每个模块都是独立的一个节点,每个节点都与其主网关进行连接,从而形成分布式存储结构。 QLite 主要存储方式为KV存储,主网关内置Hash结构,如同关系型数据报表,可存储已加载(连接)至主网关的所有数据结构。 Hash结构可以存储Hash本身。这就导致QLite 数据库可以像文件夹一样进行树状查找及存储操作。 该系统配有轻量级 QLite - STL 开发框架,可以将自己编写的数据结构与QLite进行连接,具有高扩展性,但目前该框架只支持Go语言,具体见 。 Background QLite 在发布至GitHub前已经经历了两个版本,分别是TCP版和集成版,效果皆不是很理想,该版本为分布式版本,采用HTTP作为接口交互协议,将信息处

微服务系列之单体架构

它由业务逻辑组成,业务逻辑外面是实现用户界西的适配器和与外部系统的接口,例如移动应用程序,支付、消息和电子邮件的云服务等(这种应用层面的架构设计是没有什么问题的,符合高内聚、低耦合等软件设计理念,可以称得上一个好的设计)。但是需要知道的是,在微服务架构出现之前,基本所有的公司都用的单体架构,如果单体架构那么不堪,怎么可能会有那么多企业的架构师会选择采用单体架构进行项目的开发呢?听到这里,大家对这个系统应该是有一个比较直观的感受就是:如果系统业务非常的复杂,这个系统后期的war肯定非常的滴大。

a_ittle_pan的博客 2367

华为开发岗暑期实习笔试(2025年4月16日)

第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需数据结构及相关操作较多。

csy031117的博客 3664

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 494
上一篇: 实践丨分布式事务解决方案汇总:2PC、消息中间件、TCC、状态机+重试+幂等
下一篇: linux常用操作
疯信子To
博客等级 码龄14年 12粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值