微服务系列之单体架构

news2024/11/24 3:54:39

随笔

终于迎来了“微服务、云原生”系列文章,这个系列的文章的更新速度博主无法保证能够每个星期一篇,因为这个系列的难度比以往系列都要高(以往的系列就没有保证一个星期一更)。但是长时间不去写文章,自己可能会慢慢失去写作的能力与热情,因此,除了“微服务、云原生”系列的文章,博主会穿插“mysql”系列的文章。
在这里插入图片描述

参考书籍:

  1. “凤凰架构”
  2. 微服务架构设计模式

单体架构(Monolithic)

“单体”只是表明系统中主要的过程调用都是进程内调用,不会发生进程间通信,仅此而已

对于单体架构(又称巨石系统(Monolithic Application)),各位应该都不会太陌生,,可以说在“微服务架构”出现在大家的视野之前,市面上基本都是单体架构的软件。而单体这个概念其实是在“微服务”理念提出后所产生的,从概念诞生的先后顺序,我们也不难看出,“单体”与“微服务”是一组相互对比参照的概念。

我们深入了解单体架构之前,大家先思考一个问题:“单体架构是不是一种优秀的软件设计?”

可以不用着急下结论,深入了解单体架构之后再看这个问题,你会有不一样的感受。

下图是“微服务架构设计模式”中用来举例的单体项目架构:

在这里插入图片描述
这个应用的名字叫FTGO(Fod to Go的简称),核心业务为消费者 (C o n s u m e r ) 使用 F T G O 的网站或者移动应用在本地的餐馆 (R e s t a u r a n t ) 下订单, F T G O 会协调一个由送餐员 (C o u r i e r )组成的快递网络来完成订单食品(Order)的运送(Delivery)。

FTGO应用程序具有六边形架构。它由业务逻辑组成,业务逻辑外面是实现用户界西的适配器和与外部系统的接口,例如移动应用程序,支付、消息和电子邮件的云服务等(这种应用层面的架构设计是没有什么问题的,符合高内聚、低耦合等软件设计理念,可以称得上一个好的设计)。同时,这个应用会被整体打包成一个单一的WAR 文件,部署运行在Tomcat 之上(很典型的单体软件架构风格)。

听到这里,大家对这个系统应该是有一个比较直观的感受就是:如果系统业务非常的复杂,这个系统后期的war肯定非常的滴大。如果项目在我的ide上跑,可能索引就需要好几个小时,更不用说编译和运行了(博主亲身经历过🥹)。按照大家98年的脾气,可能刚进公司就已经准备跑路了~~

结合软件历史来说,这种系统架构在当时已经是最优选(此时还没有微服务这种概念),使用这种架构的软件系统在发展的早期,应用程序相对较小,会有以下好处:

  1. 应用的开发很简单:IDE和其他开发工具只需要构建这一个单独的应用程序(开发初期,后期如果业务复杂,此优势将不负存在)
  2. 易于对应用程序进行大规模的更改:可以更改代码和数据库模式,然后构建和部署。
  3. 测试相对简单直观:开发者只需要写几个端到端的测试,启动应用程序,调用RESTAPI , 然后使用 Selenium 日这样的工具测试用户界面。
  4. 部署简单明了:开发者唯一需要做的,就是把WAR文件复制到安装了Tomcat的服务器上。
  5. 横向扩展不费吹灰之力:FTGO可以运行多个实例,由一个负载均衡器进行调度

上面这么多优点,都是针对于项目初期来说的,随着时间的推移,整个系统的开发、测试、部署和扩展都会变得更加困难。至于为什么,我们接着往下面看。

