八种架构演进

日升时奋斗,日落时自省
目录
1、单机架构
2、应用数据分离架构
3、应用服务集群架构
4、读写分离/主从分离架构
5、冷热分离架构
6、垂直分库架构
7、微服务架构
8、容器编排架构
9、小结
1、单机架构
特征:应用服务和数据库服务器公用一台服务器
出现场景:访问量较小,单机可以满足,由于现在硬件的升级,所以一台服务器够支持很多请求

红色箭头表示请求访问,蓝色箭头表示响应
单机程序中,其实靠的不就是数据库信息的拉取嘛,但是数据库也不是不能去掉,光服务器负责所有操作(单机架构是比较常见架构使用)
一台主机的硬件资源是有上限的,CPU、内存、硬盘、网络每次请求都会收到一个请求,都是需要消耗上述的一些资源,现在一台主机都够用(不行了其实也可以增加硬件资源,但是肯定硬件资源不能在加了就开始使用分布式)
优点:部署简单、成本低
缺点:性能有严重平静、数据库和应用互相竞争资源
2、应用数据分离架构
特征:应用服务和数据库服务使用不同服务器
出现场景:单机架构存在严重的资源竞争,导致站点变慢

红色箭头表示请求访问,蓝色箭头表示响应
优点:成本相对可控、性能相比单机有提升、数据库单独隔离、不会因为应用把数据库搞坏,不至于数据库瘫痪
缺点:硬件成本变高、性能有瓶颈,无法对应海量并发(当前数据库仍然是要接收所有请求处理处理)
3、应用服务集群架构
特征:引入负载均衡,应用以集群方式运作
出现场景:单个应用不足以支持海量的并发请求,高并发的时候站点响应变慢
注:能接收请求量多到数千,多个应用服务器集群同时处理大量请求量(此处tomcat就是横向扩展)

注:如果请求量更大呢,其实也同样可以按照上面的方法,交给一个更大应用服务接收请求,不够再进行横向扩展(第一先交给上层管理,第二同层进行横向扩展)

红色箭头表示请求访问,蓝色箭头表示响应
注:根据需求而定不是说这样的架构一定好,能承载越多并发量就越适合当前,根据情况而定;对于图解有个解释,上面画的只是一个大概的图,实际上有了上层之后,下层就需要更多来接收,毕竟上层是负载均衡器,还是要给下层分配的
优点:
针对应用服务器
(1)高可用:应用满足高可用,不会一个服务出问题整个站点挂掉
(2)高性能:如果不是访问数据库,应用相关处理海量请求快速响应
(3)扩展能力:支持横向扩展
缺点:
针对数据库
(1)性能瓶颈:无法应对数据库的海量查询
(2)可用性:数据库是点单的,所以一旦崩溃就是整个系统挂掉
(3)运维成本高:扩展部署运维工作增加
(4)硬件成本高:说的就是F5这个硬件
4、读写分离/主从分离架构
特征:将数据库集群化,但是为了保证所取数据都是相同的,就让一个数据哭来下,剩下的小弟们跟随大哥进行同步;数据库服务器搭建主从集群,一主一从、也可以一主多从都可以,,数据哭主机负责写操作,从机只负责读操作
出现场景:数据库到达瓶颈,而互联网应用一般读多写少,数据库承载压力主要来源于读的请求你造成的,那么针对这样的情况把读操作和写操作分开

注:红色箭头表示请求是写操作;浅蓝色箭头表示读操作;紫色箭头表示写操作进行同步,同步给从库;蓝色箭头表示响应
优点:
针对请求访问
(1)读取性能提升
(2)读取操作为主数据库减轻了大部分请求的压力,写操作性能也得以提升
(3)可用性:一个数据库的坍塌不会给系统带来致命的伤害,提高了可用性
缺点:
针对热点数据
(1)读库虽然分担了很多请求量,但是它也会负载,热点数据的疯狂访问
(2)同步从库挂掉,或者延时,导致主库和从库数据有一定可能不一致
(3)服务器成本需要增加(添东西了,能不增加)
5、冷热分离架构
这里针对冷热数据进行解析:针对所谓数据都有常用数据,不常用数据,也就衍生出了“二八原则”,20%的热点数据,能满足80%的访问需求(不是说一定就是20%,按照业务需求来定夺分配,“一九”也不是没有)
特征:引入缓存,实行冷热分离,将热点数据放到缓存中快速响应
出现场景:海量的请求导致数据库负载过高,站点响应在度变慢,说明数据库已经开始吃力了;不足以提供较高的舒适度

