从0进入微服务需要了解的基础知识
文章目录
- 系统架构演化过程
- 为什么要了解系统架构的演化过程
- 技术发展认知
- 技术选型与创新
- 演变过程
- 单体架构
- 分层-分布式
- 集群
- 微服务
- 分布式\集群\微服务
- 微服务中的核心要素-拆分原则
- 项目拆分与复杂度
- 微服务的拆分维度有哪些
- 小结
- 微服务中的核心要素服务化
- 进行拆分后一定是微服务?
- 理解服务化
- 与子系统、组件对比
- 小结
- 微服务中的核心要素-通讯机制
- 对内:rpc与消息队列
- 对外restful Api
- 小结
- 微服务中的核心要素-无状态
- 微服务中的状态是指是什么
- 如何实现无状态?
- 小结
系统架构演化过程
为什么要了解系统架构的演化过程
- 技术发展认知
- 技术选型、创新
技术发展认知
技术为什么出现?技术可以理解为是一种方案,它们不是突然诞生的,而是为了解决某一个或某一类问题才而出现。
当问题解决之后,随着项目的运行发展,业务需求与用户量不断增加后,新的问题也会随之出现,这个时候又会促使技术的进一步发展。
系统架构的演化过程也是如此,因此除了理解技术架构方案外,还需理解技术架构的发展所解决的问题,这样可以更深刻的理解技术
技术选型与创新
了解系统架构的发展过程也可以对自己在项目过程中具有启发作用,系统架构的演化过程几乎是大多数系统发展的路程,我们可以将其结合于自己的项目中,来解决项目在发展过程中所带来的问题。
演变过程
单体架构
单体架构是大多数项目的初期架构,应用程序、缓存、数据库都在同一台服务器中。

这一架构的开发速度比较快,成本低。系统的问题主要集中在应用程序的业务实现上。
分层-分布式
但是随项目的运行,内部的数据量及系统所承载的用户活跃量开始增加,会出现系统资源分配不均衡等问题,这时系统服务根据功能拆分,单独部署服务。

在这一架构中各个服务依据各自的特点选择合适的机器,以此充分利用到服务器的资源,同时在这一阶段从整体的架构上来讲就已经构成了分布式架构。
集群
而随用户的增加及软件服务的运行中会出现机器的意外停止,高可用及流量负载就成为了这一架构的问题,为了解决这个问题在当前的架构下发展就提出了采用集群作为解决方案。

集群不止是在应用服务上,在数据库/缓存上都可以应用,当下为分布式+集群的架构。
微服务
在当下的架构中对软件项目而言应用程序是整体部署,随系统的运行会发现,存在一些模块它的用户访问量明显远远大于其他模块,并且在一些模块中业务的变更复杂度远高于其他模块,因此在应用程序的基础上就进行拆分,根据业务及访问热度拆分成多个服务分别部署在不同机器上,从而演化成为微服务。

实际上在软件的系统发展阶段中,针对任务的多样性也提出了很多的技术解决方案,如针对搜索的es、针对异步任务的kafka或rabbitmq等等,它们在项目的发展中也会应用到系统架构中。

分布式\集群\微服务
在前面整体架构的演变中已经介绍了从单体到微服务的发展过程,其中需注意分布式、集群、微服务的概念。
分布式与集群:在作用层面上都是针对服务器部署,而两者的区别在于分布式是在多个机器部署所做的事情和功能不一样但是整体是维持运行同一个系统。而集群是多台机器做相同的事情具有相同的功能。
在业界中常有分布式与微服务的比较,实际上两者是没有可比的关系,微服务是针对应用程序的设计而不是服务的部署,微服务是应用程序根据需求拆分成多个微服务。
理论上拆分后的微服务是可以部署在同一台机器,但是这样体现不了价值,因此一般微服务会分开部署,这时又符合分布式的定义,顾可以成微服务分布式架构。
微服务中的核心要素-拆分原则
项目拆分与复杂度
微服务项目开发是拆分得越细节越单一越好吗?
答案是不是的,因为当一个系统拆分为两个服务或多个服务的时候,整个项目的开发/维护/运营的复杂度及所遇到的问题、所需要的团队人员也会随之增加。所以拆分的越细复杂度也就越大,如果处理不好就可能给自己挖坑呢?

