微服务架构的演变
文章目录
- 1.1 系统架构的演变过程
- 1.1.1 单体应用架构
- 1.1.2 垂直应用架构
- 1.1.3 分布式架构
- 1.1.4 SOA架构
- 1.1.5 微服务架构
- 1.2 微服务架构设计原则
- 1.2.1 AKF拆分原则
- 1.2.1.1 X轴扩展(水平复制)
- 1.2.1.2 Y轴扩展(模块拆分)
- 1.2.1.3 Z轴扩展(数据分区)
- 1.2.2 前后端分离原则
- 1.2.3 无状态服务
- 1.2.3.1 状态化请求
- 1.2.3.2 无状态请求
- 1.2.3.3 HTTP是无状态的
- 1.2.3.4 无状态服务带来的好处
- 1.2.4 Restful通信风格
1.1 系统架构的演变过程
随着互联网的不断发展,网站应用的规模不断扩大,系统架构也因此也不断的演进、升级、迭代。从互联网早期到现在,系统架构大体经历了下面几个过程:
-
1)单体应用架构
-
2)垂直应用架构
-
3)分布式架构
-
4)SOA架构
-
5)微服务架构
1.1.1 单体应用架构
单体应用架构也叫集中式架构,在单体应用架构中,系统将所有的功能包括前端、后端等全部打包在一起部署,所有的代码都写在一起,通常也是交由一个小的技术团队开发;
优点:
- 项目架构简单,开发成本低
- 项目部署在一个节点上, 维护方便
缺点:
- 代码耦合度太高,开发维护困难
- 无法针对不同模块进行针对性优化
- 系统容错率低,如果该系统一个模块出现不可用会导致整个系统无法使用。
1.1.2 垂直应用架构
当访问量逐渐增大,单一应用无法满足需求,我们就需要增加节点来提供系统的访问能力,但是并不是所有的模块都需要进行性能的提高,这时候单体应用架构无法满足我们的需求;
我们需要将系统里面的模块进行拆分,这样对于后面的水平扩容是非常友好的;
优点:
- 系统拆分实现了流量分担,提高了系统并发量
- 垂直架构中可以针对不同模块进行针对性优化
- 方便水平扩展,负载均衡,系统容错率提高
缺点:
- 系统间相互独立,会有很多重复开发工作,影响开发效率
- 系统间相互独立,无法进行系统数据共享(互相调用)
1.1.3 分布式架构
当垂直应用越来越多,重复的业务代码就会越来越多,并且在垂直架构中应用之间的交互不可避免,此时,为了解决基础代码重复太多、应用之间的调用等问题;我们将重复的代码抽取出来作为独立的服务,对外提供服务;
优点:
- 将基础服务进行了抽取,系统间相互调用,提高了代码复用和开发效率
缺点:
- 系统间耦合度变高,调用关系错综复杂,难以维护
1.1.4 SOA架构
在分布式架构下,当服务越来越多,容量的评估,小服务资源等浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理集群容量
服务治理要做什么?(优点)
- 服务注册中心,实现服务自动注册和发现,无需人为记录服务地址
- 动态监控服务状态监控报告,人为控制服务状态
- 服务负载均衡、服务熔断保护、服务健康检测、服务注册与发现、服务缓存等…
缺点:
- 服务关系复杂,运维、测试部署困难
1.1.5 微服务架构
微服务架构模式是从SOA架构模式演变过来, 比SOA架构模式粒度更加精细,让专业的人去做专业的事情(专注),目的是提高效率,每个服务与服务之间互不影响,微服务架构中每个服务独立,互不影响;
微服务的特点:
- 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
- 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
- 面向服务:面向服务是说每个服务都要对外暴露服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Rest的接口即可。
- 自治:自治是说服务间互相独立,互不干扰
- 团队独立:每个服务都是一个独立的开发团队。
- 技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉
- 前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口
- 数据库分离:每个服务都使用自己的数据源
- 部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护
1.2 微服务架构设计原则
微服务是一种架构风格。一个大型的复杂软件应用,由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好的完成该任务。那么关于微服务的设计原则有哪些呢?
- AKF拆分原则
- 前后端分离原则
- 无状态服务
- RestFul 的通信风格
1.2.1 AKF拆分原则
随着互联网的高速发展,性能越来越成为我们瞩目的焦点,那么如何去提升我们服务器的性能呢?相信最简单和最直接的方法就是:加机器!如果一台不行就两台,两台不行就三台…
如何加机器?加在什么地方最有效?怎样的软件架构加机器才最有效成为我们考虑的重点;
对此,《可扩展的艺术》一书提出了一个更加系统的可扩展模型—— AKF 可扩展立方(Scalability Cube)。这个立方体中沿着三个坐标轴设置分别为:X、Y、Z。
AKF公司的技术专家们从
X/Y/Z
三个维度来对应用进行扩展。理论上可以将一个单一系统进行无线的延伸扩展;
1.2.1.1 X轴扩展(水平复制)
X轴扩展就是我们平时说的水平扩容,一台机器不行就两台,两台不行就三台…简单来说就是搭建集群,使用Nginx等工具做到负载均衡,让多台机器一起工作来提升项目的整体性能;
1.2.1.2 Y轴扩展(模块拆分)
Y轴扩展就是基于微服务架构的模块拆分,将一个庞大的项目拆分成若干个小模块,这些小模块分别独立部署在不同的机器,组成了一个完整的项目;
1.2.1.3 Z轴扩展(数据分区)
Z轴扩展是基于数据的分区,比如我们之前学的MySQL数据拆分,ES的shard分片等都是基于数据的拆分,这些不同的数据分区独立部署不同的机器中,以提升这部分数据访问的能力;一般数据划分的方式有:
- 1)根据数据类型进行分区(根据不同的业务拆分不同的数据库)
- 2)根据数据的活跃程度进行分区(冷热分离)
- 3)根据时间段进行分区(日志时间段)
- 4)根据读写进行分区(读写分离)
1.2.2 前后端分离原则
前后端分离原则简单的来说就是:前端负责前端的事情,后端负责后端的业务模块,前后端不再耦合在一起,分工明确;
前后端分离带来的优点有:
- 1)可以由各自的专家来对各自的领域进行优化
- 2)前后端交互界面更清晰,就剩下了接口模型,后端的接口简洁明了,更容易维护。
- 3)前后端采用统一的数据和模型,可以支持多个前端:例如:微信 h5 前端、PC 前端、安卓前端、IOS 前端。
- 4)职责更加清晰明确,前后端不再耦合,开发效率高;
1.2.3 无状态服务
无状态服务与有状态服务主要是根据:两个来自相同发起者的请求在服务器端是否具备上下文关系
1.2.3.1 状态化请求
服务器端一般都要保存请求的相关信息,才能分辨请求是否是同一个;
例如Cookie认证操作,客户端请求来到后端时查询Session,如果保存了用户的信息那么就认证通过,如果没有保存用户的信息,那么就认证不通过,这就是一个典型的有状态服务;
1.2.3.2 无状态请求
服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息;
例如Token认证,客户端发送请求携带Token来到后端服务,后端服务通过前端携带的Token来进行认证,如果换了台服务器依旧可以进行认证操作,此时就是有状态服务;
1.2.3.3 HTTP是无状态的
由于HTTP协议本身就是无状态的,所以为了实现有状态服务(例如上面的Cookie认证),就需要通过一些额外的方案。比如最常见的session,将用户登录的信息保存到session中,当进行认证的时候,再从session中取出用户信息,进行认证;
1.2.3.4 无状态服务带来的好处
服务无状态,主要是提升服务的==可扩展性==;
如果服务是无状态的,我们就可以将请求发送到任意一台服务器,然后通过负载均衡,将请求平均分布在不同的服务器中,非常方便的实现水平扩展;
如果服务是无状态的,就无法那么轻易的实现了,客户端需要始终将请求发送到同一台服务器才行,或者通过一些其他的手段达到目的,如分布式session共享、Redis单点登录等;
1.2.4 Restful通信风格
Restful架构,就是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。设计一个微服务架构的项目时,应该尽量遵守Restful风格进行通信;Restful好处如下:
1)基于JSON进行数据交互,简单轻量,人机阅读方便;
2)对请求进行更好的规范,如GET/POST/PUT/DELETE等都说明其用途,能更好的前后端对接;
3)Restful与编程语言无关,只要各个服务遵守Restful编写API,任何语言之间都可以进行通信(数据交互);
相关文章:

