微服务架构-微服务实施

目录

一、概述

二、微服务拆分

2.1 概述

2.2 拆分原则

2.3 拆分方法

2.3.1 以数据为维度进行拆分

2.3.2 按照使用场景拆分

2.3.3 重要和非重要的拆分

2.3.4 变和不变的拆分

三、微服务通信

3.1 概述

3.2 微服务通信方式选择

3.3 微服务编排

3.4 API接口设计

3.5 合理设置超时和重试

3.6 数据一致性设计

四、微服务稳定性保障

4.1 概述

4.2 稳定性保障的目标

4.2.1 概述

4.2.2 故障预防

4.2.3 故障快速定位

4.2.4 故障快速止损

4.3 稳定性保障的6个维度

4.3.1 概述

4.3.2 隔离

4.3.3 冗余

4.3.4 容灾容错

4.3.5 变更管理

4.3.6 时间相关故障管理

4.3.7 运维友好


一、概述

微服务改造过程中会面临很多挑战,接下来从服务拆分、服务通信以及服务稳定性设计这几个维度出发,讨论微服务实施过程中需要着重注意的问题。

二、微服务拆分

2.1 概述

服务拆分是微服务改造的第一步,也是最为关键的一步,拆分是否合理,决定了整个微服务化过程的成败,因此,需要有科学的拆分原则和拆分方法,保证拆分过程有序进行。

2.2 拆分原则

微服务拆分前,需要确定拆分的基本原则,微服务拆分的一个非常重要原则是无状态,无状态服务方便扩展和运维,所以无状态设计需要贯穿到微服务架构设计的全局层面进行思考。

服务拆分粒度并不是越细越好,需要结合当前团队的人员情况而定,比如当前团队只有5个人,如果拆分后的微服务个数超过50,和人员的数量严重不匹配,不仅不会带来效率的提升,反而会导致效率的下降,建议拆分后每个人维护的微服务不要超过3个,并且每个微服务都有相应的备用负责人,规避可能的突发风险;针对多团队异地开发的情况,最好拆分后每个子团队负责的微服务相对独立,尽量减少异地团队的直接沟通成本。

微服务拆分时经常会遇到一些问题,比如是否需要拆分、拆分粒度的问题等,一般原则是遇到痛点问题时才进行拆分,非拆分不可时才启动微服务拆分,不要为了拆分而拆分。对于拆分方案拿捏不准的场景,尽量先不进行拆分,等想清楚了再定,避免拆分不合理,带来大量返工。

拆分后的微服务组织上层次不要过深,一个请求的处理过程中经过的微服务个数不要超过5个,链路太深会导致定位和追查问题特别麻烦,同时也会带来一定的性能损耗。

对于拆分后的子服务来说,尽量避免相互依赖的场景,子服务调用时相互依赖会导致升级和维护时特别麻烦,增加很多不必要的运维成本。

2.3 拆分方法

微服务拆分的总体思想是根据高耦合、低内聚的原则识别出各个微服务的边界。具体拆分思路和业务形态紧密相关,没有绝对的标准,下面介绍微服务架构拆分中使用比较多的两种拆分方式。

2.3.1 以数据为维度进行拆分

按照数据拆分,是微服务拆分中最常见的一种方式,没有特殊考虑时一般根据领域实体数据进行拆分,拆分出来的服务负责处理给定的数据/资源的所有操作。

以电商系统为例,大体可分为订单系统、用户系统、库存系统等。以订单系统为例,订单系统就负责订单核心数据的维护、订单数据的增删查改,确立了主要实体数据后可以根据数据的查询、修改等确定服务的接口,如订单的各种查询接口以及订单状态更新接口。

根据数据维度把系统可以拆分出若干个子服务,但这些数据之间会有不少关联关系。以百度贴吧为例,贴吧中的人、吧、帖是三个最重要的实体数据,这些实体数据可以分别放到不同的服务中。但是一些常见的实体关系,比如人发过的帖子、人收藏的吧,以及吧的会员、吧的帖子列表等,这些实体关系数据的维护,原则上放在哪个实体上维护没有标准的答案,某个人发过的帖子放在人服务和帖服务都可以,反复在这些地方纠结也不会带来太多的收益,可以人为地指定一个约束,如某个人发过的帖子就放在帖服务里面。

2.3.2 按照使用场景拆分

服务按照使用场景进行服务拆分,这种拆分方式也比较常见,如顺风车的所有后端查询操作之前都在一个单体服务里面,有固定路线/临时路线查询顺路订单,有根据路线查询附近订单,还有查询跨城订单,以及后续的需求乘客查询附近司机,乘客查询顺路司机等。之前这些在线查询接口都在一个单体服务中,多个RD会同时负责和修改这个服务的代码,开发效率低下,测试、上线都会相互影响,维护起来比较困难,后来把这些查询按照功能都拆分为不同的子服务,每个RD单独负责,大大提高了开发、测试以及运维效率。

