返回顶部
首页 > 资讯 > 精选 >如何把单体式应用拆解成微服务?【上】
  • 525
分享到

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

2023-06-05 03:06:59 525人浏览 泡泡鱼
摘要

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

微服务是当下最流行的应用架构技术了,它跟容器服务、devops合称云时代的三剑客,可以帮我们化解业务发展过快导致的产品迭代压力,让我们可以自由选择最适合团队的技术栈,让系统能够承载互联网海量用户的访问,让我们可以更加轻松地运维大型的互联网系统。近些年在厂商、社区和用户等各方努力推动下,微服务相关的理论和产品都日趋成熟,不同语言的微服务开发及治理套件(例如:spring cloud/dubbo等)让我们从零开始搭建微服务变得非常简单快捷,那我们是否就此可以全面进入微服务时代呢?

微服务的演进成熟需要时间,我们熟悉掌握这套新技术也需要时间,除此之外机房里面还跑着大量的单体式应用,它们需要继续维护和升级,任何时候我们都不可能抛开历史轻松上阵。这些单体式应用还担负着公司的核心业务,全部推倒重来、休克式重构是不可取的,投入大周期长,风险完全不可控。我们必须学会边行车边换胎的技能,在不影响现网业务的前提下推动微服务改造,让老系统焕发新的生命力,继续支持业务下一个十年的发展。本文将跟你一起探讨微服务改造相关的经验方法,让你更加从容地拥抱微服务!

1. 边行车边换胎三步走演进策略

如何从单体式应用演进至微服务呢?这些单体式应用都存在很长时间了,经过这么长时间的修修补补,体量规模都比较大,尤其是经过几波人交接维护,业务逻辑也变得异常复杂。同时,它们都在线对外提供服务,全部推倒重建的可能性微乎其微,休克式重构投入大周期长,风险也不好控制,还会影响业务对外服务的连续性。从现实情况出发,最可行的架构优化方案就是渐进式的微服务改造,按照业界的最佳实践和个人经验,该演进策略主要包括三个关键步骤:

  • 将所有新特性都构建成微服务,遏制单体式应用的生长;

  • 在微服务和单体式应用之间构建反腐层,防止老系统腐化新系统;

  • 按照特定的优先顺序由外而内逐步瓦解单体式应用。

1.1 新建微服务

通常单体式应用所采用的技术相对较老旧,维护这些系统的同事缺少机会学习实践当前主流的技术,久而久之就跟不上主流技术的发展,在晋升、加薪和跳槽时都缺乏竞争力,这会影响到个人的价值。随着系统规模越来越庞大,更新升级和运营维护的难度越来越大,每次发版都要加班加点和心惊胆战,逐渐满足不了业务快速发展的需要。在单体式架构之下,团队无法利用不同技术栈的优势解决不同场景下的问题,即使解决了问题也是事倍功半。

当意识到有必要将单体式应用改造成微服务时,我们通常会认为改造就是将单体式应用一块一块地敲下来改成微服务,这种想法是最直接的,但难度和风险也是最大的。改造初始我们对微服务相关技术也比较生疏,再加上拆解单体式应用本身的难度,双重困难叠加往往会导致改造失败或延期。

最靠谱的策略是先停止往单体式应用里面添加新的特性,所有新特性都构建成微服务,从而遏制单体式应用继续生长。新特性通常不会太复杂,新建微服务也要比从单体式应用上剥离微服务容易一些,借助这个过程让团队逐渐熟悉掌握微服务技术栈,从小规模练兵再到全面铺开。常见的微服务架构如下图所示,主要包含以下几大必备组件:

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

  • 注册中心,提供微服务的注册、发现和状态监测等功能;

  • 配置中心,解耦代码与配置,通过统一的远程配置中心管理每个微服务的配置数据,支持动态修改和立即生效等;

  • 治理中心,依赖注册中心和配置中心,提供服务降级、服务熔断、流量控制、灰度管理等功能;

  • api网关,将每个微服务汇聚一起对外提供服务,网关本身会提供安全鉴权、服务路由、流量控制、计量计费等横切面功能。

1.2 构建反腐层

