考虑把大型项目拆解成微服务吗?

标签: tuicool | 发表时间:2016-12-15 08:00 | 作者:
出处:http://itindex.net/admin/pagedetail

【编者的话】本文理性的讨论了拆解大型项目到微服务的过程,讨论了拆解过程中会遇到的问题和编程语言的选择,并给出了作者自己的建议。

微服务是处理臃肿、凌乱系统的一剂良药。然而,拆解一个大型项目为一系列的微服务所付出的代价是值得的吗?现在存在一些优点和缺点,那么微服务的哪些特点吸引了众多公司和开发人员呢?

最常见的应用场景是将一个大型系统切换到基于微服务的基础设施。我倾向将这个过程称为“分解”应用程序,因为我们把紧耦合的代码分解成多个小的服务。这包括了从仅添加一两个微服务到完全重构主要应用程序到微服务架构。

简而言之,我相信分解一个大型系统为微服务组合是值得的。然而,这是一个长期投资,可能需要一段时间才能得到回报。每个项目或公司在这一过程中都会有不同的经验和教训。这里有一些共同的主题,它们也是我最近在分解大型项目到微服务过程中遇到的。

放慢节奏

在开发软件的过程中,我们通常切分大型的任务为小的部分,便于一步一步实施。采用微服务时,与这个过程非常相似。我们需要分解大的项目为一系列的微服务。很多方面,我们像堆砌木桩一样处理它们:我们需要随时间的推移而添加组成部分,将项目分解成丰富且有用的多个组成部分。

当你首次介绍微服务思想给开发团队时,可能他们会很容易接受。微服务是开发社区中的发展趋势,于是人们都渴望试一下。更夸张的趋势甚至会变成“能够改变app中一个功能而不影响其他200项功能,这不是很棒么?”

然而,实现松耦合和独立应用的过程远不止两周。可能需要花费数个月甚至数年来解耦合你的应用程序到不同的功能服务。

将项目分解作为一项长期的任务是非常重要的。客户和投资者并不在意你是否将已有的功能拆分为微服务。他们只是关心是否你在如期地产出。当已经感受到微服务架构的威力,你和你的团队需要推动其发展。同样,这也是一种技术债务。

这也就是为什么需要花费时间去解体大型项目。把拆解项目作为一个长期项目的时候,可能需要花费多年时间才能得到相应的收益。每一部分代码的拆分都应该作为一个重要决定。在你拆解速度过快时,可能会产生严重的问题。

自由通常不是免费的

微服务架构可以采用不同的开发语言和框架实现。微服务限制一组有限的编程语言来共享应用程序,允许开发人员使用,并且只能用这些。

对于开发者来说,这可以引出很多非常激动人心的决定。但是,你可能希望在选择一门新编程语言或者框架来实现微服务时有所收敛。

学习新的编程语言或者框架对于个人经验来讲是非常有帮助的。同时开发者也很有兴趣去学习。尽管我可能满足于采用某些语言和框架来创作自己的私有项目,但是,在生产环境这个场景下,可能是完全不同的情况。

你和你的同事可能觉得用Rust语言写个服务是个好主意。从纸面上来讲,这个主意看上去很好。你可以用一个非常棒的语言去实现,同时让你的业务达到一个更好的境地。

值得注意的是,在你的团队和同事在实现它的时候,没有什么是一成不变的。团队生产是一件取决于你是否要去选择的事情。目前,你的公司可能具备资源和技能去采用Rust来创造一个高效的微服务。但是,你的团队是否会在Rust服务上进行持续投入?这依赖于在微服务上的投入,你可能发现自己已经完全归属在微服务上了。

当你选择一门编程语言,你其实是在抉择未来是否继续投入。抛开你当前团队的规模和状态的情况下,最差的情况是你可能朝着一个令人沮丧的方向并且浪费了大量的开发资源。

DevOps的负担

当你决定去拆分一个项目时,我强烈推荐增加在DevOps上的投入。微服务的显著特点是他们在持续部署上的稳定。这里面还有很多其他的说法。当服务准备完毕时,微服务使你可以快速的部署。这对于部署过程是非常好的,因为你不需要重新部署一整套应用。

这只是理论上的情况。

事实上,创建和维护的服务越多,部署环节自然会越多。你需要能够在有限时间内有效的部署多个服务。如果只有有限个开发人员培训过部署方式,事情可能会失控。

这就是为什么要教会开发者具备从开发到部署代码的能力。理想情况是,他们可以便捷的部署代码并监控。他们还应该具备突发情况下部署和掌控服务的能力。此外,开发者应该熟悉微服务及对常规生产环境故障的感知力。我经历过许多的部署错误,如果开发人员熟悉这些故障,解决起来会更快。这可能是几秒钟宕机到几分钟宕机的差别。

