软件架构:从传统单体到现代微服务的技术演变

1.引言

在软件开发中,架构设计不仅仅是程序员的技术任务,它更是一个项目成功的关键。无论是小型应用还是大型分布式系统,软件架构都直接影响着系统的可维护性、可扩展性、性能和稳定性。理解软件架构的必要性,能够帮助开发人员做出正确的技术决策,从而避免后期出现技术债务、性能瓶颈或是开发效率低下等问题。

对于程序开发人员来说,了解架构模式能够:

  1. 优化开发效率:合理的架构模式能够规范开发流程,提高团队协作效率。
  2. 降低系统复杂性:随着项目的规模扩大,系统的复杂性也会增加。架构设计的核心就是分解复杂性,使系统更易于维护和扩展。
  3. 提高系统灵活性:架构设计可以帮助团队应对需求变化。通过模块化、分层架构等设计,可以确保系统在面对新需求时能够灵活应变。
  4. 减少风险:在系统设计初期做出正确的架构决策,能够避免项目后期技术上的重构和返工,降低开发成本。

2.架构类型概述

在现代软件开发中,不同的架构模式适用于不同规模和业务需求的项目。以下是六种常见的架构模式:

1. 单体架构 (Monolithic Architecture)

单体架构是指将所有功能和模块集中在一个应用中运行,通常作为一个单独的进程部署。

特点

  • 所有模块紧密耦合,通常共享数据库。
  • 开发简单,适合初期小型项目。
  • 随着功能增加,代码会变得难以维护。
2. 垂直架构 (Vertical Architecture)

垂直架构将大型应用按照业务拆分成多个相对独立的小型应用,但每个应用仍然是单体架构,且不直接通信。

特点

  • 各模块之间没有明确的通信协议。
  • 每个模块可以独立部署,但不具备微服务的灵活性。
  • 适用于快速拆分已有单体架构,减少冗余。
3. SOA架构 (Service-Oriented Architecture)

SOA架构将应用划分为多个独立服务,每个服务负责独立的业务功能,并通过企业服务总线(ESB)进行集成。

特点

  • 服务之间通过ESB进行通信。
  • 模块化拆分,但可能引入性能瓶颈。
  • 通常适用于较大的企业级系统。
4. 微服务架构 (Microservices Architecture)

微服务架构将应用拆分为多个小型、独立部署的服务,每个服务负责单一业务功能,服务之间通过轻量级协议(如REST、RPC)进行通信。

特点

  • 每个服务独立部署和扩展。
  • 服务之间的通信相对轻量级。
  • 可以使用不同技术栈,灵活性高。
5. 服务网格架构 (Service Mesh Architecture)

服务网格架构是一种用于微服务架构的解决方案,用于管理和优化服务间的通信、流量控制、监控和安全等。

特点

  • 通过独立的网格层(如Istio)管理服务间的流量。
  • 支持细粒度的流量控制、熔断和负载均衡。
  • 增强了微服务的可观测性和安全性。
6. 云原生架构 (Cloud-Native Architecture)

云原生架构采用容器化、微服务、服务网格等技术,通过自动化和弹性扩展来管理应用。它专门为云环境优化,支持快速部署和弹性伸缩。

特点

  • 强调容器化和微服务。
  • 使用持续集成和交付(CI/CD)提高开发效率。
  • 完全依赖云平台,具有自动扩展能力。

3.单体架构概述

在计算机软件工程的早期阶段,单体架构模式普遍应用于应用程序的开发实践中。此模式的特点是将应用程序的各个功能模块集中整合至一个统一的代码库中,并在同一进程环境下进行部署。这种设计理念的根源在于,在技术和业务需求较为简单的背景下,通过减少模块间的复杂交互,旨在简化开发和部署流程。
单体架构意味着代码被部署并作为单个节点上的单个进程运行,即all in one
接下来以一个电商项目为例,将分析单体架构下系统的组成。
在单体架构中,电商系统会被设计为一个单独的应用,所有的功能模块(如用户管理、商品管理、订单管理以及支付管理)都集中在一起,作为一个单一的进程运行,具体如下图所示:
在这里插入图片描述

4.垂直架构概述

