1、介绍

微服务架构是一种架构模式,它提倡将原本独立的单体应用,拆分成多个小型服务

这些小型服务各 自独立运行,服务与服务间的通信采用轻量级通信机制(一般基于HTTP协议的RESTful API) ,达到互相协调、互相配合的目的。

被拆分后的服务都围绕着具体的业务进行构建,每个服务都能独立地进 行开发、部署、扩展。

由于相互独立且采用轻量级通信机制,因此各个小型服务能够使用不同的语言开发,也可以使用不同的数据存储技术

2、对比SpringBoot

Spring Boot是用于构建单个Spring应用的框架,而Spring Cloud则是用于构建分布式系统中的微服务架构的工具,Spring Cloud提供了服务注册与发现、负载均衡、断路器、网关等功能。

3、初始架构:单机架构

在淘宝网站最初时,应用数量与用户数都较少,可以把Tomcat和数据库部署在同一台服务器上。 浏览器往www.taobao.com发起请求时,首先经过DNS服务器(域名系统)把域名转换为实际IP地址 10.102.4.1,浏览器转而访问该IP对应的Tomcat。

新的技术挑战: 随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务,架构演 进势在必行。

4、演进

第一次演进:Tomcat与数据库分开部署

将 Tomcat 和数据库分别独占服务器资源,显著提高两者各自性能

 第二次演进:引入本地缓存和分布式缓存

第二次架构演进引入了缓存,在Tomcat服务器上增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的html页面等。

通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。

第三次演进:引入反向代理实现负载均衡 

在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。此处假设Tomcat最多支持100个并发,Nginx最多支持50000个并发,那么理论上Nginx把请求分发到500个Tomcat上,就能抗住50000个并发。

在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。此处假设Tomcat最多支持100个并发,Nginx最多支持50000个并发,那么理论上Nginx把请求分发到500个Tomcat上,就能抗住50000个并发。

第四次演进:数据库读写分离

把数据库划分为读库和写库,读库可以有多个,通过同步机制把写库的数据同步到读库。对于需要查询最新写入数据场景,可通过在缓存中多写一份,通过缓存获得最新数据。

其中涉及的技术包括:Mycat,它是数据库中间件,可通过它来组织数据库的分离读写和分库分表,客户端通过它来访问下层数据库,还会涉及数据同步,数据一致性的问题。

第五次演进:数据库按业务分库

数据库按业务分库,把不同业务的数据保存到不同的数据库中,使业务之间的资源竞争降低,对于访问量大的业务,可以部署更多的服务器来支撑。

这样同时会导致跨业务的表无法直接做关联分析,需要通过其他途径来解决。

第六次演进:把大表拆分为小表 

比如针对评论数据,可按照商品ID进行hash,路由到对应的表中存储。

针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。

只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。

这种做法显著的增加了数据库运维的难度,对DBA的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库。

第七次演进:使用LVS或F5来使多个Nginx负载均衡 

由于瓶颈在Nginx,因此无法通过两层的Nginx来实现多个Nginx的负载均衡。LVS和F5是工作在网络第四层的负载均衡解决方案,其中LVS是软件,运行在操作系统内核态,可对TCP请求或更高层级的网络协议进行转发,因此支持的协议更丰富,并且性能也远高于Nginx,可假设单机的LVS可支持几十万个并发的请求转发。

F5是一种负载均衡硬件,与LVS提供的能力类似,性能比LVS更高,但价格昂贵。

由于LVS是单机版的软件,若LVS所在服务器宕机则会导致整个后端系统都无法访问,因此需要有备用节点。

第八次演进:通过DNS轮询实现机房间的负载均衡 

在DNS服务器中可配置一个域名对应多个IP地址,每个IP地址对应到不同的机房里的虚拟IP。

当用户访问www.taobao.com时,DNS服务器会使用轮询策略或其他策略,来选择某个IP供用户访问。此方式能实现机房间的负载均衡

至此,系统可做到机房级别的水平扩展,千万级到亿级的并发量都可通过增加机房来解决,系统入口处的请求并发量不再是问题。

第九次演进:引入NoSQL数据库和搜索引擎等技术 

