【云原生】软件架构的演进以及各个架构的优缺点
文章目录
- 1. 什么是软件架构?
- 2. 单机架构
- 3. 应用数据分离架构
- 4. 应用服务集群架构
- 5. 读写分离架构
- 6. 冷热分离架构
- 7.垂直分库架构
- 8. 微服务架构
- 9. 容器编排架构
- 10. 小结
1. 什么是软件架构?
软件架构是指在设计和构建软件系统时,对系统的组织结构、组件、模块、接口以及它们之间的关系和行为进行规划和定义的过程。它描述了软件系统的整体结构和组成部分之间的关系,以及系统的行为和功能。
软件架构的演进大致可以分为:
- 单机架构
- 应用数据分离架构
- 应用服务集群架构
- 读写分离架构
- 冷热分离架构
- 垂直分库架构
- 微服务架构
- 容器编排架构
下面为大家一一进行介绍

2. 单机架构
单机架构是一种简单的技术架构,通常指在一个单独的服务器上运行整个应用程序。在单机架构中,所有的组件和功能都运行在同一个物理或虚拟机上。
出现的原因:在互联网的早期,访问量比较小,单机架构足以满足需求
单机架构的优点:
- 部署简单
- 成本低
在单机架构中,所有的组件都运行在同一个服务器上,相互之间可以通过本地调用或直接访问来进行通信。这种架构简单、易于部署和管理,适用于小型应用或者不需要高可用性和扩展性的场景。
单机架构的缺点:
- 单点故障:由于所有的组件都运行在同一个服务器上,一旦服务器发生故障,整个应用程序将无法访问。
- 扩展性有限:单机架构通常只能通过升级硬件来提高性能,无法通过横向扩展来应对高负载。
- 难以维护和升级:由于所有的组件都集中在一个服务器上,维护和升级可能会影响整个应用程序的正常运行。
- 数据库与应用相互竞争资源
3. 应用数据分离架构
应用数据分离架构是一种将应用程序和数据存储分离的架构设计。在这种架构中,应用程序和数据存储可以运行在不同的服务器或者不同的环境中,通过网络进行通信。
出现原因: 单机架构存在严重的资源竞争,导致站点变慢
应用数据分离架构的优点包括:
- 可伸缩性:通过将应用程序和数据存储分离,可以独立地扩展应用程序和数据存储的能力,以满足不断增长的需求。
- 可维护性:独立的应用程序和数据存储使得系统的维护和升级更加容易,可以分别进行配置、优化和升级。
- 安全性:通过合理的安全和身份验证机制,可以保护数据的安全性和隐私性。
- 异构性:应用程序和数据存储可以选择不同的技术和平台,以满足不同的需求和约束条件。
缺点:
- 硬件成本变高
- 性能有瓶颈,无法应对海量并发
4. 应用服务集群架构
应用服务集群架构是一种将多个应用服务器组成集群的架构方式,旨在提高应用的可靠性、可扩展性和性能。
出现原因: 单个应用不足以支持海量的并发请求,高并发时战点响应变慢
应用服务集群架构的核心概念包括负载均衡、会话共享和故障转移。
-
负载均衡:通过将用户请求分发到不同的应用服务器上,实现请求的均衡分配,避免单个服务器负载过重,提高整体性能。
-
会话共享:为了保证用户在不同的应用服务器间的会话一致性,需要将会话信息存储在共享的存储中,例如数据库或缓存中。这样,当用户请求被转发到不同的应用服务器上时,可以保持用户会话的连续性。
-
故障转移:当某个应用服务器发生故障时,集群中的其他健康服务器可以接管该服务器的工作,确保应用的可用性。这可以通过使用心跳检测、监控和自动故障转移机制来实现。
负载均衡中间件: Nginx,LVS,F5等
优点:
- 高可用
- 高性能
- 具有一定的拓展能力
缺点:
- 性能瓶颈,数据库只有一个,架不住海量的并发
- 硬件成本变高
- 运维工作增多
5. 读写分离架构
读写分离架构是一种将数据库的读操作和写操作分离的架构设计,提高了数据库的性能和可扩展性。
读写分离架构的核心思想是将读操作分发到多个只负责读的从数据库(也称为从库),而写操作则由主数据库(也称为主库)处理。主库负责写入数据并同步到从库,而从库则负责处理读操作。这样可以将读操作的负载均衡到多个从库上,提高读操作的并发性能。
出现原因: 数据库称为性能瓶颈,互联玩一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,因此要把读操作和写操作分离开
使用mycat,tddl等中间件将读和写的请求分离开.使对应的读和写的请求分配给对应的主库/从库
优点:
- 数据库的读取性能提高
- 读操作被其它服务器分担,写的性能间接提升
- 数据库有了从库,数据库的可用性提高(例如:一个服务器挂了,还有其它服务器)
缺点:
- 热点数据的频繁读取导致数据库负载很高
- 当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致
- 服务器成本进一步提升
6. 冷热分离架构
冷热分离架构是一种通过引入缓存,将冷数据和热数据分离存储和处理的架构设计,提高了系统的性能和存储效率。
出现的原因: 海量的请求导致数据库负载过高,站点响应再度变慢
在传统的数据库架构中,所有的数据都存储在同一个数据库中,无论数据的访问频率如何。而在冷热分离架构中,根据数据的访问频率将数据分为冷数据和热数据。
冷数据指的是访问频率较低的数据,往往是历史数据或不经常被查询的数据。这些数据可以被迁移到低成本、低性能的存储介质,如磁盘或云存储中。
热数据 指的是访问频率较高的数据,往往是经常被查询和更新的数据。这些数据可以被保留在高性能的存储介质,如内存或快速存储设备中。
缓存常用中间件: Redis
优点:
- 大幅降低对数据库的访问请求,性能提升非常明显
- 将冷数据存储在低成本的存储介质中,可以节省存储资源和成本。
- 将热数据存储在高性能的存储介质中,可以提高数据的读写速度和响应时间,从而提高系统的性能。
缺点:
- 带来了缓存一致性,缓存击穿,缓存失败,缓存雪崩等问题
- 服务器成本需要进一步增加
- 数据库单库太大,单个表体量太大,数据库再次成为性能瓶颈
7.垂直分库架构
垂直分库架构是一种将数据库按照功能或业务模块进行划分的架构设计
在传统的单一数据库架构中,所有的数据都存储在同一个数据库中,无论是哪个业务模块的数据。而在垂直分库架构中,将不同的业务模块的数据存储在独立的数据库中,实现逻辑上的分离。例如一个购物应用的数据库就可以分为: 用户库,商品库,交易库
优点:
- 数据库的吞吐量大幅提升,不再是瓶颈
- 通过将不同业务模块的数据分散到多个数据库中,可以实现水平扩展,每个数据库可以独立扩展和调整,提高系统的可扩展性。
- 将数据分散到多个数据库中,可以简化数据库的管理和维护工作。
缺点:
- 跨库join,分布式事务等问题需要方案去解决,目前的mmp都有对应的解决方案
- 数据库和缓存结合目前能够抗住海量的请求,但是应用代码整体耦合在一起,修改一行代码需要重新发布
8. 微服务架构
微服务架构是一种软件架构风格,将一个大型应用程序拆分为一组小型、独立的服务,每个服务都专注于执行特定的业务功能。这些服务可以独立开发、部署和扩展,通过轻量级的通信机制进行相互协作,共同构建一个完整的应用系统。
出现原因: 之前的架构有扩展差,持续开发困难,不可靠,不灵活和代码维护困难等弊端
优点:
- 灵活性高: 服务独立测试,部署,升级和发布
- 独立性高: 每个服务可以自行进行扩展
- 提高容错性: 一个服务问题并不会让整个系统瘫痪
- 新技术的应用容易: 支持多种变成语言
缺点:
- 运维复杂度高: 业务不断发展,应用和服务不断升级,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突问题
- 资环使用多: 这些独立运行的微服务都需要占用内存和CPU
- 处理故障困难: 一个请求跨多个服务调用,需要查看不同的服务的日志完成问题定位
9. 容器编排架构
容器编排架构是一种用于管理和编排容器化应用程序的架构设计。
容器编排架构提供了一种自动化的方式来部署、扩展和管理容器化应用程序,以实现高度可伸缩、弹性和可靠的部署。
在容器编排架构中可以借助容器化技术(如docker)将应用/服务打包为镜像,通过容器编排工具(如k8s)来动态发布和部署镜像,服务以容器化的方式进行
出现的原因:
- 微服务拆分细, 服务多部署工作量大,而且配置复杂,容易出错
- 微服务数量多,扩缩容麻烦,而且容易出错,每次缩容后再扩容又需要重新配置服务对应的环境参数信息
- 微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突
优点:
- 部署,运维简单快速: 一条命令就可以完成几百个服务的部署或者扩缩容
- 隔离性好: 容器与容器之间文件系统,网络等相互隔离,不会产生环境冲突
- 轻松,支持滚动更新: 版本间切换都可以通过一个命令完成升级或者回滚
缺点:
- 技术栈变多,对研发团队要求高
- 网络和存储挑战:在容器编排架构中,容器之间需要进行网络通信,并且需要访问共享的存储资源。处理容器之间的网络和存储挑战可能需要额外的配置和管理工作。
10. 小结
软件架构的演进首先解决的是应用和数据库之间的问题,通过将应用和数据库部署到不同的服务器上. 然后再通过负载均衡,处理应用的高并发问题.其次就是对数据库进行优化,通过读写分离,使用缓存,分库分表,分布式数据库来优化数据库. 最后就是在运维方面进行优化.
软件架构是软件开发的重要阶段,在软件生命周期中起到指导和决策的作用。一个好的软件架构可以提供良好的扩展性、可维护性和可重用性,从而降低开发和维护成本,并满足系统的需求和用户的期望。

