微服务拆分

如题所述

第1个回答  2022-06-17

从上图可以看出单体架构的问题可以通过微服务化拆分来解决。

随着商业模式逐渐得到验证,产品获得了市场的认可,为了加快产品的迭代效率,团队开始引进更多的研发人力,此时业务已经达到了一定的复杂度,单体应用已经无法满足业务增长的需求,研发效率开始下降,这是就是需要考虑服务拆分的时机点。

服务拆分的落地还需要提前准备好配套的基础设施,比如注册中心、配置中心、日志系统、持续交付、监控系统、分布式定时任务、CAP 理论、分布式调用链、API 网关等等;

人才的储备和观念的变化也得同时跟上

服务拆分不仅仅是技术的升级,更是开发方式、组织架构、开发观念的转变

服务拆分粒度太细会增加运维复杂度,粒度过大又起不到效果,如何平衡拆分粒度呢?

产品初期阶段,业务逻辑并没有足够复杂到2~3人没法维护的地步,这时我们没有必要将业务继续拆分的更细,但随着业务的发展,业务逻辑变的越来越复杂,可能同时服务多个平台,这时你会发现服务面临各种问题,这个阶段就需要将服务拆分为更细粒度的服务。虽然业务复杂度已经满足了,但如果没有足够的人力,服务最好也不要拆分,拆分会因为人力的不足导致更多的问题,如研发效率大幅下降。

一个服务需要几个开发维护是比较理性的?

三个火枪手原则

三个火枪手原则主要应用于微服务设计和开发阶段

拆分策略可以按功能和非功能维度考虑,功能维度主要是划分清楚业务的边界,非功能维度主要考虑六点:扩展性、复用性、高性能、高可用、安全性、异构性。

纵行拆分(基于业务逻辑拆分)
从业务维度进行拆分。标准是按照业务的关联程度来决定,关联比较密切的业务适合拆分为一个微服务,而功能相对比较独立的业务适合单独拆分为一个微服务

横向拆分
从公共且独立功能维度拆分。标准是按照是否有公共的被多个其他服务调用,且依赖的资源独立不与其他业务 耦合。

按领域模型拆分
按领域模型拆分主要是划分清楚业务边界,主要分四步:
1、找出领域实体和值对象等领域对象
2、找出聚合根,根据实体、值对象和聚合根的依赖关系,建立聚合
3、根据业务及语义边界等因素,定义限界上下文
4、每一个限界上下文可以拆分一个对应的服务,但是也要考虑一些非功能因素

扩展性
区分系统中变与不变的部分,不变的部分一般是成熟的、通用的服务功能,变的部分一般是改动比较多、满足业务迭代扩展性需要的功能,我们可以将不变的部分拆分出来,作为公用的服务,将变的部分独立出来满足个性化扩展需要。
二八原则:经常变动的部分大约只占20%,剩下的80%基本不变或极少变化

复用性
不同的业务里或服务里经常会出现重复的功能,比如每个服务都有鉴权、限流、安全以及日志监控等功能,可以将这些通用的功能拆分出来形成独立的服务,也就是微服务里面的API网关。

可靠性
将可靠性要求高的核心服务和可靠性要求相对低的非核心服务拆分开来,然后重点保护核心服务的高可用。

高性能
将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其他服务。常见的拆分方式和具体的性能瓶颈有关,例如电商的抢购,性能压力最大的是排队功能,可以将此独立成一个服务;对于读写差异比较大的服务,也可以基于读写分离来拆分;基于数据一致性拆分,将强一致性的业务尽量放在一个服务中,弱一致性通常拆分为不同的服务

安全性
不同的服务可能对信息安全有不同的要求,因此把需要高度安全的服务拆分出来,进行区分部署,可以更有针对性地满足信息安全的要求,也可以降低对防火墙等安全设备吞吐量、并发性等方面的要求,降低成本,提高效率

异构性
对于开发语言种类有要求的业务场景,可以用不同的语言将其功能独立出来实现一个独立服务

以上拆分方式可以根据实际情况自由排列组合使用。拆分不仅仅是架构上的调整,也意味着要在组织结构上做出响应的适应性优化,以确保拆分后的服务由相对独立的团队负责维护

一个系统现在拆分出来的服务粒度也许合适,但随着时间的流失,系统需要不断的适应新的业务发展阶段,我们对系统领域的了解也越来越深,之前拆分的服务粒度可能就不合适了。例如业务的增删导致、过多的进程间通信导致效率低下等因素。

人员和服务数量的不匹配导致的维护成本增加,也是导致服务合并的一个重要原因。

服务数量过多和资源不匹配,则可以考虑合并多个微服务到一个服务包,部署到一台服务器,这样可以节省服务运行时的基础资源消耗,也降低了维护成本。 需要注意的是,虽然服务包是运行在一个进程中,但是服务包内的服务依然要满足微服务定义,以便在未来某一天要重新拆开的时候可以很快就分离

相似回答