在这里插入图片描述
上图是FTGO项目从开发到部署的一个整体流程,分析这个过程我们其实不难找到一些问题:

  1. 业务过于复杂导致开发人员难以理解系统的全部(校招员工:进公司两个月,我们公司的系统是干什么的?)
  2. 开发速度缓慢(员工:ide打开项目、编译、运行如果只要2分钟,那我开发速度肯定高)
  3. 从代码提交到实际部署的周期很长,而且容易出问题(开发:如果我头发还顶的住,那么我能够在指定时间内开发完。 项目测试:我测试一个功能最少需要2天,前提是开发写的代码没问题。 运维:我部署项目需要1天,前提是服务器配置高)
  4. 难以扩展(订单团队:我们模块是核心模块因此服务需要占用大量系统资源没问题吧 图片处理团队:我们功能需要比较快的CPU 来完成图形运算也是合情合理的)
  5. 交付可靠的单体应用是一项挑战(某开发人员:我艹,上回写的需求里面有一个OOM的bug,P0级故障,我要准备跑路了 )
  6. 需要长期依赖某个可能已经过时的技术栈(技术大牛: shit,我Golang白学了)

如果单从FTGO项目来分析单体架构,我们眼里看到的更多的是单体架构的不足。但是需要知道的是,在微服务架构出现之前,基本所有的公司都用的单体架构,如果单体架构那么不堪,怎么可能会有那么多企业的架构师会选择采用单体架构进行项目的开发呢?也就是说,衡量一个架构的好坏不能单靠一个案例就可以决定的。

假设现在公司想让你做一个业务相对简单的系统,你会选用单体架构还是微服务架构?

如果是我的话,我会首选单体架构,至于为什么,我从一下几个角度进行说明:

  1. 纵向角度(MVC分层架构):对于这个意义上的“可拆分”,单体架构完全不会展露出丝毫的弱势,反而可能会因更容易开发、部署、测试而获得一些便捷性上的好处。
  2. 横向角度(物理加服务器):单体架构也可以支持按照技术、功能、职责等维度,将软件拆分为各种模块,以便重用和管理代码。单体系统并不意味着只能有一个整体的程序封装形式,如果需要,它完全可以由多个 JAR、WAR、DLL、Assembly 或者其他模块格式来构成。即使是以横向扩展(Scale Horizontally)的角度来衡量,在负载均衡器之后同时部署若干个相同的单体系统副本,以达到分摊流量压力的效果,也是非常常见的需求
  3. 服务的性能消耗角度:一台服务器就可以满足业务需求
  4. 人员角度:开发此系统的开发人员规模没有超过“2 Pizza Team”的范畴
  5. 业务层面:业务简单,不需要进行业务拆分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keepalived+LVS部署

目录 一、环境准备 二、实验拓扑 三、部署LVS DR环境 四、LVS服务器配置keepalived 1、安装keepalived 2、修改lvs1服务器keepalived配置 3、修改lvs2服务器keepalived配置 五、客户端测试 1、负责均衡测试 2、LVS服务器高可用测试 一、环境准备 准备4台centos服务器…

学习日记(单元测试、反射、注解、动态代理)

文章目录学习日记(单元测试、反射、注解、动态代理)一、单元测试1. 单元测试实践2. JUnit 常用注解二、反射1. 反射获取类对象2. 反射获取构造器对象3. 反射获取成员变量对象4. 反射获取成员方法对象三、反射的作用举例1. 绕过编译阶段为集合添加数据2. …

基于生物地理学的优化算法(BBO)用于训练多层感知器(MLP)【多种算法进行比较】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

java中的BigDecimal使用

文章目录1、什么是BigDecimal?2、为什么使用BigDecimal?3、如何使用BigDecimal?(1)BigDecimal初始化赋值(2)加减乘除运算(3)BigDecimal保留两位小数及舍入模式&#xff0…

WFP实现侧边栏导航菜单

菜单导航功能实现,常规的管理系统应该常用,左侧显示菜单条目,点击菜单,右侧切换不同的业务用户控件。 常用菜单可以采用TreeView树形控件特定样式实现 ,本文介绍的是使用ExpanderListView的组合形式实现的导航菜单&am…

算法day24|理论基础77

详细布置 理论基础 什么是回溯法:递归函数下面通常有回溯法 它使用的地方:组合,切割,子集,排列,棋盘问题(N皇后,解数独) 回溯算法的模板: void backtracking(参数)&…

微型计算机基础

微型计算机常用术语 位(bit):计算机所能表示的最基本,最小的数据单元。1个二进制位有两种状态0和1 通常情况下0表示低电平(接地),1表示高电平接电源(VCC) 字节&#xff0…

MATLAB 矩阵处理及多项式计算