软件服务的拆分往往会考虑如下因素
- 团队人员:人数/技术,无论项目是单体还是微服务最终还是需要依托于团队整体完成,所以团队的人数技术实力会影响到项目涉及的技术架构,及解决问题的能力
- 业务需求:团队成员满足条件的情况下,还需基于业务公司发展的需求。如果在单体架构下可以满足业务的需求则用单体,在软件项目开发中趋向最优节约资源的方式实现功能。
微服务的拆分维度有哪些
微服务的拆分维度方式有多种,如下4种是常见运用的方式,其中模块维度与功能维度应用相对最多。
- 模块维度:微服务架构中模块维度是最基本的拆分单位。根据系统整体一类功能集中在一起定义的模块进行拆分,如:将用户模块拆分为用户服务,将商品模块拆分为商品服务或将订单模块拆分为订单服务等。每个服务可以独立开发、测试和部署,具备清晰的职责边界和功能集合。
- 功能维度:除了按照模块进行拆分外,针对具有较复杂的业务,较严格要求或具有较大的技术挑战的时候才会选择拆分出来,如:购物车功能,支付功能,秒杀功能等。
- 读写维度:在系统中大多是读多写少,往往读的并发压力大,从整体服务功能中来看流量在读和写上就会出现明细的不均衡问题,这个时候可以将读和写拆分,再根据流量情况适当为读服务增加机器。如商品服务,就可以拆分为 读-商品服务 、写-商品服务。
- AOP维度:AOP是面向切拆分,是将被用于跨多个模块或功能的关注点,如日志记录、性能监控、异常处理等功能。拆分程独立的服务,供其他微服务调用,以确保这些关注点的一致性和复用性。
除了上面4种拆分方式外,也可以根据分层架构的方式进行拆分,比如MVC三层结构,可以拆分为交付服务,业务服务,数据处理服务。在拆分的时候应该根据具体业务需求和开发团队的实际情况来确定。
小结
在本节中主要介绍微服务的拆分原则,拆分维度与方式有很多种,其中模块维度与功能维度的拆分是应用较为简单也最普遍的方式,另外需要注意拆分不是越细越好,而是要结合项目与团队及需求的实际情况进行合理拆分。
微服务中的核心要素服务化
进行拆分后一定是微服务?
在上一节中讲到微服务的拆分方式有很多种,但我们平时做项目的时候拆分出来的服务或者功能可以称为微服务吗?
答案:不一定
如果我们对系统拆分只是把相同的功能拆分出来使得程序更好复用和维护那么组件就可以满足这个需求,如果只是将服务单独拆分出来独立提供业务实际就是一个子系统,那么如何做才能说是微服务项目呢?
理解服务化
微服务实际上是一种形式与思想的转变,在传统的单体项目开发中以一份代码部署一个服务来实现需求的项目,而微服务项目的开发则是将一份项目代码,拆分为多个服务代码,每一个服务代码部署运行并最终一起实现需求的项目。