单体架构随着业务越来越复杂、团队规模越来越大,Git上提交的代码也越来越多,搞到最后,代码集成十分困难,没办法只能将不同分支上的代码独立运行,因此逐渐出现了业务分化,在时间的推动下,一个大的系统就变成了多个子系统共同运行,系统架构就变成了下图样貌。
在这里插入图片描述
在垂直架构下,电商应用将每个业务模块(例如,用户、商品、订单)拆分为独立的服务,每个模块仍然是单体架构。各模块可以独立部署和扩展,减轻单体架构的压力。
通过这种方式,能够让团队分工更加明确,并且多个子系统之间互不影响,提升了系统的分区容错性,而且使得系统吞吐量进一步身高。

5.SOA架构概述

经过子系统的演变后,整个系统就变成了分布式系统了,每个子系统负责不同的职责,但是这种子系统拆分存在致命的缺陷。即,在多个子系统之间,就好似一个项目里的多个模块,产生了强耦合性,系统之间的配合和通信,完全靠写死对方子系统的IP来完成调用,一旦某个子系统出现故障,依旧存在整个系统全面瘫痪的风险。
而在SOA架构中,将电商系统拆分为多个业务服务,每个服务通过ESB进行通信,具体如下图所示:
在这里插入图片描述

6.微服务架构

虽然ESB可以解决多个子系统之间的通信问题,但是ESB存在性能瓶颈,且服务之间的通信较为复杂,后面就诞生了微服务。
微服务架构通过将单体应用拆分为多个独立的服务,针对不同的业务领域进行划分和优化,可以更加灵活地应对不同服务的并发需求。这种方式不仅提升了系统的可扩展性,还使得各个服务的资源得到了更加合理的利用。
此外,微服务架构还带来了更高的灵活性和可维护性。每个服务独立开发、测试、部署和维护,可以大大降低单个服务出现故障时对整个系统的影响。而且,服务之间的解耦使得在未来的业务发展中,可以根据不同的业务需求和并发量动态调整各个服务的部署和资源分配,进而实现更高效的性能优化和负载均衡。具体针对电商系统的微服务架构图如下所示:
在这里插入图片描述

7.服务网格架构

在微服务架构中,随着服务的增加,服务间的通信变得越来越复杂,服务发现与注册、负载均衡、服务熔断和降级、安全与故障恢复等代码和业务逻辑耦合在一起,并且每个微服务都要实现相同的服务注册与发现,熔断等基础设施层代码,同时也增加了维护的成本。因此便出现了服务网格架构。
服务网格是一种基础设施层,用于管理和优化微服务之间的通信、流量控制、负载均衡、监控、安全和故障恢复。它通过在微服务和它们之间的通信渠道上增加一层抽象,帮助开发者专注于业务逻辑,而将通信和基础设施相关的复杂问题交给服务网格来处理。具体如下图所示:
在这里插入图片描述
服务网格的基本组成包括两个重要组件:

  1. 数据面(Data Plane)
    数据面是服务网格的核心,它通过“Sidecar”代理的形式部署在每个微服务实例旁边,用于处理服务间的流量。每个微服务实例都会有一个 sidecar 代理,负责拦截进出服务的所有流量,并在代理中执行如负载均衡、流量管理、熔断、日志记录、指标收集等任务。

    • Sidecar Proxy:它是数据面的核心组成部分,作为每个服务的代理,处理所有网络通信。典型的 sidecar 代理是 Envoy,它能够拦截和处理服务之间的所有请求。
  2. 控制面(Control Plane)
    控制面负责管理和配置服务网格的数据面。它提供了对流量管理、服务发现、配置和策略执行的控制。控制面协调 sidecar 代理的配置,通常包括健康检查、流量路由、熔断策略等。

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

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

相关文章

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…

SQL Servers审核提高数据库安全性

一、什么是SQL Server审核? SQL Server审核包括追踪和审查发生在SQL Server上的所有活动,检测潜在的威胁和漏洞,能够监控和记录对服务器设置的每次更改。此外,可以帮助管理员可以轻松地追踪数据库中特定表中的所有服务器活动&…

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)

前言 1、前面写过一篇 阿里云免费ssl证书申请与部署,大家可以去看下 2、建议大家看完本篇博客,可以再去了解 openssel 命令 openssl系列,写的很详细 一、openssl 安装说明 1、这部分就不再说了,我使用centos7.9,是自…