相关文章:
【云原生】软件架构的演进以及各个架构的优缺点
文章目录 1. 什么是软件架构?2. 单机架构3. 应用数据分离架构4. 应用服务集群架构5. 读写分离架构6. 冷热分离架构7.垂直分库架构8. 微服务架构9. 容器编排架构10. 小结 1. 什么是软件架构? 软件架构是指在设计和构建软件系统时,对系统的组织结构、组件、模块、接…...
力扣刷题笔记——二叉树
首先定义二叉树节点的结构体 struct TreeNode{TreeNode* left;TreeNode* right;int val;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* l,TreeNode* R):val(val),left(l),right(R){…...
【华为OD机试】工号不够用了怎么办?(python, java, c++, js)
工号不够用了怎么办? 前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 题目…...
【leetcode】198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非…...
【react全家桶学习】react的 (新/旧) 生命周期(重点)
目录 生命周期(旧) 挂载时的生命周期 constructor(props) componentWillMount()-------------新生命周期已替换 render() componentDidMount()--- 组件…...
Gradio私网和公网的使用
Gradio私网问题 如果部署的服务器只有私有地址,那么无法直接从外部网络中的其他计算机访问该服务器和其中运行的 Gradio 应用程序。在这种情况下,你可以考虑使用端口转发技术,将服务器的私有地址映射到一定的公开地址上,从而可以…...
ant design vue 配置菜单外部打开
实现如下 菜单配置 前端项目地址:http://localhost:3000 菜单路径:dataCenter/HealthData 打开方式:外部 在项目中src-->config-->router.config.js文件 将需要再外部打开的菜单地址进行如下配置 菜单地址:/dataCenter/Hea…...
YOLOv5/v7 添加注意力机制,30多种模块分析⑦,CCN模块,GAMAttention模块
目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、CCN模块1、CCN模块的原理2、实验结果3、应用示例 三、GAMAttention模块1、GAMAttention模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本…...
IDEA下Logback.xml自动提示功能配置
首先打开logback的配置文件,在configuration标签中加入xsd的配置 <configuration xmlns"http://ch.qos.logback/xml/ns/logback"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ch.qos.logback/xml…...
CUDA编程模型系列八(原子操作 / 规约 / 向量元素求和)
本系列视频目的是帮助开发者们一步步地学会利用CUDA编程模型加速GPU应用, 我们的口号是: 让GPU飞起来 本期我介绍了cuda 当中规约算法的一种情况, 也是小何尚职业生涯中的第一道面试题, 计算数组中所有元素的和. CUDA编程模型系列八(原子操作 / 规约 / 向量元素求和) #include…...
go语言系列基础教程总结(4)
1、goroutine和channel 每执行一次go func()就创建一个 goroutine,包含要执行的函数和上下文信息。 goroutine 是Go程序并发的执行体,channel是它们之间的沟通连接通道。 var ch1 chan int. //声明一个整型的通道 2、channel 常用操作 //定义一个…...
网络基础一:网络协议初识与网络传输基本流程
目录 网络协议认识“协议”网络协议初识协议分层OSI七层模型(理论模型)TCP/IP五层(或四层)模型(工程实现模型) 网络中的地址管理MAC地址IP地址 网络传输基本流程路由的本质 数据包封装和分用网络协议需要解决的问题 网络协议 计算…...
Mysql找出执行慢的SQL【慢查询日志使用与分析】
分析慢SQL的步骤 慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来explain 慢SQL分析show Profile。(比explain还要详细…...
设计模式3:单例模式:JMM与volatile和synchronized的关系
本文目录 JMM简介Java 内部内存模型(The Internal Java Memory Model)硬件内存架构(Hardware Memory Architecture)弥合 Java 内存模型和硬件内存架构之间的差距(Bridging The Gap Between The Java Memory Model And The Hardware Memory Architecture)1.共享对象的可见性2.竞…...
一个简单的OPC UA/ModbusTCP 网关(Python)
使用我前面几篇博文的内容,能够使用Python编写一个最简单的OPC UA /ModbusTCP网关。 从这个程序可以看出: 应用OPC UA 并不难,现在我们就可以应用到工程应用中,甚至DIY项目也可以。不必采用复杂的工具软件。使用Python 来构建工…...
线性代数行列式的几何含义
行列式可以看做是一系列列向量的排列,并且每个列向量的分量可以理解为其对应标准正交基下的坐标。 行列式有非常直观的几何意义,例如: 二维行列式按列向量排列依次是 a \mathbf{a} a和 b \mathbf{b} b,可以表示 a \mathbf{a} a和…...
python用flask将视频显示在网页上
注意我们的return返回值必须是以下之一,否则会报错 from flask import Flask, render_template, Response import cv2app Flask(__name__)app.route(/) def index():return render_template(index.html)def gen(camera):while True:success, image camera.read(…...
【数据挖掘】时间序列教程【一】
第一章 说明 对于时间序列的研究,可以追溯到19世纪末和20世纪初。当时,许多学者开始对时间相关的经济和社会现象进行研究,尝试发现其规律和趋势。其中最早的时间序列研究可以追溯到法国经济学家易贝尔(Maurice Allais)…...
优化索引粒度参数提升ClickHouse查询性能
当对高基数列进行过滤查询时,总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。ClickHouse缺省在MergeTree表读取8192行数据块,但我们可以在创建表时调整该index_granularity 参数。本文通过示例说明如何调整该参数优化查询性能。 inde…...
selenium\webdriver\remote\errorhandler.py:242: SessionNotCreatedException问题解决
报错信息: raise exception_class(message, screen, stacktrace) E selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 112 E Current browser versi…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