当数据库中的数据多到一定规模时,数据库就不适用于复杂的查询了,往往只能满足普通查询的场景。

对于统计报表场景,在数据量大时不一定能跑出结果,而且在跑复杂查询时会导致其他查询变慢。

对于全文检索、可变数据结构等场景,数据库天生不适用。因此需要针对特定的场景,引入合适的解决方案。

如对于海量文件存储,可通过分布式文件系统HDFS解决,对于key value类型的数据,可通过Redis解决,对于全文检索场景,可通过搜索引擎如ElasticSearch解决,对于多维分析场景,可通过Kylin或Druid等方案解决。

当然,引入更多组件同时会提高系统的复杂度,不同的组件保存的数据需要同步,需要考虑一致性的问题,需要有更多的运维手段来管理这些组件等。

第十次演进:大应用拆分为小应用 

为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务拆分成不同的产品线,通过分布式服务来协同工作。

按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。这时候应用之间可能会涉及到一些公共配置,可以通过分布式配置中心Zookeeper来解决。

第十一次演进:复用的功能抽离成微服务

如用户管理、订单、支付、鉴权等功能在多个应用中都存在,那么可以把这些功能的代码单独抽取出来形成一个单独的服务来管理,这样的服务就是所谓的微服务。应用通过HTTP、TCP或RPC请求等多种方式来访问服务,每个单独的服务都可以由单独的团队来管理。

此外,可以通过Dubbo、SpringCloud等框架实现服务治理、限流、熔断、降级等功能,提高服务的稳定性和可用性。

5、微服务架构的优缺点 

1、优点

更易于开发和维护

因为一个服务只关注一个特定的业务功能,所以它的业务清晰、代码量少。开发的独立和部署的独立都使得开发和维护单个微服务变得简单。

快速迭代+灵活

未拆分时,在巨无霸单体项目中开发、提交代码、测试都非常复杂。数不尽的代码分支和代码冲突,还有耗时耗力的测试,都会让人心力交瘁。独立开发与独立部署的微服务,可以更加快速地进行功能迭代。
服务之间的耦合低,甚至可以随时加入一个新的服务或剔除过时的服务,灵活度提升了很多。如果某个功能出现问题,针对性地修改和发版即可,不会像未拆分之前“牵一发而动全身”​。

系统的伸缩性增强

对高频访问和资源需求高的服务投入更多的资源,比如增加服务器、数据库、带宽等资源的配置。对于低频访问和资源需求相对低的服务不需要投入过多的资源。实现最优的资源利用,提升资源的利用率,并提升系统的伸缩性。

技术选型灵活

这一点在微服务架构的定义中已经讲明了,单个服务可以结合具体的业务和团队的特点,选择合适的编程语言和技术栈进行实现。

错误隔离

A服务出现了问题或宕机了,这个错误只会影响小范围的相关功能,不会影响整个系统的运行。在微服务架构中,可以使用流量控制、服务熔断、服务降级等手段来对系统进行保护,让局部的错误只影响系统的局部而不是影响系统的全部。

2、缺点

落地一个微服务架构项目比较复杂

实施和上线一个微服务架构项目的复杂度很高,工作量很大,要考虑和解决的问题很多。微服务架构实施前的技术选型、微服务组件的搭建和底层支撑、项目拆分时的边界和具体落地的细则、微服务项目的开发和上线、后期的维护等具体的工作都摆在面前,需要一个一个地处理。在落地微服务架构项目时不仅要编码,还要考虑微服务架构的搭建和底层支撑,这件事就像“大兵团作战”​,不是一个五人突击队就能够完成任务的。

服务依赖和调用链路更复杂

微服务架构中的单个微服务,不可避免地会出现依赖性及由此导致的问题。比如,H服务依赖S服务,S服务依赖A服务,如果A服务在线上出现问题或A服务需要修改部分逻辑,那么S服务和H服务也可能受到牵连,或者级联修改。虽然已经做了服务拆分,影响范围不大,但是这些问题还是存在的。

另外一个问题就是微服务中的调用链路复杂,调用时间相对于单体应用的调用时间肯定是要延长的。微服务在服务调用时难免要建立服务连接,不管是基于HTTP协议还是基于其他的RPC协议,都会难以避免地发生网络损耗,相对于单体应用中的服务调用是同一个项目中的方法调用,更加复杂。

