如何用微服务重构应用程序

在决定使用微服务之后,为了将微服务付诸实践,也许你已经开始重构你的应用程序或把重构工作列入了待办事项清单。

无论是哪种情况,如果这是你第一次重构应用程序,那么您和您的团队必将在某个时刻面临一个显而易见的问题:如何重构应用程序以实现微服务?

这也正是这篇文章要思考和探讨的。

重构基础

在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的。以下两个要点将会对任何微服务重构策略产生重大影响。

重构=重新设计

将一个单体式的应用程序重构为微服务,与重新设计一个基于微服务的应用程序, 有着本质区别。也许您更倾向于摒弃旧的应用程序(特别是面对杂乱无序的旧应用程序,这些应用程序在补丁修改和加固补充方面带来了沉重的技术债负担),制定一套新的需求, 并从零开始创建一个全新的应用程序,直接在微服务级别工作。

正如Martin Fowler在这篇文章中所指出,在微服务级设计一个新的应用程序可能不是一个好主意。Fowler的分析中最重要的一点是,在移动到基于微服务的架构时,从现有的单体式应用程序开始可以真正发挥微服务的优势。(文章链接:https://martinfowler.com/bliki/MonolithFirst.html)

通过现有的单体式应用程序,您可能会清楚地了解各种组件如何协同工作,以及应用程序如何作为一个整体运行的。而令人惊奇的是,从单体式的应用程序开始,您可以更深入地了解微服务之间的界限。通过观察他们是如何协作的,您可以更容易地看到,某个微服务能够独立于另一个微服务。

重构并不通用

对于重构,不存在一种适用一切的通用性方法,您所做的设计选择,从整体架构到代码级,都应考虑到应用程序的功能、运行条件以及开发平台和编程语言等因素。例如,您可能需要考虑代码打包—如果您正在使用Java,则可能涉及从大型企业应用程序存档(EAR)文件(每个文件可能包含多个Web应用程序存档(WAR)软件包)转移到单独的 WAR文件。

一般重构策略

以上是我们介绍的高层次考虑因素,现在让我们来看看重构的实现策略。对于现有的单体式应用程序进行重构,有三种基本方法。

增量

通过此策略,您可以逐个重构应用程序。随着时间的推移,这些组件通常是大规模的服务或相关服务组。要成功做到这一点,首先需要确立应用程序中的大范围边界,然后针对这些边界定义的单元进行重构,一次一个单元。您将持续不断地把每个大区域移动到微服务中,直到最终没有原始应用程序为止。

大变小

“大到小”策略在许多方面都是对增量重构基本主题的变体。然而,在大到小的重构中,您首先要将应用程序重构为单独的、大规模的、“粗粒度的”(使用Fowler的术语)块,然后逐渐将它们分解成更小的单元,直到整个应用程序被重构为真正的微服务。

此策略的主要优点是,它允许您稳定重构单元之间的交互,然后将它们分解为下一级,并在您开始下一轮重构之前,让您更清晰地了解较低层服务之间的边界和交互。

批量替换

通过批发更换,您可以一次性重构整个应用程序,直接从单体式转移到一组微服务器。它的优势在于,它允许您从顶层架构下进行重新设计,为重构作准备。虽然这一策略与微服务不一样,但它确实与微服务有着相同的风险,特别是当它涉及到广泛的重新设计时。

重构中的基本步骤

那么,将一个单体式应用程序重构为微服务的基本步骤是什么?有几种方法可以打破这个流程,但对于大多数重构项目来说,以下五个步骤是(或应该)通用的。

(1)准备工作

迄今为止我们所讨论的大部分是准备工作。要牢记的要点是,在重构现有的单体式应用程序之前,大架构以及要进行重构的基于微服务的版本的功能应已就绪。在重构时试图修复功能失调的应用程序,这只会使两项工作更加困难。

(2)设计:微服务域

在大规模、应用广泛的架构之下,您需要在重构之前制定(并应用)一些设计决策。特别是,您需要考虑哪种微服务组织形式最适合您的应用程序。组织微服务最自然的方式通常是进入基于通用功能、使用或资源访问的域:

  • 功能域。相同功能域内的微服务执行一组相关功能,或具有相关性的职责。例如,购物车和结帐服务可以包含在相同的功能域中,而库存管理服务将占用另一个域。
  • 使用域。如果您通过使用破解您的微服务器,那么每个域将围绕一个用例,或者更常见的,一组相互关联的用例。用例通常围绕用户(个人或其他应用程序)采取的一组相关行动,例如选择购买商品或输入付款信息。
  • 资源域。访问相关资源组(如数据库、存储或外部设备)的微服务也可以形成不同的域。这些微服务通常会处理这些资源与所有其他域和服务的交互。

请注意,在给定的应用程序中,三种组织形式都可能都存在。如果有一个总体规则,那么简单地说,您应该在它们最适合的时间和地点应用它们。

(3)设计:基础设施和部署

此步骤非常重要,但却很容易被视作事后再来考虑的问题。您正在将一个应用程序转换为一种非常动态的微服务群,通常在容器或虚拟机中,并由可能由多个应用程序组合的基础架构部署、编排和监控。此基础架构是您应用程序架构的一部分; 它可能(并且可能会)接管以前在单体式应用程序中由高级架构处理的一些职责。

(4)重构

这是您将应用程序代码实际重构为微服务的一个重点。确立微服务边界,识别每个微服务候选项的依赖关系,在代码和单元架构级别上进行必要的更改,以便它们可以作为独立的微服务来容纳,并将其封装在容器或VM中。这不会是一个没有问题的过程,因为在主要应用程序的规模上重写代码非常不易,但是,只要准备充分,您遇到的问题就更有可能局限于现有的代码问题。

(5)测试

当您进行测试时,您需要在基础架构(包括容器/ VM部署和资源使用)级别以及整体应用级别上查找微服务和微服务交互级别的问题。通过使用基于微服务的应用程序,所有这些都很重要,每个应用程序都可能需要自己的一套测试/监视工具和资源。当您发现问题时,了解什么级别的问题应该被处理是非常重要的。

结论

对微服务的重构可能需要下些功夫,但这并不难。只要您能做好准备,并清楚地了解所涉及的问题,您就能有效地重构您的微服务应用,而无需从头到尾重新设计。

时间: 2024-10-11 21:31:02

如何用微服务重构应用程序的相关文章

解析微服务架构(三):微服务重构应用及IBM解决方案

解析微服务架构系列文章将分几篇描述微服务的定义.特点.应用场景.企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型. 上一篇文章介绍了融入微服务的企业集成架构的演进,并介绍交互式系统的微服务模式及技术决策例子. 本篇文章将介绍已有IT应用如何进行微服务重构的转型,以及IBM微服务相关解决方案的介绍. 微服务转型 采用微服务架构意味着以更复杂的运维环境为代价,实现更高速的应用交付及更快推出市场.因此企业需要在更快的交付与更复杂的运维之间进行权衡.

【CHRIS RICHARDSON 微服务系列】使用微服务重构单体应用-7

编者的话 |本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的最后一篇.第一篇介绍了微服务架构模块,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务的不同方面,包括使用 API 网关.进程间通讯.服务发现.事件驱动的数据管理,以及部署微服务.本篇将讨论从单体应用迁移到微服务的策略. 作者介绍:Chris Richardson,是世界著名的软件大师,经典技术著作<POJOS IN ACTION>一书的作者,也是 cloudfoundry.com 最初的创始人

微服务-分解应用程序从而实现更好的部署特性及可伸缩性

本文是我翻译INFQ上的一篇文章.作者Chris由简入深的讲解了微服务的来龙去脉.使用场景.优势劣势.以及现有技术栈向微服务架构的重构步骤.是一篇微服务主题的不可多得的好文. 原文地址:http://www.infoq.com/articles/microservices-intro?utm_source=infoq&utm_medium=popular_links_homepage#.U4-QbLLNKmI.gmail 微服务:分解应用程序从而实现更好的部署特性及可伸缩性 本文描述了越来越受欢

微服务架构(Microservice Architecture)

之前一段时间,有听部门架构说起接下来公司要使用微服务架构来研发系统,当时没怎么在意,因为是第一次听说微服务这个名词(果然无知者无畏啊):正好赶上五一假, 我自告奋勇的,接了编写微服务架构培训文档这个任务(也许因为我是文科生,文笔稍微好点).五一假期三天,基本都是在看资料,梳理思路以及编写接下来的培训文档中度过. 下面,就说说我这几天的一些收获吧:先说说资料来源吧:有架构给我的一些资料,以及自己百度和论坛.社区找来的一些资料,权当做一个总结式的简介... 目录如下: 一.微服务架构介绍 二.出现和

怎么用API网关构建微服务

选择将应用程序构建为微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组端点.而在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应用程序之间的通信有什么影响,并提出一种使用API网关的方法. 当选择将应用程序构建为一组微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组(通常是重复的.负载均衡的)端点.然而,在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应

SOA和微服务架构的区别?

知乎用户 289 人赞同了该回答 谢多人邀请,其实前面几位的回答已经差不多了,在这里仅谈下自己的简单总结. 微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套.在这里我们不用组件而用小应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴露的服务,同时自身

【微服务干货系列】使用微服务架构之前,你必须知道的

正如敏捷之父MartinFowler所说的那样,单体架构和微服务并非简单的二选一,两者都是模糊的定义.这就意味着大多数系统都将在一个模糊的边界区域.非常多开发团队已经认识到微服务架构比单体架构更优越.可是也有其它团队感觉到这是一种消弱生产力的负担,就像不论什么软件架构,微服务架构相同有利弊.为了能做出一个明智的选择.你必须了解这些应用并将它们运用到你特定的环境中. 微服务的"定义" 假设须要准确的给微服务下一个定义,抱歉,笔者找了非常长时间,也没有一个准确的定义,最接近微服务的定义来自

微服务和SOA的区别

SOA和微服务架构的区别? 微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多 个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从 前端web ui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套.在这里我们不用组件而用小 应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴 露的服务,同时自身也将自身的能力朝外部发布为服务. 如果一句话来谈SOA和微服务的区别,即

从 Spring Cloud 开始,聊聊微服务架构实践之路

[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数据和接收用户输入的数 据,为用户提供一种交互式操作的界面,平台所使用