2.3.3 重要和非重要的拆分

将核心逻辑和非核心逻辑拆分为不同的微服务,然后采用不同的高可用处理方案,比如核心服务尽量做到机房、集群等多维度的冗余和隔离;非核心服务则可以适当降低可用性标准,出现问题时只要能够及时降级和熔断即可。

2.3.4 变和不变的拆分

按照变更频次对服务进行拆分,尽量将变化聚集到少部分微服务上面,系统的绝大多数服务变更很少,可以减少变更对整个系统的冲击和影响。

三、微服务通信

3.1 概述

为了保证拆分之后的微服务能够通力合作,共同对外提供服务能力,需要通过一定的机制将拆分之后的微服务合起来,也就是微服务通信,接下来讨论微服务通信过程中常见的一些问题。

3.2 微服务通信方式选择

微服务通信时,首先需要考虑的是通信方式的选择,对一些不需要返回业务数据的微服务来说,究竟是采用同步方式还是异步方式呢?同步方式架构层面要求比较高,异步方式架构层面比较优雅,但运维成本比较高,出现问题时排查起来不太方便。之前公司中有过一次不成功的架构升级实例,业务形态完全围绕订单状态流转进行,当前的架构初衷是构建一套基于事件驱动的基础设施,所有微服务均以事件驱动的方式进行触发,最后不仅对业务人员的挑战比较大,同时运维、高可用和问题追查的成本比较高。因此微服务化时,核心服务推荐均采用同步通信的方式,一些非核心服务可以采用异步通信的方式。

3.3 微服务编排

微服务编排上,一些可以并行调用的场景推荐采用并行调用的方式,可以减少请求的整体耗时,提高用户体验。

当然对于有些场景来说,直接采用并行调用不一定是最好的方式,需要综合考虑和分析。比如,对于搜索和广告引擎来说,整个系统会有大量的过滤子服务组成,如果完全采用串行的方式,并且有着良好的漏斗模型设计,这时请求的整体耗时可能会上升,但整体的调用量会减少不少,成本上有很大的节省;如果采用完全并行的方式,整体耗时会有很大的改善,但无法充分利用漏斗模型,成本上会有一定的浪费。面对这种场景,需要有一套完善的微服务编排引擎,能够同时兼顾性能和成本上的需求,做到微服务编排的最优化。

3.4 API接口设计

API接口设计上,需要尽可能简单易用,一个接口只实现一个确定的功能,不要设计复杂或者含义不明确的接口,避免滥用;同时接口设计时做好前后向兼容,以及幂等性设计。

3.5 合理设置超时和重试

微服务通信上,需要合理设置超时和重试,超时和重试设置不要只考虑当前链路,而要从请求全链路的角度,对超时和重试进行统一梳理。

除非有特殊原因,建议在调用的入口统一进行重试,请求过程中不再进行重试,避免故障时的多级重试导致的整体雪崩。

3.6 数据一致性设计

同时操作多个微服务的场景,需要保证不同微服务之间的数据一致性,数据一致性设计尽量遵循简单的原则,除非特别场景,不要使用分布式事务。

多个微服务操作时,成功或失败需要以核心数据为准,当同时对多个核心数据进行操作时,可以以其中一个为准,遇到个别数据不一致的场景,可以采用线下对账的方式对不一致的数据进行校对和修正。

四、微服务稳定性保障

4.1 概述

微服务改造中,挑战最大的就是拆分之后的稳定性保障,拆分之后链路复杂、故障点众多,需要一套体系化的稳定性保障机制。

4.2 稳定性保障的目标

4.2.1 概述

微服务稳定性保障需要从事前、事中和事后全方位进行考虑。微服务架构下,应用程序、依赖服务、网络、硬件等都有可能出现故障,稳定性设计和保障的具体目标如下。

4.2.2 故障预防

尽可能减少故障的产生,绝大多数稳定性问题和稳定性故障发生都有一定的诱因,并且一般是在多种拦截手段均失灵的情况下故障才会发生,如果我们在故障发生前制定完备的稳定性保障措施,可以最大限度地减少稳定性故障的发生。

4.2.3 故障快速定位

完全不出故障的业务是不存在的,关键是出故障时能够快速发现故障,只有及时发现,才能在最短时间内采取相应的解决措施。

4.2.4 故障快速止损

发生故障后第一时间要进行业务止损,恢复业务的正常运行,故障深层次的具体原因可以事后再分析和复盘解决。

4.3 稳定性保障的6个维度

4.3.1 概述

