如何把单体式应用拆解成微服务?【下】

热评博文:如何设计出优美的Web API?》,现阅读量超 2300,小伙伴们不要错过哦!

紧接昨天的上篇《如何把单体式应用拆解成微服务?【上】》,今天我们一起来看看具体的拆解场景:

  • 场景1:数据库表外键引用关系

如果单体式应用中两个功能模块存在数据引用关系,那我们在拆解微服务时如何消除这种外键引用关系呢?首先,停⽌外键引⽤;然后,改成通过RESTful HTTP API⽅式获取原先外键关联的信息。如下图,改造前Payment数据库表中的记录通过外键引用Order,代码层面通常会借助对象关系映射(ORM)框架建立数据对象的关联,改造后代码层面就不能通过ORM框架做关联了。在Payment数据库表的记录中会保存Order的主键值,除此之外还会保存Order的关键属性信息,这样可以避免频繁的跨进程调用,从而可以提高系统的整体效率表现。

下图是改造前的情况:

下图是改造后的情况:

  • 场景2:共享静态数据关系

如果单体式应用中两个功能模块彼此共享静态数据,那我们在拆解微服务时如何消除这种共享关系呢?静态数据通常存储在数据库当中,例如:商品类目代号。如果这些静态数据需要更新,那我们就需要频繁地发布系统,这样会导致多个服务的中断。

为了避免这个问题,我们也可以将这些静态数据拷贝多份,分别⽤于每个服务,但维护多份数据拷⻉的一致性是个问题。另外,我们也可以将这些静态数据存⼊每个服务的配置文件,降低更新数据的难度。统一配置中心,微服务架构中的必选组件,我们可以通过它来管理这些静态数据,这样在维护更新上会带来极大的便利。

  • 场景3:共享基础数据关系

如果单体式应用中两个功能模块共享某类基础数据,那我们在拆解微服务时如何消除这种共享关系呢?多个服务共享某类基础数据,例如:用户数据、物流公司数据等等,那我们要为这类数据提炼出专门的领域模型,将它封装成微服务,然后通过该服务来访问这些共享的基础数据。服务化带来的好处就是彼此之间仅仅依赖服务契约,双方具体采用什么技术和方案都是自由的。只要服务契约没有改变,那彼此的升级改造就不会影响。

下图是改造前的情况:

下图是改造后的情况:

  • 场景4:共享数据库表格

如果单体式应用中两个功能模块共享一张数据表格,那我们在拆解微服务时如何消除这种共享关系呢?多个服务各自引⽤的数据被合并存储在一张数据库表当中,代码层面借助ORM框架实现多态,这种情况我们需要将每个服务所关注的数据剥离出来,分别存到不同的表格当中。

下图是改造前的情况:

下图是改造后的情况:

  • 场景5:共享数据库

在拆解微服务过程中,我们该如何拆分数据库呢?最稳妥的方案就是分阶段重构数据库,数据是最宝贵的资源,我们不要贪图一步到位。

下图是改造前的情况:

  • 第一步,按照业务上下文先将一个数据库拆解成两个数据库,但应用仍然是单体式应用,通过多数据源相关技术应用可以同时访问两个数据库,如下图所示:

  • 第二步,将单体式应用拆解成微服务,每个微服务都有各自独立的数据库,如下图所示:

  • 旧模块微服务改造优先级原则

从单体式应用中划分出有界的上下文,作为剥离微服务的候选,然后开始依次重构每个功能模块。那如何判断哪些模块应该优先被剥离成微服务呢?从模块剥离难度看,我们可以遵循先易后难的原则,逐步积累重构经验,这适用于在微服务构建方面经验不太丰富的团队;从需求变化频率看,优先剥离那些变更频繁的模块,整体收益会更大一些,这对于人力资源较为紧张的团队不失为一个好的判断准则;从资源消耗类型看,那些计算或内存密集的模块适合优先剥离,这样有利于弹性伸缩时提升资源利用效率,这对系统规模较大的场景效果最明显;从服务边界粒度看,粒度越粗越好剥离。具体按哪个规则来安排微服务的改造顺序,这就要根据每个团队的具体情况来具体分析了。

我们在支持不同系统实施微服务改造的过程中,上述优先级原则都被采用过,优先级存在的原因就是资源不够。微服务改造不是一蹴而就的事情,这个过程会持续很长时间,可能跨度几年,在不同阶段需要考虑的问题也就不同,最核心的原则就是按照适合自己的节奏有条不紊地开展工作,在确保线上业务稳定的前提下适当地追求速度。

  • 微服务改造是否结束判断标准

那什么时候才算完成微服务改造呢?判断标准就是旧系统中全部有界上下文都被剥离成微服务,此时反腐层就可以被废除了;或者遗留的单体式应用相对较稳定,不再发生变化,重构的投入产出比不再划算;或者遗留的单体式应用关联业务已经退出市场了,系统下线了。

  • 微服务架构新挑战与解决方案

当单体式应用被拆解成多个微服务之后,原先在一个事务边界内的操作现在要跨多个事务边界了,我们如何保证事务的一致性呢?下面是一些分布式事务机制:

  • 再次尝试,最终一致:将每个操作步骤放⼊队列排队,后续再次尝试,确保最后执行成功,状态达成⼀致。

  • 撤销全部操作:补偿事务机制,原事务操作失败之后,启动一个新的事务去撤销之前的操作。如果补偿事务也失败了,那系统需要提供手动或自动再次运⾏补偿事务的功能。

  • 分布式事务:通过一个全局事务管理器来协调各个事务得以成功执行。对于短期事务,通常采用两阶段提交(Two-Phase Commit),第一阶段是投票阶段,分布式事务的参与者告诉事务管理器,判断本地事务是否可以顺利执行。如果事务管理器收集到所有投票结果都是YES,那就开始提交事务执行。

