微服务划分的模式与反模式(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务划分的模式与反模式(下)

微服务拆分策略


当不断从单体架构中抽象服务的时候,哪些服务优先被拆分,哪些服务不需要被拆分?以下几个策略可以帮助解决拆分中的这些问题


· 比较独立的新业务优先采用微服务架构。从成本角度考虑,新业务采用新的架构是最合理的,因为这样做业务的影响最小。


· 优先抽象通用服务。因为通常通用服务的边界比较明显,耦合度低,比较容易分离

· 优先抽象比较容易识别的边界比较明显的服务。如果原有包结构比较清晰,可以基于原有包结构中明显边界的、比较完整业务进行划分是从成本角度考虑。如果已经基于单体架构开发了一段时间,对业务的理解程度已经非常高,那么开发及架构人员能够比较容易提炼出一些边界比较明显的服务。


· 优先抽象核心服务。因为微服务的开发及运维成本比较高,并不是所有的地方都要划分很小的粒度。往往一些比较边缘的运营、管理的系统甚至不会考虑拆分另外随着时间的推移,有一些业务可能会发生改变,因此应该先抽象出核心服务


· 优先抽象具有独立属性的服务。应根据功能的变更频率、资源占用、技术栈属性划分服务


· 采用绞杀者模式,在遗留系统外围,随着时间的推移,让新的服务逐渐“绞杀”老的系统。在这种情况下,复杂度往往体现在如何灰度发布迁移数据以及如何保障服务不中断,后面的章节会详细描述

如何衡量服务划分合理


每个产品在实施微服务架构最初的动力都不一样,目标也有所区别,所以判断是否划分合理,首先要看是否达成了目标。其次,可以参考以下几衡量方式。每种衡量方式不能单独作为一个判断标准,需要综合考虑。


· 一个小功能的修改从需求到上线需要多长时间正常情况下的微服务架构交付周期应该是以天为单位的。如果一个功能的修改需要几周到几个月的时间,可能意味着服务划分粒度过大,存在太多的冲突,要等待合并代码


· 大多数功能修改是否可以在一个服务内完成?如果经常需要跨服务团队的联合开发组才完成一个功能的开发或者旧功能的修改,则说明服务分存在问题。


· 是否要频繁修改接口?频繁修改接口有可能是接口设计不合理导致,也有可能是服务划分的问题导致的,说明服务之间的边界并不是特别明确和稳定。


· 响应时间是否能满足要求?在某些追求极致性能的场景中,对响应时间要求较高,服务划分的层次太多、粒度太小都可能导致响应时间不能满足要求


· 是否存在大量的跨服务更新是否存在大量的跨服务的关联查询?出现这两个问题,可能是因为划分不合理


微服务划分反模式


前面我们介绍了如何划分服务,在此之上,我们希望通过微服务划分的反模式来帮助大家少走弯路。


根据代码行数划分服务


代码规模太大会导致沟通效率、交付效率低下,耦合度高,以及比较笨重。代码规模可以作为一个参考,但是不能作为一个绝对标准,微服务架构中存在一个“大服务”是很正常的。基于代码行数拆分服务很难衡量服务的完整性,容易导向更小的拆分粒度,引起不必要的复杂度。


划分粒度越小越好


服务的大小并不是特别重要,可以根据团队规模、代码规模、业务复杂度、技术领域重要程度、成本等因素综合考虑。关于服务粒度的大小,业界并没有统一标准,也很难衡量,最接近的衡量标准是研发团队规模。粒度小意味着更高的维护成本。后端管理辅助系统通常粒度较大


一次性划分服务


拆分服务有如下两种方式。


第一种,先拆分业务代码再拆分数据库。如图2-9所示,数据库并没有拆分,只是从单体中抽象出部分服务。


image.png


用第二种方式拆分服务时,根据服务将数据库彻底拆分为多个独立的数据库,每个服务独享数据库服务,服务之间只能通过接口调用。这看起来非常美好,但需要为此做大量的数据迁移。当业务处于初期,需求不是非常确定,开发人员对业务理解不是特别透彻的时候,可能拆分后发现拆分得并不合理,只能再进行合并,又要进行一次数据迁移。相对来说,业务代码拆分成本更低,而数据迁移的成本更高,频繁、大量的数据迁移并不可取。


更好的做法是把第一种方式作为过渡阶段,当业务逐步稳定后再彻底进行数据迁移。注意,处于过渡阶段时数据库并没有彻底分离,一切依赖都通过接口访问。但是这只是口头上的约定,对于业务开发人员直接在数据库中进行关联查询。需要通过Code Review的方式避免。


服务划分是一个长期的过程,需要积累大量的领域知识,以此来理解核心流程。最好是领域专家一起组成联合团队,理解核心问题的情况下,持续拆分服务并验证拆分合理性,随着时间的推移,可以重新划分可见,服务拆分是一个持续性的过程


服务划分一旦完成,不能改变


由于业务的不断变化,以及开发人员对领域知识其他影响因素的理解问题,很难一次性做出一个完美的解决方案通常划分后会发现某个问题是不可忍受的,例如划分导致响应时间降低,增加了更多的成本,有可能需要重新合并服务;由于业务的变化,原本的依赖关系发生了变化,有可能面临需要重新划分服务等类似的问题。


先实施组件化,再实施微服务架构


很多技术人员试图先通过组件化逐步过渡到微服务架构,是一种思路。微服务架构划分更强调业务领域的完整性,因此垂直划分优先,组件化往往通过抽象稳定的部分形成组件共享,调用次数和依赖关系并不强调。因此,组件化之后转化到微服务架构的方式通常是错误的 

相关文章
|
2月前
|
消息中间件 中间件 API
深入探讨微服务架构中的服务通信模式
随着微服务架构的普及,服务间的通信成为了系统设计的关键环节。本文将深入探讨微服务架构中的服务通信模式,包括同步通信和异步通信两大类,并对比其优缺点。我们还将介绍几种流行的通信技术,如REST、gRPC、消息队列等,并分析它们在实际应用中的适用场景。通过本文的阐述,读者将对微服务架构下的服务通信有一个全面而深刻的理解,为选择合适的通信模式提供指导。
|
3月前
|
监控 安全 关系型数据库
微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式
微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式
110 0
|
9月前
|
设计模式 Cloud Native 架构师
分享一份美团T9大牛总结的神仙微服务架构设计模式PDF
微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题。 企业和服务提供商正在寻找更好的方法将应用程序部署在云环境中,微服务被认为是未来的方向。通过将应用和服务分解成更小的、松散耦合的组件,它们可以更加容易升级和扩展,理论上是这样。
|
9月前
|
设计模式 监控 Java
Github标星67.9k的微服务架构以及架构设计模式笔记我粉了
我们都知道微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的 类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。
|
9月前
|
移动开发 小程序 安全
Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战(二)
Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战(二)
Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战(二)
|
9月前
|
安全 前端开发 小程序
Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战(一)
Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战(一)
|
10月前
|
关系型数据库 Java 中间件
《微服务实战》 第三十章 分布式事务框架seata TCC模式
《微服务实战》 第三十章 分布式事务框架seata TCC模式
115 0
|
10月前
|
Shell 测试技术 数据库
《微服务实战》 第二十九章 分布式事务框架seata AT模式(下)
《微服务实战》 第二十九章 分布式事务框架seata AT模式(下)
54 0
|
10月前
|
SQL Java 关系型数据库
《微服务实战》 第二十九章 分布式事务框架seata AT模式(上)
《微服务实战》 第二十九章 分布式事务框架seata AT模式(上)
123 0
|
10月前
|
SpringCloudAlibaba Java 数据安全/隐私保护
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
253 0