优点:大幅度降低数据库的访问请求,性能提升非常明显(访问缓存相比访问数据库快)
缺点:
(1)涉及到缓存就会设想到缓存到来的相关问题,缓存击穿、缓存失败、缓存雪崩等问题
(2)服务器成本的提高
(3)业务量支持变大,数据库单库太大,单表个体太大还是会导致数据库查询很慢,导致数据库再度到达瓶颈期
6、垂直分库架构
特征:数据库的数据被拆分,数据库数据分布式存储,分布式处理,分布式查询,也可以理解为分布式数据库架构
出现场景:写操作比较多,单机库性能已经支持不了了,需要拆分数据库,数据表的数据量太多,操作压力大,需要进行分表,降低运维难度,就有了分布式数据库,库表本来也就支持分布式
分库分表:

垂直分库:是指按照业务功能模块进行分库,将不同的业务模块分别放在不同的物理数据库中,这样可以提高系统的性能和扩展性
水平分库:是指按照用户属性(地市或者ID的hash)进行分库,将全省划分为个大区,每个大区有一个物理数据库,这样可以提高系统的扩展性和性能
注:这里就不在往整个架构图中带入了,这里直接将常见到的应用带入到架构中,这些中间件都是可以支持分库操作,内部实现思想也基本如上
分布式数据库:

优点:数据库吞吐量大幅度提升,不再是瓶颈期
缺点:
(1)跨库join操作,分布式事务等问题,需要对应进行解决,目前的mpp都有解决对策
(2)数据库和缓存结合能够支持海量的请求,但是应用代码整体耦合,修改一行代码就需要连带修改很多,整体重新发布
7、微服务架构
特征:按照业务板块来分应用代码,是单个应用的职责更清晰,相互之间可以做到独立升级迭代
出现场景:场景不定全看自己对微服务的定位,这里针对几点进行评定
(1)扩展性差:应用程序不能轻松扩展,因为每次需要更新应用程序时,都必须重新构建整个系统
(2)持续开发困难一个很小的改动会惊动整个系统的代码连带改动,无法频繁并容易发布(这个是灵活性的体现)
(3)不可靠:一个功能不起作用了整个系统可能不能动
(4)代码维护比较吃力,都是在一起的,接手人需要了解整个系统才能每步修改
微服务体现:

架构演示:

注:图并没有画完,这里解释当我们找商品的时候,是可以去访问用户,返回用户信息之后,在去找商品,商品查找操作是一样的,先找缓存,如果缓存没有在找数据库
优点:
(1)灵活性高:服务独立测试、部署、升级、发布
(2)独立扩展:微服务将功能独立起来,各自扩展互不干扰
(3)提高容错性:一个服务问题,不会两边挂
(4)支持编程语言多
缺点:
(1)运维复杂度高:应用和服务的部署变得复杂,同一台服务器上不是多个服务还要解决运行环境冲突的问题,如果需要动态扩缩场景,需要水平扩展服务的性能,就需要在新增服务上准备运行环境(2)资源使用变多:独立一个微服务是需要消耗CPU和内存的
(3)处理故障困难:需要查查看不同的日志完成问题定位,每个都是独立的,如果出问题需要慢慢排查
8、容器编排架构
特征:借助容器化技术(Docker)将应用/服务可以打包为镜像,通过容器编排工具(k8s)来动态分布和部署镜像,服务以容器化方式运行
出现场景:
(1)微服务拆分细致,服务多部署工作量大,配置复杂容易出错
(2)微服务数量多扩缩容麻烦,而且容易出错,每次缩容后再扩容又需要重新配置服务对应的环境参数
(3)微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突
容器化举例:
这里就我们比较熟悉的Java一套体系来说 java应用涉及:java、jdk、centos7 但是我们放到服务器上一次一次放太麻烦了,docker可以直接打包这个三个体系称为一个体系,直接部署到服务器上