微服务架构的演变
文章目录1.1 系统架构的演变过程1.1.1 单体应用架构1.1.2 垂直应用架构1.1.3 分布式架构1.1.4 SOA架构1.1.5 微服务架构1.2 微服务架构设计原则1.2.1 AKF拆分原则1.2.1.1 X轴扩展(水平复制)1.2.1.2 Y轴扩展(模块拆分)1.2.1.3 Z轴扩…...

使用html-to-image代替html2canvas,结合jspdf实现下载pdf(下载截图下载前端dom元素)
一、问题 一开始的时候,准备使用html2canvasjspdf来实现的,但是遇到了一个麻烦的问题,在其他项目中使用html2canvas没有任何问题,但是在要开发的项目中使用,就给我报错,是真滴烦。 html2canvas报错 Uncau…...
云环境渗透测试的重要性
🌕写在前面 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 ✉️今日分享: “在这个世上,除了极稀少的例外,我们其实只有两种选择:要么是孤独,要么就是庸俗。” 随着云计…...
ROS2 入门应用 请求和应答(Python)
ROS2 入门应用 请求和应答(Python)1. 创建功能包1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加入口点5. 编译和运行1. 创建功能包 1. 创建功能包 在《ROS2 入门应用 工作空间》中已创建和加载了ros2_ws工作空间 在《ROS2 入…...