分布式事务机制本身不算太复杂,我们借鉴业界的一些开源产品自研了一套分布式事务框架,跟微服务框架结合起来,应用开发者只需要按照框架的约定实现特定的接口,通过一些注解就可以发起分布式事务,相关细节可以参考阿里的全局事务服务GTS。

当单体式应用被拆解成多个微服务之后,原先集中存储的数据也被分开存储了,报表生成将会遇到新的挑战。在单体式应⽤情况下,通常有一个用于生成报表的从库,从主库同步数据,仅⽤于查询等读操作,避免⽣成报表过程影响主库的读写效率。在微服务情况下,我们将要通过服务调用来获取数据,设计适合报表统计的批量接口,以及增加缓存用于提升数据获取效率。

  • 数据抽取:通过服务调⽤来获取报表所需数据,这会造成非常⼤的负载,以及专⻔为报表设计的API。为了弥补上述不足,我们可以将数据抽取程序独立出来,专门从业务数据库中抽取数据到报表数据库。

  • 事件驱动数据抽取:基于事件驱动的微服务架构,我们可以开发特定事件的订阅者,负责将数据同步到报表数据库,这样可以解耦底层数据库系统。

微服务改造是一个长期过程,这个过程会遇到各式各样的问题,方法论可以帮助我们更好地解决这些问题,并且降低风险。欢迎大家一起探讨微服务改造过程中遇到的任何问题!

(0)

相关推荐

  • .NET Core with 微服务 - 什么是微服务

    今天 以下文章来源于馒哥不光会玩当耐特 ,作者MJZHOU 馒哥不光会玩当耐特这个号主要分享.NET相关知识,但也不光是.NET,也会涉及其他任何技术. 微服务是这几年最流行的架构,说起架构不提微服务 ...

  • 如何通过分解和增量更改将单体迁移到微服务?

    服务迁移不是一个小更改.你必须搞清楚它是否真的能解决你的问题,否则你可能会创建一个会杀死你的.乱糟糟的实体.单体有不同类型,其中一些可能是有效的,足以满足业务需求.单体不是一个应该被杀死的敌人.微服务 ...

  • 如何把单体式应用拆解成微服务?【上】

    微服务是当下最流行的应用架构技术了,它跟容器服务.DevOps合称云时代的三剑客,可以帮我们化解业务发展过快导致的产品迭代压力,让我们可以自由选择最适合团队的技术栈,让系统能够承载互联网海量用户的访问 ...

  • 微服务架构及其最重要的 10 个设计模式!

    性能与架构 431篇原创内容 公众号 来源:Java日知录 软件设计模式是解决软件设计中常见问题的通用.可复用的解决方案.设计模式让我们可以分享通用词汇并使用经实战检验的方案,以免重复造轮子.现在,我 ...

  • 24讲吃透分布式数据库

                 开篇词 开篇词 | 吃透分布式数据库,提升职场竞争力 模块一:分布式数据库的历史演变与核心原理 01 | 导论:什么是分布式数据库?聊聊它的前世今生 02 | SQL vs ...

  • 单体应用到微服务架构转型-实践过程总结

    今天重点谈下传统的单体应用架构朝微服务转型实践过程中遇到的一些问题,具体的解决方法的一些思考,供大家参考. 这篇文章涉及到的项目背景为我们自己的财务共享项目,即原来是一个大单体应用,需要进行微服务架构 ...

  • 微服务的痛:用实际经历告诉你它有多坑(二)

    在前面我们说了微服务的两个痛点:微服务的职责划分和微服务的粒度拆分痛点,这里接着聊剩下的痛点: 一.没人知道系统整体整体架构的全貌 不知道大家有没有碰到过这种情况:每隔几个月或半年,大领导就会发话让我 ...

  • 微服务下的Mock技术-WireMock

    引言 微服务架构下,进行 Restful API 的接口开发和测试工作中,特别是在诸如前后端分离.多个不同系统对接的场景下,对接口进行 Mock 是接口调测的必要手段. 本文就向大家介绍一个非常便于使 ...

  • 微服务下产品集成和集成测试框架流程

    作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践 今天谈下微服务架构下的应用集成和集成测试方面的内容.在微服务架构下,由于传统的的单体应用以 ...

  • 高校微服务渐成体系 挑战&机遇?

    如今,微服务在高校校园中随处可见,从全校范围的虚拟校园卡,到针对特定群体的迎新小程序,正在时刻影响和改变着师生的学习和生活.借助"微小"的应用,提供"极大"的便 ...

  • 微服务实践之分布式定时任务

    承接上篇:上篇文章讲到改造 go-zero 生成的 app module 中的 gateway & RPC .本篇讲讲如何接入 异步任务 以及 log的使用. Delay Job 日常任务开放 ...

  • 一文了解四种软件架构:Serverless架构、微服务架构、分布式架构、单体架构

    如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存.晋升空间.这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面. 一.单体架构 单体架构 ...

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版

    曾宇平 dotNET跨平台 今天 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr ...

  • 去中心化计算的未来:通过 RPC 从微服务过渡到 WASM

    在另外一篇文章<区块链.硬件与面向服务的架构,WASM 即将迎来大爆发?>,里面有绝佳的浏览器内的 WASM 应用程序示例,并辅以了对WebAssembly(Wasm)的详细解释. 但正如 ...

  • 微服务调用链日志追踪分析

    一.技术原理 1.1 背景 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位.主要体现在,一个 ...