新特性全部构建成了微服务,但老特性还依旧在单体式应用当中,许多业务还需要新旧系统彼此协作才能完成,那么微服务和单体式应用之间还存在彼此交互。但新旧系统对外服务时所采用的协议可能不同,例如:采用spring Cloud框架开发的微服务主要以RESTful Http API对外服务,采用Dubbo框架开发的微服务以Dubbo协议对外服务,而单体式应用可能以WEB Service、EJB T3、不规范HTTP API等形式对外服务。除了协议不同之外,新旧系统对领域模型的定义也可能不同,包括名称和属性等,如何调和微服务和单体式应用的不同呢?

在微服务和单体式应用之间构建一道反腐层,这或许是最切实可行的办法。通过反腐层完成新旧系统的对接集成,又可以避免旧系统领域模型对新系统的干扰,让彼此保持松耦合状态,阻止旧系统的腐烂蔓延至新系统。反腐层还可以对单体式应用进行服务化封装,让其像微服务一样以RESTful HTTP API的方式对外服务。反腐层支持双向通讯,重点解决新旧系统对接集成、协议适配和模型转换等问题,按照此功能定位我们可以将反腐层划分成三个模块:

  • 外观(Facade),经典设计模式,作为旧系统所有服务接口的门面,简化新旧系统对接的复杂度;

  • 适配器(Adapter),经典设计模式,向新系统提供所需的服务实体,负责请求和应答的协议适配;

  • 转换器(Translator),负责请求和应答中新旧系统领域模型的转换。

由于单体式应用的架构较为简单,因此在设计之初它们很少考虑系统集成相关的设计,通常一个应用下的不同服务拥有各自的入口,外观(Facade)就是解决此问题的,统一单体式应用对外服务的格式,像微服务一样以RESTful HTTP API的方式对外服务,规范接口的协议类型、URL命名和报文格式等。如果旧系统不属于我们维护,那反腐层就需要包含Facade模块,微服务通过它对接旧系统。如果旧系统也是由我们自己维护,那建议将Facade模块构建在单体式应用内部,微服务通过Adapter模块对接旧系统。

1.3 围剿单体式应用

在旧系统周边构建微服务,遏制旧系统的不断生长,然后再从旧系统逐步剥离出微服务,最后完成对单体式应用的绞杀。优良的微服务设计同样遵循高内聚、低耦合原则,将关联紧密的行为封装进一个微服务当中,从而可以减少需求变更所影响的范围。只要服务契约不发生改变,那对单个微服务的升级改造都不会影响到其他服务,因此可以发布更少的服务来快速地满足业务需求,并降低同时部署多个微服务时带来的风险。在从单体式应用剥离微服务之前,我们先看看功能模块之间的边界有哪些类型:

  • 技术边界:将系统按照技术栈的不同划分,形成两个部件的边界。它们所采用的技术大相径庭,对开发人员的技能要求不同。业界将此种架构叫做洋葱架构,拥有许多水平分层,不利于改造成微服务。

  • 地域边界:按照组织分布的地域划分,相对较容易改造成微服务。

  • 业务边界:按照业务类型划分,最适合作为微服务的边界类型。

领域驱动设计(DDD)理论提出了有界上下文(Bounded Context)概念,这是我们厘清服务边界的有效工具,我们可以借助它从单体式应用上剥离微服务。因此,单体式应用的微服务化改造,亦或新建微服务,我们都离不开业务专家的支持,通过他们确定有界上下文的划分,从而设计出好的微服务。

2. 隔离网关接管新旧系统间交互

在前面章节中我们已经知道在微服务改造过程中需要构建反腐层,那在实际项目当中反腐层会以什么样的形态存在呢?通常我们会将反腐层设计成隔离网关,以单独的进程运行,在隔离网关内部实现Facade、Adapter和Translator等功能模块。隔离网关不需要从零开始建设,我们可以在Nginx、Kong、Zuul等开源中间件基础上扩展,它们都支持插件化或过滤器等扩展定制模式,我们很容易实现反腐层需要的功能。

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

通过反腐层(隔离网关)微服务可以与单体式应用进行正常通信,同时彼此之间保持松耦合,单体式应用可以不用做伤筋动骨地改动,微服务可以采用最新的技术独立演进,但这种方案下这些遗留的单体式应用是无法享受到云原生带来的好处。有没有一种方案可以让这些遗留系统也享受到服务发现、流量控制、服务熔断、服务降级等新特性呢?