是德Keysight E4991A/e4991B射频阻抗/材料分析仪
Keysight E4991A 射频阻抗/材料分析仪提供终极阻抗测量性能和强大的内置分析功能。它将为评估 3 GHz 范围内组件的组件和电路设计人员的研发提供创新。E4991A 使用 RF-IV 技术,而不是反射测量技术,可在宽阻抗范围内进行更精确的阻抗测量。基本阻抗精度为…...

这才是计算机科学_人工智能
人工智能一、前言二、ML2.1 分类2.1.1 决策树2.2.2 支持向量机2.2.3 人工神经网络三、计算机视觉3.1 Prewitt算子3.2 Viola-Jones 人脸检测算法3.3 卷积神经网络四、自然语言处理4.1 知识图谱4.2 语音识别一、前言 之前讲了计算机从发展到现在的过程,计算机很适合做…...

DFS深度优先搜索—Java版
递归三要素 递归的定义 递归的拆解 递归的出口 什么时候使用DFS? 深度回溯问题(DFS与回溯区别不大) 二叉树问题 组合、排列问题 找方案问题(解空间是一棵树或者图,需要自行构造图/树) 图的搜索问题…...

RAY - 小记
文章目录关于 RAYRAY 结构关于 RAY Ray is a unified framework for scaling AI and Python applications. Ray consists of a core distributed runtime and a toolkit of libraries (Ray AIR) for accelerating ML workloads. RAY 是一个简单、通用的分布式计算框架。 RAY 解…...

金三银四软件测试工程师面试题(含答案)
前言:此文专门记载本人平时面试以及收藏的面试题目,如果有错误之处请及时指正,谢谢! 1、python的数据类型有哪些 答:Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类…...

Python 连接数据源与邮件功能(九)
文章目录一、概述二、Python 连接数据源1)Python MySQL 基础操作1、部署MySQL2、MySQL Connector 库【1】安装 mysql-connector-python 库【2】连接 MySQL【3】增加数据【4】查询数据【5】更新数据【6】删除数据2、PyMySQL 库【1】安装 PyMySQL 库【2】连接 MySQL【…...

网站如何锁定用户,超级浏览器有办法解决吗?
随着全球开放,跨境电商人纷纷开启了2023年的搞钱之旅,很多期待着在新的一年大干一场。但前事不忘后事之师,2022年跨境生意全面沦陷,其实除了大环境的因素之外,还有一个很重要的原因是,各个平台都开始实行非…...

Ubuntu下使用Wine运行HBuilderX
安装完wine后,在HbuilderX的目录中打开终端,直接输入wine HBuilderX.exe命令,启动过程中会提示安装wine-mono组件,点击安装按钮下载安装该组件,该组件下载速度慢,需要等待特别长时间。 安装完毕后&…...

如何高效远程维护分布在海外的中大型智能设备?
一、行业需求 随着越来越多的企业进行全球化经营,设备制造商和系统集成商的设备分布到全球各地,数量多而且分散,传统的设备运维方式,面临着出差成本高,工作效率低,服务不及时等问题,客户常常因…...

【双指针问题】LeetCode 925. 长按键入
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...

APP测试中IOS和Android的区别,有哪些注意点?
01、常识性区别 02、导航方式 iOS:Tab放在页面底部,不能通过滑动来切换,只能点击。也有放在上面的,也不能滑动,但有些Tab本身可以滑动,比如天猫的。还有新闻类的应用。 Android:一般放在页面…...

2019蓝桥杯真题平方序列(填空题) C语言/C++
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明想找到两个正整数 X 和 Y,满足2019<X<Y;2019^2, X^2, Y^2组成等差数列。 请你求出在所有可能的解中,XY 的最小值是多少?…...

vue中,给一个URL地址,利用FileSaver.js插件下载文件到本地
①首先下载 FileSaver.js 插件 npm install file-saver --save ②在需要的.vue页面引入 import { saveAs } from file-saver 在HTML中引入 <script src"https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script> //Fil…...

从0开始学python -34
Python3 输入和输出-2 读和写文件 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode)filename:包含了你要访问的文件名称的字符串值。mode:决定了打开文件的模式:只读,写入,追加等。…...

瑞典军事研究:从认知心理学的视角探讨军事创新进程
来源:Military Innovation as the Result of Mental Models of Technology 《摘要》 政治紧张局势的加剧和技术发展的进步促使Scandinavian 国家(斯堪的纳维亚半岛,欧洲最大的半岛,有挪威、瑞典两国以及芬兰北端的一小部分。&am…...

【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...