数据一致性问题

用前文中的H服务、S服务和A服务举例来说,在调用过程中,如果遇到网络延迟或A服务出现了异常导致数据回滚,但是上游H服务和S服务的数据都已经入库了,就会导致数据不一致的问题。此时就需要做好数据一致性的解决方案,相对于单体应用中的本地事务处理,复杂度又提升了。

问题排查的链路加长

前文已经提到了微服务架构项目中的调用链路更复杂,链路复杂和链路的拉长会导致定位线上问题时要排查的地方增加,出现了处理一个问题要查看和定位多个服务的情况。

学习成本高

对于开发人员来说,微服务架构的学习和上手比较难。不像学习某一个技术栈,如想要学习和上手Spring Boot技术栈,看教程后动手做几个功能和项目也就学会了。在学习微服务架构时,需要学习很多内容,包括理念、组成部分、各个组件的功能与使用等,都需要理解,还要动手搭建和整合各个微服务组件,否则很难完完整整地掌握。到了具体编码和实战的过程中,又有很多的难点要克服。

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

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

相关文章

MaxKB+MinerU:通过API实现PDF文档解析并存储至知识库

MinerU是一款开源的高质量数据提取工具,能够将PDF文档转换为Markdown和JSON格式。2025年6月13日,MinerU发布了v2.0版本,相较于v1.0版本实现了架构和功能的全面重构与升级。在优化代码结构和交互方式的同时,v2.0版本还集成了小参数…

一文了解 `package.json` 和 `package-lock.json`文件

所有使用 npm 或 yarn(部分场景)管理依赖的 JavaScript/Node.js 项目都会存在**的核心文件–package.json 和 package-lock.json,无论项目类型是 Vue、React、Angular,还是纯 Node.js 后端项目、普通 JavaScript 工具库等。 所以这…

【AI论文】大语言模型量化的几何原理:将GPTQ视为Babai最近平面算法

摘要:将大型语言模型(LLMs)的权重从16位量化到更低位宽,是实际部署大规模Transformer模型到更具性价比的加速器上的通用方法。GPTQ已成为大语言模型规模下一站式训练后量化的标准方法之一。然而,其内部工作原理被描述为…

数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 数据清洗 特征可视化 Kaggle数据集实操 读者收获:1周内具备数据预处理能力 数…

计算机系统层次结构

计算机系统通过多层抽象,平衡硬件效率与软件灵活性,各层以独立语言和功能构成有机整体。一、层次划分(从底层到顶层)层级名称特点实现方式第1级微程序机器层硬件直接执行微指令(如微操作控制信号)。物理硬件…

04 基于sklearn的机械学习-梯度下降(上)

梯度下降一 、为什么要用到梯度下降?正规方程的缺陷:非凸函数问题:损失函数非凸时,导数为0会得到多个极值点(非唯一解)计算效率低:逆矩阵运算时间复杂度 O(n3),特征量翻倍时计算时间…

淘宝 API HTTP/2 多路复用与连接优化实践:提升商品数据采集吞吐量

一、引言​随着电商行业的蓬勃发展,对淘宝平台商品数据的采集需求日益增长。无论是市场调研公司分析市场趋势、电商平台整合商品资源,还是商家进行竞品分析,都需要高效、稳定地获取大量淘宝商品数据。然而,传统的 HTTP 协议在面对…

javascript中call、apply 和 bind 的区别详解

文章目录深入浅出:JavaScript 中的 call、apply 和 bind一、三位魔法师的共同使命二、各显神通的魔法师们1. call - 即时通讯专家2. apply - 批量处理高手3. bind - 预约服务大师三、魔法师们的对比表格四、魔法师们的实际应用1. 借用方法2. 函数柯里化3. 事件处理五…

【PHP】接入百度AI开放平台人脸识别API,实现人脸对比

目录 一、需求 二、准备工作 1、申请服务 2、创建应用,获取开发密钥 3、官方开发文档 4、测试人像图片 三、PHP接入 1、鉴权,获取access_token 2、人脸对比 四、完整代码 一、需求 现在人脸识别、人脸对比技术越来越成熟,使用越来越…