虽然拆分为多个维度的服务,但是在本质和方向上仍然以完整的业务为主,服务与服务之间定然会存在相关的联系,这就是微服务中的服务化。
服务化是指:将系统中的各个功能模块(或称为服务)通过独立的服务提供,并以服务为粒度进行拆分、开发、部署和管理的过程。服务化的目标是将系统拆分成多个自治的服务单元,以提高系统的可维护性、可扩展性和可测试性。
服务化关键的几个信息:
- 单一职责:每个服务应该具有清晰的单一职责,即每个服务应该专注于完成某一个明确的功能或业务领域。这样可以保证服务的内聚性和独立性。
- 独立开发和部署:每个服务可以独立开发和部署。不同的服务可以由不同的团队进行开发,团队可以根据需求独立地进行服务的迭代和升级,而不会影响到整个系统。
- 轻量级通信:服务之间通过轻量级的RPC通信机制进行交互,这样可以降低服务之间的耦合度,使得服务之间的协作更加灵活和可靠。
- 自治性:每个服务具有一定的自治性,即服务可以独立做出决策,并维护自己的数据存储和业务逻辑。这样可以保证服务的独立性和灵活性。
- 可伸缩性:通过将系统拆分为多个服务,可以实现对某些高负载服务的独立扩展,而其他不需要扩展的服务则可以保持原样。这样可以提高系统的整体性能和可伸缩性。
与子系统、组件对比
微服务 VS 组件
微服务在实现的功能上是具有与组件很强的相似性,但是又具有关键性的不同,微服务的服务之间升级和修改并不会影响到相互调用的服务修改;
组件在使用上会要求包含业务系统内部,需要业务系统进行集成,如果组件的功能发生了修改,则所有引用此组件的业务系统都需要进行组件升级;
微服务 VS 子系统
在微服务中服务与服务虽然是各自单独部署运行,但是在功能上 具有耦合性,相互之间是围绕整个项目的核心业务展开规划的,在服务之间单独部署但又相互依存。
子系统是单独独立开发的,具有单独的独立体系业务,相互之间并不是相互依存的关系,因此即便某一个系统出现问题也不影响其他系统的业务运行。
小结
在本节中主要重点是理解什么是服务化及服务化的特征,当拆分出来的服务实现了服务化之后及可以认为是微服务。
微服务中的核心要素-通讯机制
对内:rpc与消息队列
对微服务内部服务之间的访问往往以rpc和消息队列为主。
RPC通信,是属于同步调度,在概念定义上描述是一种远程过程调用协议,用于不同服务之间的同步调用。通过RPC一个服务可以像调用本地函数一样调用远程服务的方法。
消息队列是一种异步通信机制,广泛应用于微服务架构中。服务可以将消息发送到消息队列,而不需要直接与接收方进行通信。其他服务可以从队列中订阅并消费这些消息。
通俗理解:
-
RPC通信:这种方式相当于直接电话沟通。当一个服务需要与另一个服务交流时,它会直接发起调用,就像拨打电话一样。这种同步方式可以快速得到对方的反馈,非常适合需要即时处理的任务。然而,这也意味着调用方必须等待被调用服务处理完任务并响应,这可能会导致调用方在等待过程中无法执行其他任务。
消息队列:使用消息队列的通信更像是发送电子邮件。服务不直接与其他服务通信,而是将信息发送到一个中间的消息系统,其他服务则从这个系统中订阅并接收信息。这种方式的优点是发送方发送消息后可以继续执行其他操作,不需要等待接收方的响应,从而提高了系统的效率。缺点是消息的处理不是实时的,可能会有一定的延迟。
RPC VS 消息队列
| RPC | 消息队列 | |
|---|---|---|
| 调度方式 | 同步 | 异步 |
| 时效 | 即时 | 延迟 |
| 建议 | 适合耗时小,要求即时性,以及变化较多的任务类型 | 适合耗时大,可以不要求即时性的任务 |
对外restful Api
微服务项目除了内部服务之间的通信外,也有对外暴露接口提供服务,通过定义restful api,每个服务暴露自己的HTTP接口以对外提供相应的功能。
小结
本节主要讲解在微服务中的通信机制rpc/消息队列/api,除了这些外还可以通过websocket进行通信,在微服务中主要采用的是rpc与消息队列做服务之间的通信为主,对外主要以restful api为主。
微服务中的核心要素-无状态
微服务中的状态是指是什么
“状态” 普遍的理解就是一个事物的多种形态,比如用户的就有 “冻结”,“正常”两种状态,那微服务中的状态又指什么呢?
概念的定义:在微服务中,如果一个数据需要被多个服务共享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个“状态”数据的服务被称为有状态服务,反之称为无状态服务
举个例子:
用户的会话信息:用户在登入后服务器记录用户登入的会话信息

在单体项目中session一般以存储在服务器本身上,这个时候如果拆分为多个服务之后,其他服务是没有存储用户的session信息记录的,它们只能从用户服务中获取,以便在整个系统中保持用户状态的一致性。

