理解微服务架构

139 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

微服务架构

1.1 为什么采用微服务架构?

1.1.1 单体架构和微服务架构

很难用一个绝对的方式去判断架构的好坏,在大多数情况下,我们很难从一个外部的视角去判断服务拆分的合理性,需要对上下文非常了解才能做出好的决策。

可以综合下面表中的多个维度进行分析

1.1.2 什么时候开始微服务架构

产品初期优先使用单体架构,面对一个新的领域,对业务的理解很难在开始阶段就比较清晰,往往是经过一段时间后,才能逐步弄清楚。

在服务划分之前,应该保证基础设施及公共基础服务已经准备好。如:监控服务、自动化运维工具、服务化框架等(灰度发布、资源调度)。

1.1.3 拆分粒度

微服务里面的微应该解释为“合适”,但是这个词比较含糊。对业务不够理解,对团队情况不够理解,都无权协助确定服务的粒度。随着业务发展,粒度可能还会发生变化。

每个人情况不一样,有的公司认为团队规模是决定性的,有的认为交付速度是决定性的,找到你的决定性因素,来做拆分即可。实在找不到合适的依据,可以参考此表。

1.2 微服务设计原则

  • 垂直划分优先原则

应该根据业务领域对服务进行垂直划分。

  • 持续演进原则

服务数量快速增长带来的架构复杂度急剧升高,开发、测试、运维等环节很难快速适应。非必要情况,应逐步划分,持续演进。

  • 服务自治、接口隔离

尽量消除对其他服务的强依赖,这样可以降低沟通成本,提升服务稳定性。

  • 自动化驱动原则

服务的增多,部署和运维的成本就会呈指数型增长,应该首先构建自动化的工具和环境。

1.3 微服务架构实施的先决条件

1.3.1 研发环境和流程上的转变

在微服务架构实施之前,要准备相关的环境和流程。

  • 自动化工具链

微服务可以基于自动化工具链,以流水线的交付方式串联整个DevOps流程。

  • 微服务框架

先进行微服务框架的选型和试用

  • 快速申请资源
  • 故障反馈机制

需要全面的监控故障,及时处理并发出报警。

  • 研发流程转变

需要重建团队,以服务为核心,按照业务领域划分全功能团队。

1.3.2 拆分前先做好解耦
  • 状态外置

    1. 定时任务:有很多任务不能重复触发,所以需要把定时任务从业务服务中提取出来,通过分布式任务系统调度。
    2. 本地存储:在本地存储文件的方式比较常见,但是当有多个实例的时候,要么需要全部同步,要么需要路由到一个实例。
    3. 本地缓存:如session数据,可以通过分布式缓存解决
  • 去触发器,存储过程

    1. 当有触发器,存储过程时,整体伸缩难以扩展
    2. 当存在水平分表时,可能无法满足需求
    3. 如果触发器,存储过程过多,则会导致运维复杂度增高
  • 通过接口隔离

    1. 如果直接去连接其他服务的数据库,当其他服务的数据结构变化,自己的服务也要跟着调整。
    2. 限流某个接口或者缓存也做不成,因为别人直接访问你的数据库

1.4 微服务划分模式

1.4.1 基于业务复杂度划分

当业务复杂度较低时,可以选择基于数据驱动划分服务。数据驱动更容易理解和上手。

1.4.2 基于数据驱动划分服务

数据驱动是自下而上的架构设计方法,强调的是数据结构。也就是分析需求确定数据结构,然后根据表之间的关系划分服务。

(1)需求分析,总结用户故事
(2)抽象数据结构
(3)划分服务
(4)确定服务调用关系,根据流程图来确定
(5)业务流程验证,验证划分的服务是否合适,可以根据以下几个问题来考虑

  • 一次更新操作如需跨越几个服务,一致性要求是什么
  • 跨服务查询时,是否要做关联查询
  • 性能是否满足要求
  • 成本是否满足要求

(6)持续优化

1.4.3 基于领域驱动划分服务

领域驱动是自上而下的设计方法,确定关键业务场景,确定业务边界。领域驱动更注重业务实现效果,认为自下而上的设计会让技术人员不能很好的理解业务方向,进而偏离业务目标。

1.4.4 从已有的单体架构中划分服务

(1) 通常前后端分离是第一步
(2) 提取公共基础服务
(3) 不断地从老系统中抽象出服务,垂直划分优先

1.4.5 微服务拆分策略
  • 比较独立的新业务
  • 优先抽取通用服务
  • 优先抽取比较容易识别的,边界比较明显的服务。包结构比较清晰的,比较好操作。
  • 优先抽象核心服务。边缘服务抽出去还要增加维护成本没有必要
  • 优先抽象具有独立属性的服务