【东枫科技】DreamHAT+

DreamHAT 是一款顶部附加硬件 (HAT) 套件,可为 Raspberry Pi 提供 60GHz 毫米波雷达供您使用。 全尺寸 HAT 包含一个英飞凌 BGT60TR13C 芯片,具有单个发射天线和三个接收器(TX/RX),通过 GPIO 引脚和 SPI 连接到 Raspbe…

Spring Boot + MongoDB:从零开始手动配置 MongoConfig 实战

前言 你以为只要写上 spring.data.mongodb.*,就能一劳永逸,MongoDB 立马听话?别天真,这只是入门级操作,像是拿个自动挡钥匙,开个小车溜达溜达,远远算不上高手操作。当项目需求变得复杂,连接字符串需要灵活配置,或者多数据源并行作战时,自动配置的魔法显得捉襟见肘。…

建筑节能目标下,楼宇自控系统以高效运行助力节能减碳

随着全球气候变化问题日益严峻,节能减排已成为各国政府和企业的重要任务。在建筑领域,楼宇自控系统(Building Automation System, BAS)作为实现建筑节能目标的关键技术,正发挥着越来越重要的作用。根据中国政府发布的《…

LOVON——面向足式Open-Vocabulary的VLN导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作,且解决动态模糊

前言 因为项目需要(比如我们在做的两个展厅讲解订单),近期我一直在研究VLN相关,有些工作哪怕暂时还没开源(将来可能会开源),但也依然会解读,比如好处之一是构建完整的VLN知识体系,本文便是其中一例 我在解读过程中&am…

在线免费的AI文本转语音工具TTSMaker介绍

TTSMaker是一个在线的文本转语音工具, 支持多语言和中文方言,不同的语言和方言单次转换的字符上限从200-10000 不同,转换的效果还不错,听不出明显的AI痕迹。 工具的网址是:https://ttsmaker.cn/。 工具的界面如上&…

【AI问答】PromQL中interval和rate_interval的区别以及Grafana面板的配置建议

问题1:interval和rate_interval的区别 在PromQL中确实有 $__rate_interval 这个特殊的变量,它与 $__interval 有不同的用途和计算方式。 $__interval vs $__rate_interval 1. $__interval 含义:Grafana计算出的基本时间间隔计算方式&#xff…

STM32学习记录--Day5

今天了解了:中断中断有多个类别包括:USART中断,I2C中断等;并通过NVIC来分配中断的优先级EXTIEXTI的内部结构:EXTI线🔧 ​​一、EXTI系统核心架构​​1. ​​中断源输入(左上区域)​​…

CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)

文章目录前言一、NTP (Network Time Protocol) & ntpd1.原理2. 安装与配置(ntp 包)3.NTPd 优缺点对比二、Chrony1.原理2.安装与配置 (chrony 包)3. 优点4. 缺点三、systemd-timesyncd1.原理2.安装与配置 (systemd 自带)3. 优点4. 缺点四、手动同步工具1.ntpdate(已废弃&…

Web3:在 VSCode 中基于 Foundry 快速构建 Solidity 智能合约本地开发环境

相关文章推荐链接Web3专栏https://blog.csdn.net/qq_42392981/category_13016259.html在 VSCode 中基于 Foundry 快速构建 Solidity 智能合约本地开发环境引言1. 开发环境准备(Windows)1.1 安装 VSCode1.2 安装推荐插件1.3 安装 Foundry1.4 验证 Forge 和…

Implement recovery based on PITR using dump file and binlog

模拟生产场景中需要基于某个事务点的恢复,使用存量备份与存量binlog 生成测试数据 (rootlocalhost) [(none)]> create database NanJing; Query OK, 1 row affected (0.01 sec) (rootlocalhost) [test]> use NanJing; Database changed (rootlocalhost) [NanJ…

HTML-取消div,a等标签点击效果

一、背景当标签被设置onclick事件之后,在有些手机浏览器中,点击这些标签,会有点击变色效果。想要取消点击变色效果。通过为div和标签元素添加-webkit-tap-highlight-color样式属性,可以有效地解决这一问题二、解决方案已a标签示例…