在整个环节中用户服务就需要维护用户登入的会话信息,因此这个会话信息就成为了一种状态,而其他服务需要从用户服务中获取登入信息,该状态就升级为了服务之间的状态,这就是微服务中的服务状态。
从结构上可以看出因为“状态”关系,如果用户服务出现意外停止运行,那么其他服务器因需要用户服务器的状态信息而无法正常执行业务,则直接影响到整个系统的稳定,因此微服务中会提倡无状态。
如何实现无状态?
在微服务中如果一个数据需要被多个服务共享,那么它就是有状态的,而结合于业务来分析大致可以分为两大类型:共享状态,流程状态。
共享状态型
之前列举的例子就是共享类型,用户状态的信息需要被其他的服务所依赖,但是在业务中除了本身服务对状态维护其他服务不会维护该信息,只做读取操作。

如果是这一类型,我们可以采取分布式数据库或缓存的方式实现数据的共享来解决这个问题。如果用户服务出现异常,其他服务也仍然可以从分布式缓存中获取到信息继续完成相关的业务。
【扩展】在微服务中的设计模式,对于各个服务是独享自己的数据库的。
流程状态型
是指该状态数据在服务之间会随业务的流程走向而发生状态更改,在特定的流程环节又有相关服务会订阅该数据状态的变化。
典型的例子:订单发货,订单从生成→待支付→完成支付→待发货→发货→到货→签收
这其中订单信息会在各个订单服务,支付服务,库存等服务发生变更,并相关服务会订阅或读取该任务记录消息。

针对该类型可以采取基于消息队列的事件驱动来实现解决,如下图在绘制时不考虑库存因素。