此外,这个事情的复杂度可能会因为稳定性和语言多样性而加重。再次重申一下,并不是所有的新语言和框架在部署上像其在开发上那么方便。明智的选择是在承担较小风险的同时,采用较先进的语言和框架,毕竟它们可能不是为生产环境而准备的。

结束语

分解一整个项目会带来很多可变化的部分。解决这件事情的关键是让团队提高效率,并计划好自己的时间。他们需要时间来实现新特性和修复,同时采取有效措施拆解应用程序。

采用微服务,你可以自由选择编程语言或者框架。这种自由度是非常令人兴奋的,但是不要陷入到追求最前沿的陷阱里,毕竟生产环境需要的是稳定。

同样,在分解项目过程中,DevOps带来了另一种复杂性。收获的优势没有在每次的重新部署中发挥出来。然而,这需要更多的支持和对部署过程中新增服务的所有权。

我非常确信分解一个大型项目到微服务的过程是值得的。然而,这是一个长期的投资,可能需要一段时间才能收到回报。

原文链接: So You’re Thinking of Decomposing Your Monolith into Microservices(翻译:陈杰)

===================================================

译者介绍

陈杰,BOSS直聘app的数据工程师,工作重心为基于用户行为的数据推荐,平时也乐于去实现一些突发的想法。在疲于配置系统环境时发现了Docker,跟大家一起学习、使用和研究Docker。

相关 [考虑 项目 微服务] 推荐:

考虑把大型项目拆解成微服务吗?

- - IT瘾-tuicool
【编者的话】本文理性的讨论了拆解大型项目到微服务的过程,讨论了拆解过程中会遇到的问题和编程语言的选择,并给出了作者自己的建议. 微服务是处理臃肿、凌乱系统的一剂良药. 然而,拆解一个大型项目为一系列的微服务所付出的代价是值得的吗?现在存在一些优点和缺点,那么微服务的哪些特点吸引了众多公司和开发人员呢?.

Blog: 考虑所有微服务的脆弱性并对其行为进行监控

- - Kubernetes – 生产级别的容器编排系统
作者:David Hadas (IBM Research Labs). 译者:Wilson Wu (DaoCloud). 本文对 DevOps 产生的错误安全意识做出提醒. 开发和配置微服务时遵循安全最佳实践并不能让微服务不易被攻击. 本文说明,即使所有已部署的微服务都容易被攻击,但仍然可以采取很多措施来确保微服务不被利用.

一个宝藏级微服务开源项目,是真的牛批!

- - 掘金 后端
前几天有粉丝留言,正在学习微服务,想让我推荐一个微服务学习项目. 这次我拿出了压箱底的收藏了,一个宝藏级微服务开源项目,炸裂. zheng项目不仅仅是一个开发架构,而是努力打造一套从  前端模板 -  基础框架 -  分布式架构 -  开源项目 -  持续集成 -  自动化部署 -  系统监测 -  无缝升级 的全方位J2EE企业级开发解决方案.

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.

谈微服务架构

- - 人月神话的BLOG
其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是本质还是紧耦合的,这关键的一个判断标准就是如果要将原有的业务系统按照模块分开部署到不同的进程里面并完成一个完整业务系统是不可能实现的.

微服务性能模式

- - 互联网 - ITeye博客
前言:基于微服务系统越来越普遍. 下面我们就来看看五种常见的特定微服务性能的挑战,以及如何应解他们. 背景:在IT界微服务架构为基础的系统越来越多, 每一个应用系统都集成了不同的组件和服务,几乎所有的特定业务应用程序都需要集成一个或更多的应用服务. 但是一个综合性系统集成不同的服务这无疑是一个巨大的挑战.

微服务与架构师

- - 乱象,印迹
因为工作的关系,最近面试了很多软件架构师,遗憾的是真正能录用的很少. 很多候选人有多年的工作经验,常见的框架也玩得很溜. 然而最擅长的是“用既定的技术方案去解决特定的问题”,如果遇到的问题没有严格对应的现成框架,就比较吃力. 这样的技能水平或许适合某些行业,但很遗憾不符合我们的要求. 软件架构师到底应该做什么,又为什么这么难做好,这都是近来的热门问题,我也一直在和朋友们讨论.

从Excel到微服务

- - 乱象,印迹
Excel很老,Excel很土,Excel一点也不sexy;微服务新,微服务很潮门,微服务很高大上. 那么,Excel和微服务有什么关系. 上个月看了篇文章,The Unbunlding of Excel. 作者认为,对于初创公司(尤其是非“纯IT”初创公司)来说,Excel几乎包办各种工作. 想做轻量级的CRM,可用Excel.

微服务拆分之道

- - DockOne.io
微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会. 在做微服务的路上,拆分服务是个很热的话题. 我们应该按照什么原则将现有的业务进行拆分. 接下来一起谈谈服务拆分的策略和坚持的原则.

微服务之saga模式

- -
你已经使用 database ber service 模式. 每个service拥有自己的database. 一些业务事务会跨越多个service,所以你需要来确保data consistency. 例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务.