架构与思维:微服务架构的思想本质

news/2024/11/17 8:18:16/文章来源:https://www.cnblogs.com/wzh2010/p/18031177

我们为什么需要微服务架构,它一定是为了解决我们某些问题才出现了。这篇文章我们讨论下微服务架构模式所解决的问题,带来的挑战,以及他的核心思想本质。

1 早期的服务架构

image
上图是一个典型的服务分层架构:
Client: 调用方是browser web或者App
应用层: 实现计算层的业务逻辑,从上游数据层获取数据,对下游Client返回html/json/File等
数据-缓存层: 提高访问数据的性能
数据-数据库层: 持久化数据层

2 它存在的问题

1. 重装单体模式
如果是电商类型的系统,以上的架构明显需要把 用户登录、商品浏览、下单、结算、支付、订单查询都实现在一个系统里面,实在笨重。

2. 流量和并发量限制
当系统的流量或并发量达到一定的阈值,比如日活跃用户数量超过百万,或者每秒请求数(QPS)达到数千甚至更高时,传统的单体架构可能难以支撑如此高的负载。

3. 迭代频率
如果业务需求变更非常频繁,例如每周两次以上甚至每天都有新的功能需要上线,那么整个系统要全量发布,不论你的模块是不是变更了。难顶哟!

4. 系统难以扩展
当系统需要快速扩展以满足业务增长时,微服务架构可以更容易地实现水平扩展。

4. 耦合度和依赖关系
如果旧系统中的模块之间存在高度的耦合和复杂的依赖关系,这可能导致维护和升级变得困难。

5. 缺失故障隔离和容错能力
如果系统中的某个模块出现故障,是否会影响到整个系统的正常运行?答案是肯定的

3 微服务架构的演进

上面的问题,明显是日益膨胀的功能模块和流量规模对单体架构系统的挑战,如果不优化,将衍生出一系列的问题。
我们可以通过微服务架构演进,对系统逐步的升级。以下是我们在业务实践过程中总结的一些经验,予以参考。

3.1 基于业务逻辑拆分

基于业务逻辑拆分相对好理解一点,典型的单一职责原则,我们将功能相近的业务整合到一个服务颗粒上。

业务领域模型拆分
举一个典型的电商业务例子。电商的业务体系庞大,涉及各方面的细节。但是我们大概能够根据业务的职能做一个拆分,比如阿里的电商中台业务,包含 用户账号子系统、商品子系统、订单子系统、客户子系统、物流子系统 等。
因为职能不同,这些领域之间包含清晰的界限,所以我们可以按照这个方向将服务于不同领域(商品域和订单域)的子系统拆成独立的服务颗粒。如下图:
image

用户群体拆分
根据用户群体做拆分,我们首先要了解自己的系统业务里的用户角色领域是否没有功能耦合,有清晰的领域界限。
比如教育信息化系统,教师的业务场景和学生的业务场景,基本比较独立,而且拆分后流量上有明显的削弱。如下图所示:
image

3.2 基于可扩展拆分

这个需要区分系统中变与不变的部分,不变的部分一般是成熟的、通用的服务功能,变的部分一般是改动比较多、需要不断满足业务迭代扩展性需要的功能。
根据二八原则,系统中经常变动的部分大约只占 20%(如 运营、活动),而剩下的 80% (用户信息、基本商品信息、物流信息 等模块的管理能力和视图界面)基本不变或极少变化。如下图所示:
image

3.3 基于可靠性拆分

核心模块拆分
我们团队在做MySQL数据库和Redis集群拆分的时候,总会把一些重要的模块独立放在一个集群上,不与其他模块混用,而这个独立的集群,服务机性能要是最好的。这样做的目的是,当重要度较低的模块发生故障时,不会影响重要度高的模块。同样的道理,我们将账号、支付等核心服务单独拆分在一个服务颗粒上,建立独立服务集群,保证资源独享,来提升可用性。 如下图所示:
image

主次链路拆分
在各个业务系统中,其实都会有主次业务链路。主业务链条,完成了业务系统中最核心的那部分工作。而次链路是保证其他基础功能的稳定运行。
以电商为例子:商品搜索->商品详情页->购物车模块->订单结算->支付业务,就是一条最简单的主链路。主链路是整个系统的核心主战场,最好的资源跟火力都要放在这里,保证不失守。
image
这样的拆分模式保障了核心链路的计算资源分配优先、异常容错处理优先、服务隔离保护等等。

3.4 基于性能需求拆分

根据性能需求来进行拆分。简单来说就是访问量特别大,访问频率特别高的业务,又要保证高效的响应能力,这些业务对性能的要求特别高。比如积分竞拍、低价秒杀、限量抢购。
我们要识别出某些超高并发量的业务,尽可能把这部分业务独立拆分出来。
image

4 代价

分布式系统的固有复杂性
微服务架构是基于分布式的系统,而构建分布式系统必然会带来额外的性能开销和可靠性挑战。
服务的依赖管理和测试
在单体应用中,通常使用集成测试来验证依赖是否正常。而在微服务架构中,单元测试和整条服务链路的可用性都需要关注。
有效的配置版本管理
需要引入配置的版本管理、环境管理。
自动化的部署流程
有效地构建自动化部署体系,配合服务网格、容器技术,是微服务面临的另一个挑战。
对于DevOps有更高的要求
开发者也需承担起整个服务的生命周期的责任,包括部署、链路追踪、监控。构建全功能的团队,也是一个不小的挑战。
运维成本飙升
运维主要包括配置、部署、监控与告警和日志收集四大方面。微服务架构中,每个微服务粒度都需要独立地配置、部署、监控和收集日志,成本呈指数级增长。服务化粒度越细,运维成本越高。