一、实验目的 (1)掌握生成特殊矩阵以及矩阵处理的方法 (2)掌握数据统计和分析的方法 (3)掌握多项式的常用计算 二、实验原理与实验设备 原理:计算机编程相关知识技能和MATLAB软件编译环境 …

c++——map和set的封装

注:该封装基于前面博客已实现红黑树,map和set封装并不难,主要还是对红黑树的理解 目录 一. 改造红黑树 1. 改变节点的定义,使用更高维度的泛型 2. 红黑树追加迭代器的实现 1. 红黑树迭代器的构造函数和基本框架 2. begin()和e…

2.4、编码与调制

2.4、编码与调制 在计算机网络中。计算机需要处理和传输用户的文字,图片,音频和视频。它们可以统称为消息。 数据是运送消息的实体。 计算机中的网卡将比特 000 和 111,变换成相应的电信号发送到网线。 也就是说,信号是数据的…

[附源码]java毕业设计网络学习平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

LeetCode力扣刷题——更加复杂的数据结构

更加复杂的数据结构 一、引言 目前为止,我们接触了大量的数据结构,包括利用指针实现的三剑客和 C 自带的 STL 等。 对于一些题目,我们不仅需要利用多个数据结果解决问题,还需要把这些数据结构进行嵌套和联 动,进行更为…

五.STM32F030C8T6 MCU开发之RTC模块基础例程

五.STM32F030C8T6 MCU开发之RTC模块基础例程 文章目录五.STM32F030C8T6 MCU开发之RTC模块基础例程0.总体功能概述1.RTC硬件介绍1.1日历的功能1.2 闹钟输出1.3 入侵检测1.4 时间戳事件检测2.RTC软件配置2.1.RTC 模块初始化配置2.2 RTC 开始时间配置2.2.1RTC 年月日 时分秒配置2.…

_linux 进程间通信(管道)

文章目录1. 进程间通信目的2. 进程间通信发展3. 进程间通信分类4. 管道1. 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息&#x…

【English】十大词性之介词

介词 文章目录介词前言一、方位介词1.1 某地1.2 里里外外1.3 上上下下1.4 前前后后1.5 ....中间1.6 ...穿越1.7 ...树上1.8 在...墙上1.9 旁边(距离远近区分)二、时间介词三、方式介词四、易混淆介词4.1 制成4.2 交通工具4.3 除了总结前言 介词是表示名词、代词与句子中其它词…

02Java线程模型

1. 操作系统线程 无论使用何种编程语言编写多线程程序,最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。 线程有多种实现方式,常见的有:内核线程、用户线程、混合线程。 不同线程模型的主要区别在于线程的调度方不…

【Ubuntu】配置ubuntu网络

配置ubuntu网络 一、三种虚拟网络介绍二、 配置ubuntu系统使用桥接模式连接外网三、通过NAT模式让ubuntu系统连接外网四、常见问题1.解决ubuntu系统没有网络图标一、三种虚拟网络介绍 VMnet0 : 桥接模式,选中桥接模式之后,可以将VMnet0桥接到对应的物理网卡之上, 默认选中自…

uniapp公共新闻模块components案例

uniapp公共新闻模块components案例 简介&#xff1a;本文使用uniapp的公共新闻模块讲解components案例。 效果展示&#xff1a; 第一步 创建公共模块 第二步 编写组件 <template><view class"newsbox"><view class"pic"><ima…

动态路由协议 OSPF 工作过程 之 状态机维度

状态机 &#xff1a; # 什么是状态机呢 &#xff1f; 状态机 &#xff1a; 就是 OSPF 路由间的邻居关系所在的不同阶段 不同的关系 就是 不同的状态机 OSPF 的状态机 &#xff1a; # 我们用 思科 的PPT 来介绍 OSPF 的状态机 # 里面所有黄颜色方框里 标定的就是 状态机…

Json格式API调试,taobao1688pinduoduo商品详情测试接口

Json常用类型 任何支持的类型都可以通过 JSON 来表示&#xff0c;例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。 对象&#xff1a;对象在 JS 中是使用花括号包裹 {} 起来的内容&#xff0c;数据结构为 {key1&#xff1a;value1, key2&#xf…