Service Mesh,下一代微服务架构,可以给我们带来更加完善的解决方案,它将原先通过微服务开发框架(例如:Spring Boot等)侵入到应用内部的服务治理等功能模块封装进了Sidecar,与应用结对部署,作为独立的进程存在,这样可以做到与应用松耦合,架构上更加灵活,可以支持微服务治理相关基础设施的独立升级部署,还可以支持多语言。如果在Sidecar基础上再扩展隔离网关的功能,那遗留的单体式应用也可以更加融入微服务架构了。

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

3. 单体式应用拆解微服务的方法

本章节我们将梳理从单体式应用剥离微服务的一些常见场景和方案。在谈具体案例之前,我们有必要先了解一下业界最佳实践的经验总结,它主要包含以下几个基本步骤:

  • 识别出某个业务板块的上下文边界,这是拆解单体式应用的关键步骤。微服务是按照业务来划分和组织的,在动手拆解之前先要理清当前一个单体式应用提供了哪些业务功能,例如:用户管理、商品展示、支付管理和物流管理等,按照垂直方向划分出来的功能板块都可以改造成微服务。具体操作时大部分编程语言都提供了命名空间(NameSpace)特性,我们在重构过程中可以借助它将同一个上下文相关的代码归集在一起,然后从整个工程中将其拆解出来形成微服务。

  • 厘清业务功能模块之间的依赖,尽量减少依赖关系,从变化频繁、投入产出比高的模块开始剥离,这样可以逐步缓解日常开发的进度压力。经过依赖关系的梳理,冗余的依赖将会被消除,剩下的依赖将会从进程内部的函数调用改造成进程之间的RESTful HTTP API调用。

  • 拆解数据,包括数据访问层和数据库表等。除了代码,数据也要被拆解,数据访问层要被打散到不同的命名空间当中,数据库表之间的外键依赖需要被清理消除等。

从业务开始,再到代码,最后才是数据,这就是上述三个步骤的关键。业务是所有代码和数据的源头,面向对象设计(OOD)和领域驱动设计(DDD)是做好微服务设计的专业技能,而用好这两项技能的前提就是对业务有深刻的洞悉,在(下)篇中我们将一起来看看具体的拆解场景,敬请期待!

原创不易,请动动手指点个「 赞 」哦,后续我会持续分享职业规划、应聘面试、技能提升、影响力打造等经验, 关注「 IT老兵哥 」,赋能程序人生 !

--结束END--

本文标题: 如何把单体式应用拆解成微服务?【上】