5 微服务架构思想本质

最终的微服务架构可能是这种状态:
image

所以我们可以看出微服务架构的本质应该有如下几个:

  • 风险隔离: 高度自治和高度隔离,明显不让低等级的服务影响高等级
  • 分治原理: 单个服务的吞吐始终是有限的,通过微服务拆分可以突破扩展上限,分拆流量可支撑全球化的业务,不再受机房规模甚至地域影响
  • 单一职责: 单体系统逐渐演变成具有单一职责的细粒度微服务

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

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

相关文章

[羊城杯2020]easyphp 1

.htaccess的利用,rce,绕过<?php$files = scandir(./); foreach($files as $file) {if(is_file($file)){if ($file !== "index.php") {unlink($file);}}}if(!isset($_GET[content]) || !isset($_GET[filename])) {highlight_file(__FILE__);die();}$content = $…

科研单位如何安全又高效地使用文件摆渡U盘?

科研单位是专门从事科学研究与技术开发工作的机构,通常拥有高水平的科研团队和先进的科研设备。这些机构按照属性可以分为中央直属科研单位和地方科研单位。中央直属科研单位包括中国科学院、中国工程院等机构,以及原国家部委附属的科研单位、国家“211”和“985”高校及其所…

spi概念

目录一、SPI概念1. 引脚定义2. 数据收发3. 工作模式4. 数据格式 一、SPI概念串行外设接口(Serial Peripheral Interface)的简称也叫做SPI. 是一种高速的、全双工同步通信的一种接口. 串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK)。 如果打算实现单向通信(…

半导体仿真文件传输面临时间和经济成本挑战,一招就能解决!

对于芯片设计企业来说,其面临的最大考验就是芯片设计质量和时间成本控制之间的矛盾,具体表现在芯片的设计、仿真验证过程存在着较大的挑战: 芯片设计过程包括了仿真验证这一重要的一环,但芯片设计企业在仿真验证这一环却面临着较为严峻的考研: 性能瓶颈:EDA工作流程仿真、…

Firealpaca 下载及安装教程 (火焰羊驼绘画工具)

前言 FireAlpaca是一款简单易用的电脑绘画软件,采用了类似于Photoshop的图层绘画方式。对于喜欢手绘和创作漫画的朋友来说,FireAlpaca的多图层功能使得绘画过程更加便捷和简单。作为一个小型图像编辑软件,它能够轻松处理多个图层或手绘图,既适合新手也适合有经验的绘画爱好…

manim边学边做--Code

Code这个模块比较特殊,是专门用来显示代码用的。平时如何制作数学动画的话,这个模块是用不着的,除非你想做一些编程方面的教学。Code在manim各个模块中的位置大致如上图中所示。 1. 主要参数 Code模块是用来显示代码的,所以,如果你也写过代码的话,会发现它的很多参数相当…

springboot+vue前后端分离项目-项目搭建12-批量删除

1. 改造vue/src/views/Book.vue 【1】增加批量删除按钮,table列表里第一列为多选 【2】增加ids,存储选择的数据id数组 【3】handleSelectionChange方法用来多选后将数据id存储到ids中,deleteBatch方法是点击批量删除按钮时调用后台的批量删除功能 2. 改造com/example/demo/c…

Python 入门之悦目的 Pythonic(四)封装约定

# 免责声明:本文内容主要是肥清大神的视频以及自己收集学习内容的整理笔记,目是主要是为了让博主这样的老白能更好的学习编程,如有侵权,请联系博主进行删除。10. 封装的故事 # 封装在面向对象开发里是最基础的一环* 传统的开发会遇到不注重封装的情况* 对这类的 legacy 的代…

springboot+vue前后端分离项目-项目搭建11-1对多查询

一、1对多查询 1. 增加mapper/User.xml文件,文件内容如下,book表增加user_id字段与user表的id匹配2.com/example/demo/mapper/UserMapper.java接口增加如下方法与User.xml对应 3. 优化User和Book实体类 4. 优化com/example/demo/controller/UserController.java,改造findPag…

将传统应用带入浏览器的开源先锋「GitHub 热点速览」

现代浏览器已经不再是简单的浏览网页的工具,其潜能正在通过技术不断地被挖掘和扩展。得益于 WebAssembly 等技术的出现,让浏览器能够以接近原生的速度执行非 JavaScript 语言编写的程序,从而打开了浏览器的“潘多拉魔盒”。现代浏览器已经不再是简单的浏览网页的工具,其潜能…

springboot+vue前后端分离项目-项目搭建11-1对多查询、批量删除

一、1对多查询 1. 增加mapper/User.xml文件,文件内容如下 2.com/example/demo/mapper/UserMapper.java接口增加如下方法与User.xml对应 3. 优化User和Book实体类 4. 优化com/example/demo/controller/UserController.java,改造findPage方法 5. 改造vue/src/views/User.vue 【…

《Programming from the Ground Up》阅读笔记:p49-p74

《Programming from the Ground Up》学习第3天,p49-p74总结,总计26页。 一、技术总结 1.function (1)定义 p49, Functions are unit of code that do a defined piece of work on specified types of data。 函数是在指定类型的数据上完成所定义的某个工作的代码单元。 (2)pa…