系统故障点很多,稳定性保障就是对故障点进行管理的过程。可以从故障点管理的角度将整个稳定性设计和保障分为如下隔离、冗余、容灾容错、变更管理、时间相关故障管理与运维友好6个维度。

4.3.2 隔离

影响系统稳定性的不稳定性因素和故障点很多,从稳定性保障的角度看,很自然的想法就是,如何尽量减少如此多的故障点给系统稳定性带来的隐患,比如某电商业务有200个微服务组成,如果这100个微服务中的任何一个出问题,导致业务不可用,那么系统的可用性就会很低。业务层面如果能够梳理和抽象出保障业务核心运行的最小系统(比如上面提到的电商业务最小系统包含的服务可能会小于50个,其他都是增值和支撑性的服务),同时将最小系统之外的不稳定性因素从最小系统中隔离出来,就可以大大增强系统的稳定性和健壮性。因此,稳定性设计的第一个原则就是“隔离”,通过各种隔离机制,将核心服务之前的故障点隔离出去,保证核心服务的可用性。

4.3.3 冗余

通过隔离,可以减少绝大多数不稳定性因素对系统稳定性的影响,但如果核心服务或核心服务所在的环境出问题,就无法从隔离中受益。我们需要有相应的机制保证核心业务的部分单元出问题时,业务整体运行不受大的影响,这种机制就是冗余。通过服务级别、机器级别、集群级别、机房级别等多种维度的冗余,我们可以保证:即便核心服务出问题,也可以通过相应的流量切换策略,将流量切到冗余节点上,保证业务不受影响。

4.3.4 容灾容错

通过冗余可以保证核心服务及其部署环境变化时的系统稳定性,但如果系统外部输入有变化,比如遇到突然大流量、异常流量或者突发的安全攻击,而系统事先没有相应的应对机制,则业务很可能瞬间被击垮。因此,稳定性设计的第三个原则是“容灾容错”,通过构建多维度的容灾容错体系,保证系统面对异常输入时,仍然能够提高稳定的输出能力。

4.3.5 变更管理

通过隔离、冗余与容灾可以排除和应对业务最小子系统的各种外部稳定性风险,变更管理、时间相关故障管理是为了解决核心系统自身的稳定性问题。绝大部分稳定性故障都是由变更引起,系统如果长时间没有任何变更,很少会有稳定性问题,因此服务稳定性保障的关键一环是严把变更这一关,保证变更质量。

4.3.6 时间相关故障管理

服务没有变更时,有一类故障很少发生并且很难发现,就是随时间变化而产生的ID越界和溢出,这类故障平常测试时很难发现,并且发生时会对整个系统产生很大的影响,需要从设计层面开始把控,比如随时间变化的ID字段尽量使用int64。

4.3.7 运维友好

隔离、冗余和容灾减少了核心服务的外部稳定性风险,变更管理和时间相关故障管理保证了核心服务自身的稳定性。上述5种措施构成了业务稳定性预防的整个闭环,但即使设计得再好,也不能完全杜绝稳定性故障,稳定性风险只能最大限度地减少,因此服务的研发生命周期中,还需要加上运维友好的考虑。设计时需要针对稳定性问题的快速发现进行特别考虑,如日志怎么输出,统计信息如何收集等。通过运维友好设计,比如log、metric和trace等方式的良好设计与运用,建立全方位多维度的故障发现机制,保证出现问题时可以快速发现和快速止损,最大程度上减少稳定性风险的影响。

好了,本次内容就分享到这,欢迎大家关注《微服务架构》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验报告 Java输入和输出

实验目的: 掌握Java 输入输出流的应用 掌握缓冲流的应用。 实验要求: (1)掌握字节输入输出流的操作 (2)掌握字符输入输出流的操作 (3)理解字节流和字符流的区别 (…

游戏找不到steam_api64.dll如何解决,全面解析原因及解决方法

在现代游戏中,Steam平台已经成为了玩家们下载、安装和玩游戏的主要渠道之一。然而,有些玩家可能会遇到一个问题,即游戏找不到steam_api64.dll文件。这个问题可能会导致游戏无法正常运行或启动。本文将详细介绍如何解决这个问题,帮…

深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤 前言一、介绍和意义二、 计算细节2.1 计算Attention Score2.2 计算value2.3 计算关联结果b2.4 统一计算 三、总结 前言 Transformer是一种非常常见且强大的深度学习网络架构,尤其擅长处理输出为可变长度向量序列的任务&#xf…

51仿真器 PZ-51Tracker 未知设备

插上仿真器,右击我的电脑 等待一下,选择winUSB 此时在keil中选择仿真器会报错,需要安装如下我是win10) 安装好后退出再试,没有报错即可 这项也要选择 另外配置晶振