本文链接: https://lsjlt.com/news/241099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何把单体式应用拆解成微服务?【上】
    微服务是当下最流行的应用架构技术了,它跟容器服务、DevOps合称云时代的三剑客,可以帮我们化解业务发展过快导致的产品迭代压力,让我们可以自由选择最适合团队的技术栈,让系统能够承载互联网海量用户的访问,让我们可以更加轻松地运维大型的互联网系...
    99+
    2023-06-05
  • 微服务架构:拆分单体应用的难点
    拆分单体应用为服务的难点从表面上看,通过定义与业务能力或子域相对应的服务来创建微服务架构的策略看起来很简单。但是,你可能会遇到几个障碍:网络延迟。同步进程间通信导致可用性降低。 在服务之间维持数据一致性。获取一致的数据视图。上帝类...
    99+
    2023-06-05
  • 如何分解单体式数据库以实现微服务
    这篇文章主要讲解了“如何分解单体式数据库以实现微服务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何分解单体式数据库以实现微服务”吧!按服务模式的数据库在...
    99+
    2024-04-02
  • Vue单页式应用Hash模式下如何实现微信分享
    这篇文章将为大家详细讲解有关Vue单页式应用Hash模式下如何实现微信分享,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:前端微信分享的基本步骤:一.绑定域名:先...
    99+
    2024-04-02
  • 微服务模式如何提高云应用的可扩展性?
    随着云计算技术的发展,微服务架构已经成为了云应用领域的一种重要架构模式。在微服务架构中,应用被划分为多个服务,每个服务都可以独立部署、独立维护,并且可以通过 API 进行通信。这种架构模式的优点在于它能够提高系统的可扩展性、可靠性和可维护性...
    99+
    2023-05-16
    微服务 可扩展性 云应用
  • Java在Excel单元格中如何应用一种/多种字体样式
    这篇文章主要介绍Java在Excel单元格中如何应用一种/多种字体样式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Excel表格中,设置单元格字体样式时,可以对单元格内的所有字符应用同一样式,即获取指定单元,应用...
    99+
    2023-06-02
  • MongoDB如何与微服务架构集成使用
    MongoDB可以与微服务架构集成使用,通常采用以下几种方式: 使用MongoDB作为微服务架构中的数据存储服务:在微服务架构中...
    99+
    2024-05-07
    MongoDB 微服务
  • 如何把自己的电脑变成云服务器使用
    云计算技术的优势有很多。首先,云计算可以为用户提供快速、低成本的数据存储和处理服务。用户可以将自己的数据存储在云服务器上,不需要购买昂贵的硬件设备或维护自己的服务器。云服务器可以提供高速、可靠的数据存储和处理服务,使用户可以随时随地访问自己...
    99+
    2023-10-28
    自己的 服务器 电脑
  • Android应用中如何集成地图服务
    要在Android应用中集成地图服务,可以使用Google Maps API或者其他地图服务提供商的API。以下是集成地图服务的一般...
    99+
    2024-04-03
    Android
  • 如何在 Windows 上部署 Python 分布式系统并集成 JavaScript 应用?
    在当今互联网时代,分布式系统已成为不可或缺的基础设施之一,而 Python 和 JavaScript 作为两种最受欢迎的编程语言之一,也成为了分布式系统开发的主流语言。在本文中,我们将介绍如何在 Windows 上部署 Python 分布...
    99+
    2023-08-21
    分布式 javascript windows
  • 如何用Eureka + Feign搭建分布式微服务
    目录EurekaFeign创建父项目注册中心主要依赖配置文件主类服务提供者主要依赖配置文件主类及Controller客户端主要依赖配置文件主类、Controller及Feign映射E...
    99+
    2024-04-02
  • 上网DNS服务器未响应如何解决
    出现上网DNS服务器未响应的问题,可以尝试以下解决方法:1. 重启路由器和计算机:将路由器和计算机重新启动可以清除可能的临时故障和缓...
    99+
    2023-08-25
    DNS服务器 服务器
  • 华为终端云服务的应用体验如何?
      PS:我的手机总爱丢,这心大的性格是改不了了,有没有什么好用的功能在手机丢了的时候能找到?从小到大已经换了好几个手机了,懂机的可以说说,求指导!   ...
    99+
    2015-01-14
    华为终端云服务的应用体验如何?
  • 如何卸载云服务器上的应用
    Windows系统云服务器如何卸载应用:首先,远程连接服务器,进入服务器操作界面;进入到服务器操作界面后,在开始菜单栏中,点击控制面板;在控制面板中,选择“程序”选项;最后,在程序选项页面中,选取要卸载的程序和软件,右键卸载即可;...
    99+
    2024-04-02
  • 微服务架构如何解决应用状态的管理问题?
    随着应用的不断发展和扩展,应用状态管理问题也变得越来越复杂和困难。传统的单一应用架构难以应对多个模块和组件的管理问题,而微服务架构则为解决这些问题提供了有效的解决方案。微服务架构是一种基于一些小型服务的架构,这些服务都可以独立运行并进行相互...
    99+
    2023-05-18
    微服务架构 应用状态 管理问题
  • Nodejs如何把接收图片base64格式保存为文件存储到服务器上
    这篇文章主要为大家展示了“Nodejs如何把接收图片base64格式保存为文件存储到服务器上”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nodejs如何把接收...
    99+
    2024-04-02
  • 如何在 Apache 服务器上运行 Java Web 应用?
    Apache服务器是一款常用的Web服务器软件,Java Web应用是一种常见的Web应用类型。本文将介绍如何在Apache服务器上运行Java Web应用。 一、安装Apache服务器 首先,你需要安装Apache服务器。在Ubuntu...
    99+
    2023-06-17
    开发技术 linux apache
  • 如何在服务器上部署Node.js应用程序
    这篇文章主要介绍“如何在服务器上部署Node.js应用程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何在服务器上部署Node.js应用程序”文章能帮助大家解决问题。步骤1:选择服务器首先,您需...
    99+
    2023-07-05
  • 如何解决feign微服务间的文件上传报错问题
    本篇内容介绍了“如何解决feign微服务间的文件上传报错问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!A微服务调用B服务的上传文件接口报...
    99+
    2023-06-20
  • 讲解如何利用 Python完成 Saga 分布式事务
    目录1、分布式事务2、SAGA3、SAGA 实践4、处理网络异常5、处理回滚6、小结 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作