《架构师》2016年6月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

热点|Hot

谈谈后端业务系统的微服务化改造

作者 张旭

1.篇首语

业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心。例如,广告业务系统的输入是广告主的投放约束、定向条件,微博业务系统的输入是短文字、图片等。

在应用发展初期或者规模不大的情况下,有非常简单的实现方案,LNMP、JSP、PyWeb都是你能随口说出来的词,如果用某种架构方式来描述,那就可以称做单体模式(Monolithic, Martin Flower大神所提出的,后面还会介绍),而这些技术都是单体模式的成熟解决方案,它们可以使你工作在“应用层”的最顶端,各种中间件、框架能让你省心地干好业务,开发人员可以通过“模块化”的手段来管理业务系统的复杂度,使他们之间解耦、复用。简单来说,这个单体就是如下这种层次划分。

看起来很简单,对吧。诚然,业务系统在这里面还需要做很多,比如缓存、SQL优化、数据分区、系统安全工作,当然还有对于代码的维护和重构。这种工作方式可以很好的工作几年、甚至十年,但是如果业务发展非常快,在系统复杂度、业务规模、参与人数、代码腐化程度都不断上升的情况下,你会发现整个项目正陷于泥潭,PM/RD/QA/OP经常抱怨:

"改个小功能,怎么要拉这么多模块?"

"拉模块也就罢了,改的地方多,编译太慢了。"

"慢也就算了,关键不知道怎么改,这代码太丑陋了,算了,为了满足PM的排期需要,凑合来吧。"

"凑合来了,QA发现bug,返工再返工,延期再延期。"

"上线了,oh my god,报case了,性能有问题,原来是依赖的模块访问数据库用了for循环select。"

透过现象看本质,我总结了来看就这三点问题:

1、业务逻辑复杂耦合,开发维护成本高。

系统复杂度、规模、参与人数都和腐化程度成正比,单纯的靠模块化,后期来看会存在个别模块成为”大怪物“,臃肿不堪,粒度过粗,难以复用。

2、交付效率和质量低。

在敏捷和持续集成方法论、实践大行其道的现今,迭代的按期交付率、单测覆盖率都不尽如人意,线上问题频发。

3、非功能需求不达标。

非功能需求指标特指性能、可用性、可扩展性等方面,代码的腐化和缺少维护、重构,以及没有代码洁癖的人污染下,必然导致性能逐渐下降,甚至出现不同资源竞争的短板效应,造成整个系统crash,同时一个大怪物的伸缩性较差,不能随意横向扩展某个细分功能点。

我想任何人做架构都需要秉承“业务需求决定技术演化路线”的思路,那么这些暴露出来的现状和问题都驱动系统去转型,在系统和人之间找到一种最佳的合作模式,匹配已有的生产力和生成关系。正如软件开发学泰斗Kent Beck所说的:

“Design is there to enable you to keep changing the software easily in the long term”,即“变化发生时设计被破坏的程度”

放眼业界,面对复杂的、大规模的、多人协作完成的业务系统,如何管理好这个复杂度,有很多方法,模块化、OSGI、传统服务化SOA等等,当今最佳实践的趋势还是服务化,而微服务是最近火热起来的概念,有些人肯定觉得这不就是炒作嘛,但是不管黑猫白猫能抓耗子就是好猫,所以解决问题是重点,不要刻意去批评一些名字,那么本文要重点介绍的就是——如何做微服务化转型和改造。

在接下来讲之前,要重点声明,本文并不是推崇服务化,不鼓励单体模式,相反而是相当肯定和支持单体模式,它模块依赖简单、一个发布包、部署于一个容器都使得构建应用非常的简单,在体量还不大的情况下,首先应该解决的是搭建好一套绝对稳定的基于模块化的平台,待体量逐渐长大,再去根据实际需要进行拆分,团队也随之变化(facebook的单体持续了非常长的时间,一是人员素质高,二就是基础平台建设的非常好)。再下个阶段体量大到饱受单体模式之苦,也应该先建设平台化服务,建设好之后,先按照大的粒度进行拆分,逐步再微服务化,否则,直接上服务化、甚至下面要说的微服务都是非常危险的,鲜有成功案例。