AI去衣技术中的几何着色:揭秘数字时尚的魔法

在数字化时代,人工智能(AI)正以前所未有的速度改变我们的生活,从智能家居到自动驾驶汽车,再到个性化医疗。然而,AI的影响远不止于此。它正在重塑我们对艺术、设计和时尚的理解。特别是在数字时尚领域&#…

数学建模 —— 人工神经网络(6)

目录 一、人工神经网络 1.1 人工神经网络结构 1.2 神经元/感知器 1.3 激活函数 1.3.1 sign函数 1.3.2 sigmoid函数(Logistic函数) 1.3.3 tanh双曲正切函数 1.3.4 ReLU函数 1.4 分类 二、BP人工神经网络 2.1 概述 2.2 处理过程 2.3 例题 2.…

太空音响器

目录 1.课程设计项目 2.任务和要求 3.总体功能设计与仿真 3.1.元器件汇总 3.2.总体方案设计 3.3 总体电路仿真 4.单元模块设计及电路仿真 4.1 互补型振荡器电路 5.组装,调试与测试 6.分析与总结 7.参考文献 1.课程设…

汇编原理 | 二进制、跳转指令、算数运算、

一.二进制 two complement reprentation(补码) 二进制的运算: 6的二进制 0110 -6的二进制 如何表示? 四个bit的第一个bit表示符号:1负0正 -6表示为1010 解释: 0 0000 1 0001 -1 1111(由 …

[图解]建模相关的基础知识-01

6 00:00:21,930 --> 00:00:25,450 我们尝试以一个更深的 7 00:00:25,460 --> 00:00:27,170 或者更基本的角度 8 00:00:28,410 --> 00:00:32,760 来思考建模的问题 9 00:00:37,630 --> 00:00:42,470 首先,我们来说一个观点,就是说 10 00:…

WPS部分快捷操作汇总

记录一些个人常用的WPS快捷操作 一、去除文档中所有的超链接: 1、用WPS打开文档; 2、用Ctrla全选,或者点击上方的【选择】-【全选】,选中文档全部内容; 3、按CTRLSHIFTF9组合键,即可一次性将取文档中所有…

IDEA一键启动多个微服务

我们在做微服务项目开发的时候,每次刚打开IDEA,就需要把各个服务一个个依次启动,特别是服务比较多时,逐个点击不仅麻烦还费时。下面来说一下如何一键启动多个微服务。 操作步骤 点击Edit Configurations 2.点击“”,…

数据图同步软件ETL

ETL介绍 ETL(Extract, Transform, Load)软件是专门用于数据集成和数据仓库过程中的工具。ETL过程涉及从多个数据源提取数据,对数据进行转换以满足业务需求,然后将数据加载到目标数据库或数据仓库中。以下是ETL软件的一些关键功能…

matplotlib实现双柱图

1,读取txt文件实现数据可视化 2,txt文件如下图 姓名,语文,数学,英语 小米,98,100,20 小明,100,20,98 小黑,78,98,1003,代码如下 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg) plt.rcParams[font.family]SimHe…

鸿蒙应用Stage模型【应用/组件级配置】

应用/组件级配置 在开发应用时,需要配置应用的一些标签,例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的[app.json5配置文件]中配置bundleName标签,…

多元分类预测 | 基于哈里斯鹰优化HHO-卷积神经网络数据分类预测

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 多元分类预测 | 基于哈里斯鹰优化HHO-卷积神经网络数据分类预测 HHO-CNN 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类…

设计模式(四)原型模式

文章目录 原型模式简介结构UML图具体实现关于拷贝浅拷贝深拷贝实现深拷贝方法 原型模式简介 原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。工作原理:原型模式创建新的对象,其本质就…

iOS App Tech Support(URL)

咪萌是一个语音类交友直播App,分成红艳知己,点唱大厅,歌手驻唱等不同房间分类,广场可以看到其他人发的一些动态,一个非常不错的App 如果您有任何疑问,您可以留言或者将问题发送至我们的邮箱。 我们会第一时…

子比主题zibll5.7修复版

下载地址:子比主题zibll5.7修复版

GPT-4o VS GPT-3.5 完胜

前言: 最近,GPT-4o已经限时免费开放了,试了一下,然后,说我的时间到了,然后,有给我转到3.5,正好遇到一个问题做一下对吧,感觉4O完胜啊。3.5还是很好胡诌,也就…

C语言深入理解指针(5)

文章目录 一、sizeof和strlen的对比1、sizeof2、strlen3、sizeof和strlen的对比 二、数组和指针笔试题解析1、一维数组2、字符数组3、二维数组 一、sizeof和strlen的对比 1、sizeof siezeof是一个操作符,sizeof计算的是变量所占内存空间大小,单位是字节…