容器化体现:

容器编排架构:

红色箭头表示请求,蓝色箭头表示响应,紫色箭头表示去拿用户信息,浅蓝色箭头表示缓存没有,访问数据库
注:这里的图没有画完,同样是访问商品时拿到用户数据信息,再次进行数据访问,先访问缓存,数据不存在访问数据库
优点:
(1)部署运维简单快速:一条命令就可以完成几百个服务的部署或者扩缩容
(2)隔离性好:容器与容器之间文件系统,网络相互隔离,不会产生环境冲突
(3)支持滚动更新:版本间奇幻都可以通过一个命令完成升级或者回滚
缺点:
(1)技术栈变多,技术要求严格
(2)运维成本极高,机器不是随时都会面临如此的资源消耗,一般只会维持一段时间,剩余时间还是闲置状态,此时资源利用率低,推荐云厂商服务器解决问题
9、小结

注:最后压力给到了应用,但是并没有结束,应用的改动会影响整个系统的代码耦合性太高,导致运维部署发布都需要很多次,任务量很大(图太长了,不太会截,这里分开截,内容是连续的)

下面就有了微服务,微服务并没有解决运维任务量大的问题,微服务只是将代码解耦,能让开发更加便捷,各司其职互不影响,运维的麻烦还是经过docker容器化打包成镜像交给k8s进行编排降低运维的任务量
相关文章:
八种架构演进
日升时奋斗,日落时自省 目录 1、单机架构 2、应用数据分离架构 3、应用服务集群架构 4、读写分离/主从分离架构 5、冷热分离架构 6、垂直分库架构 7、微服务架构 8、容器编排架构 9、小结 1、单机架构 特征:应用服务和数据库服务器公用一台服务…...
商城-学习整理-高级-分布式事务(十九)
目录 一、本地事务1、事务的基本性质2、事务的隔离级别3、事务的传播行为4、SpringBoot 事务关键点 二、分布式事务1、为什么有分布式事务2、CAP 定理与 BASE 理论1、CAP 定理2、面临的问题3、BASE 理论4、强一致性、弱一致性、最终一致性 3、分布式事务几种方案1)、…...
Java学习笔记(三):面向对象
文章目录 1.类与对象1.1 定义构造器1.2 定义成员变量1.3 定义方法1.4 static关键字 2. 面向对象的三大特征:封装、继承和多态2.1 封装2.2 继承2.2.1 子类重写父类的方法 2.3 多态 1.类与对象 类(class)和对象(object, 也被称为实例 instance…...
电商项目part02 电商后台多数据源
电商后台项目需要访问的数据源 多数据源方法(读写分离) 方法1:jdk自带的dynamicdatasource 方法2:Mybatis 方式 方法3:dynamicdatasource框架 <!--Druid连接池--><dependency><groupId>com.aliba…...
【C# 基础精讲】LINQ 基础
LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概…...
ChatGPT成为工作工具,具体都应用在哪些地方?
Verified Market Research估计,到2030年,人工智能写作辅助软件市场将达到约65亿美元,复合年增长率为27%。生成式人工智能的浪潮正在席卷世界各地的营销部门。 Botco对美国1000名工作人员进行的调查发现,73%的人表示他们会利用生成…...
Shader学习(三)(片元着色器)
1、在片元着色器处理漫反射 // Upgrade NOTE: replaced _World2Object with unity_WorldToObjectShader "Custom/specularfragement" {properties{_sp("Specular",color) (1,1,1,1)_shiness("Shiness",range(1,64)) 8}SubShader{pass {tags{&…...
谷歌推出首款量子弹性 FIDO2 安全密钥
谷歌在本周二宣布推出首个量子弹性 FIDO2 安全密钥,作为其 OpenSK 安全密钥计划的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示:这一开源硬件优化的实现采用了一种新颖的ECC/Dilithium混合签名模式,它结合了ECC抵御标准攻击的安全性和…...
前端常用的三种加密方式(MD5、base64、sha.js)
作为一名优秀的前端开发工程狮,保障用户的信息安全、密码义不容辞,废话不多说,由我来介绍三种日常开发中经常用到的加密方式。 一、MD5加密 介绍: MD5中文含义为信息-摘要算法5,就是一种信息摘要加密算法,…...
alpine镜像时区设置
alpine镜像是一个完整的操作系统镜像,因为其小巧、功能完备的特点,非常适合作为容器的基础镜像。 如ubuntu、centos镜像动辄几百M的体积下,只有5M的alpine简直是一股清流。 当然alpine在维持体积小的情况下,必然牺牲一些东西。比…...
Java导入Excel,保留日期格式为文本格式
Java 读取Excel文件,防止日期格式变为数字 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*;import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date;public cla…...
uploadifive php上传进度条插件 解决动态传参数问题
uploadifive默认只能在加载时,静态传递参数.如果想让用户输入参数.再动态读取.传到后端,是没有直接的办法的 效果图 但我们可以通过settings.formData 来修改配置的方式传参数,完整演示 <form id"file_form{$v.id}" style"display:none"><hr/>…...
Lombok生成的Getter和Setter的名称对于“eMail”或“xAxis”等属性存在大小写转换异常
问题 最新开发中,遇到一个字段映射问题。我们先看问题案例: 明明代码中第二个字母是大写,结果测试接口时发现变成了小写字母。 分析 通过网上查询发现,这属于Lombok的bug。而且早在2015年就有人在GitHub上提出了issues。 Names o…...
Redis基础概念和数据类型详解
目录 1.什么是Redis? 2.为什么要使用Redis? 3.Redis为什么这么快? 4.Redis的使用场景有哪些? 5.Redis的基本数据类型 5.1 5种基础数据类型 5.1.1 String字符串 5.1.2 List列表 5.1.3 Set集合 5.1.4 Hash散列 5.1.5 Zset有序集…...
C语言之extern “C“详解与使用方法
前言 在你工作过的系统里,不知能否看到类似下面的代码。 这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。 你说的没错,如果你的头文件…...
C++中的运算符总结(4):逻辑运算符(下)
C中的运算符总结(4):逻辑运算符(下) 以下程序演示了如何使用条件语句和逻辑运算符根据变量的值执行不同的代码行: #include <iostream> using namespace std;int main() {cout << "Use …...
CloudQuery实战 | 谁说没有一款一体化数据库操作管控云平台了?
文章目录 CloudQuery询盾的地址CloudQuery主页统一入口数据库归纳SQL编辑器权限管控审计中心数据保护数据变更 CloudQuery文档中心了解CloudQuery快速入门安装步骤社区版v2.1.0操作手册1数据查询更新日志 CloudQuery社区和活动 CloudQuery线上实战线上实战主页面展示及数据操作…...
如何编写一个通用的函数?
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 金句分享:…...
uni-app封装api请求
前端封装api请求 前端封装 API 请求可以提高代码的可维护性和重用性,同时使得 API 调用更加简洁和易用。 下面是一种常见的前端封装 API 请求的方式: 创建一个 API 封装模块或类:可以使用 JavaScript 或 TypeScript 创建一个独立的模块或类来…...
深度学习从入门到实际项目资料汇总
图片来源于AiLake,如若侵权,请联系博主删除 文章目录 1. 介绍2. 深度学习相关学习资料2.1 [《动手学深度学习》](http://zh.d2l.ai/index.html)2.2 [导航文库](https://docs.apachecn.org/#1be32667e7914f03afb3c39239bd2525)2.3 [AI学习地图,…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