Bootstrap-HTML(三)Bootstrap5列表组全解析

Bootstrap-HTML(三)Bootstrap5列表组全解析 前言(一)HTML 列表基础回顾1.无序列表2.有序列表3.定义列表 二、无样式的有序列表和无序列表内联列表 三、Bootstrap5 列表组1.基础的列表组2.设置禁用和活动项3.链接项的列表组4.移除列…

MongoDB安装|注意事项

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书,作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书,它是真正讲解Spring Boot的图书。Spring Boot的核心…

频率分辨率、频率间隔与频率采样密度

频率分辨率 ( F res F_{\text{res}} Fres​): 频率分辨率 F res F_{\text{res}} Fres​ 与采样周期 T T T 和采样点数 N N N 有关,公式为: F res ∼ 1 N T [ Hz ] F_{\text{res}} \sim \frac{1}{NT} \quad [\text{Hz}] Fres​∼NT1​[Hz] 频…

Lua面向对象 实现 超详细注释 实现构造函数,析构函数,只读类模板等功能

Lua面向对象 实现 超详细注释 实现构造函数,析构函数,只读类模板等功能 源码 -- 注意下面的代码可以拆开成多个文件使用,也可以放一起 -- Class.lualocal _class {}-- 将Source变成只读表并返回 function MakeTableReadOnly(Source)local …

线性回归方程模型

一、项目要求 以个人为单位,实现AI识别的算法: 调查某市出租车使用年限和该年支出维修费用(万元),得到数据如下: 使用年限(x) 2 3 4 5 6 维修费用(y) 2.2 3.8 5.5 6.5 7.0 求线性回归方程由1中结论预测第10年所支出的维修费用 3.说明自己选中预测的原因和过程中的收获 说…

【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息

示例代码说明: 读取txt指定内容如地物id,输出OpenDRIVE数据中的对应地物id和名称name信息为xml文件 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取OpenDRIVE文件路径 xml_filepath…

什么是DBD设备?

2022年10月,本号文章《北斗优先是对北斗三代的挑衅》中指出:“多系统兼容互操作是北斗三号逐步替代北斗二号的主要原因。北斗优先是对北斗三代的挑衅。”现在想来,当时还是太年轻,格局没有打开。 2023年12月,本号文章…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现,因为官方有很多相关的功能和方法…

高质量翻译在美国推广移动应用中的重要性

美国的移动应用市场是世界上竞争最激烈、利润最高的市场之一,为开发者提供了接触数百万潜在用户的机会。然而,进入这个市场需要的不仅仅是创新技术或令人信服的想法;它要求与目标受众进行有效地沟通和文化契合。在这个过程中,高质…

基于Python的PDF批量转化工具

一、开发的缘由 最近,有网友想让我帮他做一个批量把png, docx, doc, pptx, ppt, xls, xlsx文件转化为PDF格式的软件,完全傻瓜式的操作,把文件拖进去就进行转化那种,简单实用。之前,有过一个vbs的文件,可以…

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

【Copilot 】TAB keybinding not working on JetBrains Client

pycharm ssh 远程到ubuntu24.04 发现tab就是tab,无法输出copilot给出的自动补全到便捷器里。禁用host的copilot插件,重新启动ide就好了。解决办法 参考大神的办法删除主机和客户端插件中的 Copilot插件。 仅在客户端中重新安装 Copilot 插件。 我只是禁用也可以 对比了键盘映…

【Linux】程序的编译过程

程序的翻译过程 预处理(头文件展开,条件编译,宏替换,去注释)编译 :把c变成汇编语言汇编 :把汇编变成二进制(不可执行,二进制目标文件)链接 :把自…

Trunk链路操作题

Trunk链路操作题 论证:

【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题

实验 7:默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步&#xff…

特殊的数学性质

一个数模9的结果等于它的每一位数相加和模9

JSP知识点总结

jsp九大对象 在jsp中内置了9个对象,无需创建该对象即可使用。其名称为固定名称。 1.out输出对象 - 属于JspWriter print(): 输出 flush(): 刷新 close(): 关闭 2.request请求对象 - 属于HttpServletRequest getParameter(): 获取请求的参数 setCharacterEncodin…