如上,在用户支付成功后由订单将信息发送至kafka的某一个主题中,而其他如订单/库存/物流等服务则订阅主题信息的变化,然后再做相应的任务处理。从图上可以明显的发现,订单服务/物流服务/支付服务之间的耦合实践是很低的.
小结
本节中重点在于理解微服务中服务之间的状态,状态是指服务在处理请求时所需要的数据或信息的集合。状态可以是服务内部的数据,也可以是与其他服务共享的数据。状态可以包括用户的会话信息、请求参数、中间计算结果、数据库记录等。在微服务中并不是不允许有状态的存在,而需要根据情况来定。
相关文章:
从0进入微服务需要了解的基础知识
文章目录 系统架构演化过程为什么要了解系统架构的演化过程技术发展认知技术选型与创新 演变过程单体架构分层-分布式集群微服务 分布式\集群\微服务 微服务中的核心要素-拆分原则项目拆分与复杂度微服务的拆分维度有哪些小结 微服务中的核心要素服务化进行拆分后一定是微服务&…...
MySQL之复制(七)
复制 定制的复制方案 分离功能 许多应用都混合了在线事务处理(OLTP)和在线数据分析(OLAP)的查询。OLTP查询比较短并且是事务型的。OLAP查询则通常很大,也很慢,并且不要求绝对最新的数据。这两种查询给服务器带来的负担完全不同,因此它们需…...
Redis分片集群搭建
主从模式可以解决高可用、高并发读的问题。但依然有两个问题没有解决: 海量数据存储高并发写 要解决这两个问题就需要用到分片集群了。分片的意思,就是把数据拆分存储到不同节点,这样整个集群的存储数据量就更大了。 Redis分片集群的结构如…...
请解释Java中的策略模式,并举例说明其应用场景和实现方式。请解释Java中的模板方法模式,并讨论其在实际项目中的应用。
请解释Java中的策略模式,并举例说明其应用场景和实现方式。 策略模式(Strategy Pattern) 策略模式是一种行为设计模式,它使你能够定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使…...
Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱
Vim模式 普通模式(Normal Mode): 这是 Vim 的默认模式,用于执行文本编辑命令,如复制、粘贴、删除等。在此模式下,你可以使用各种 Vim 命令来操作文本。插入模式(Insert Mode)&#…...
基于Windows API DialogBox的对话框
在C中,DialogBox函数是Windows API的一部分,它用于在Win32应用程序中创建并显示一个模态对话框。DialogBox函数是USER32.DLL中的一个导出函数,因此你需要在你的C Win32应用程序中链接到这个库。 #include "framework.h" #include …...
五十一、openlayers官网示例Layer Min/Max Resolution解析——设置图层最大分辨率,超过最大值换另一个图层显示
使用minResolution、maxResolution分辨率来设置图层显示最大分辨率。 <template><div class"box"><h1>Layer Min/Max Resolution</h1><div id"map" class"map"></div></div> </template><…...
24年计算机等级考试22个常见问题解答❗
24年9月计算机等级考试即将开始,整理了报名中容易遇到的22个问题,大家对照入座,避免遇到了不知道怎么办? 1、报名条件 2、报名入口 3、考生报名之后后悔了,不想考了,能否退费? 4、最多能够报多少…...
obsidian制作自己的主题一文入门
制作自己的主题 我最近发现一款插件,直接把obsidian的文章格式复制到公众号中。 我非常喜欢这个功能,这将减少公众号排版的时间,同时保持公众号文章格式的一致性。 但是这个插件提供的模板不能满足我的需求,所以,需要…...
游戏心理学Day20
扩展的8种玩家 完成主义者 此类玩家关心的是成就和进展,其主要目的是完成游戏的主要目标,其次是完成游戏的次要目标之后才是游戏中的其他内容,在多人游戏中完成主义者会致力于炫耀自己的状态和财富。如果游戏以胜负为目标,那么此…...
Serverless如何赋能餐饮行业数字化?乐凯撒思变之道
导语 | 在数字化浪潮席卷全球的今天,每一个行业都在经历着前所未有的变革。餐饮行业作为人们日常生活中不可或缺的一部分,更是面临着巨大的转型压力。如何完成数字化转型,打破传统经营模式的限制,成为摆在众多餐饮商家面前的一道难…...
css系列:音频播放效果-波纹律动
介绍 语音播放的律动效果,通俗来说就是一个带动画的特殊样式的进度条,播放的部分带有上下律动的动画,未播放的部分是普通的灰色竖状条。 实现中夹带了less变量、继承和循环遍历,可以顺带学习一下。 结果展示 大致效果如图所示…...
WPF学习(1)--类与类的继承
在面向对象编程中,继承是一种机制,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。继承使我们能够创建一个通用类,然后根据需要扩展或修改它以创建更具体的类。以下是…...
Spring Boot框架的原理及应用详解(六)
本系列文章简介: 在当今的软件开发世界中,快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目,自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性,迅速在Java开发社…...
密码学与信息安全面试题及参考答案(2万字长文)
目录 什么是密码学?它的主要目标是什么? 请解释明文、密文、加密和解密的概念。 密码系统的安全性通常基于哪三种假设? 什么是Kerckhoffs原则?它对现代密码学设计有何意义? 简述密码学中的“混淆”和“扩散”概念。 什么是AES(高级加密标准)?AES有几种常见的密钥…...
C++语法19 循环嵌套结构(for/while循环)
语法阶段已经更新到第18章了,前面的知识你都学会了吗?如果还没有学习前面的知识,请点击👉语法专栏进行学习哦! 目录 循环嵌套 训练:数字矩形 解析 参考代码 训练:星号三角形 解析 参考代码 …...
AtomicInteger原理和CAS与Synchronized(juc编程)
AtomicInteger原理 4.6.1 原理介绍 AtomicInteger的本质:自旋锁 CAS算法 CAS的全成是: Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作,这…...
抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版
抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音,右键视频进入详情页。F12打开控制台筛选detail,然后刷新网页,找到请求。可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172…...
【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践
文章目录 引言第一章 半监督学习的基本概念1.1 什么是半监督学习1.2 半监督学习的优势 第二章 半监督学习的核心算法2.1 自训练(Self-Training)2.2 协同训练(Co-Training)2.3 图半监督学习(Graph-Based Semi-Supervise…...
leetcode70 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
