文/王健
最近几年,微服务架构异军突起,与容器技术相辅相成,成为架构设计领域热议的话题。而《技术雷达》作为ThoughtWorks出品的一份关于技术趋势的报告,在技术社区也一直有着非常好的口碑。本篇文章就试图结合技术雷达与微服务架构,以往期技术雷达中微服务架构的演变来审视一下这个新兴架构的整个发展过程。
相信大家了解微服务架构或者听说微服务架构也都是近两年的事情,从Google Trends的搜索数据统计上看,微服务架构确实也是从2014年才逐渐兴起,到目前呈现出一个爆发的趋势。
但技术雷达在2012年的3月份就已经提及了微服务架构相关的内容,在当时,其所处的状态还是评估(Assess)阶段,这就说明技术雷达早在2012年初的时候就已经成功捕获到微服务架构这个新的技术架构。
(微服务2012年第一次出现在技术雷达上)
到底什么才是微服务架构,Martin Fowler在那篇著名的描述微服务架构的文章中第一次定义了微服务架构并阐述了其九大特性。而我一开始接触微服务架构的时候也觉得这好像不是一个新的概念,很早之前就有RPC和SOA这种面向服务的分布式架构,又冒出一个新的微服务架构,他们到底有什么区别?
看到Martin Fowler的定义以后,才慢慢清楚他们的区别,在Martin Fowler的定义中有几个关键字可以让我们甄别一个分布式架构是传统的面向服务架构还是新的微服务架构:每个服务是不是跑在独立的进程中?是不是采用轻量级的通讯机制?是不是可以做到独立的部署?
(微服务架构的定义)
时间来到了2012年的10月份,在这期的技术雷达中,微服务架构已经从评估(Assess)阶段被移到实验(Trial)阶段。什么叫实验阶段?ThoughtWorks内部有一个解释,就是这项技术已经可以运用在实际项目中,但你仍要控制风险,也就是说此项技术已经可以在风险比较低的项目中使用了。
一个项目要能被移到试验的阶段,还有一个必须要满足的条件,就是必须在ThoughtWorks自己的项目中已经开始实际使用。幸运的是,我当时所在的项目也是在2012年10月份左右开始采用微服务架构的,结果也是非常好的。我们在3个月完成一个新的应用并成功上线,当时客户评价很高。
实际体验下来,微服务架构对我们究竟有哪些好处?这几点是我体会到的:
首先是组件化,作为一个软件开发人员,我们一直都有一个梦想,就是希望有朝一日可以把一堆组件像乐高一样通过直接拼装的方式快速构建我们的应用。无论是最早基于拖拽的方式构建应用,还是现在大热的前端组件化,我们一直都在试图寻找一种更好的组件化方式,微服务架构也是其中之一。但构建软件本身仍是一个非常复杂的过程,微服务架构为我们提供了一种组件化的可能,但直到现在还不好说它能不能达到我们作为整体组件化的目标,但是至少从实际体验来看,它确实能给我们带来组件化的很多好处。
然后是弹性架构,在2015年11月期技术雷达中推荐了亚马逊的弹性计算平台,如果我们的系统是由按业务划分的服务构成,结合容器技术和云平台我们就可以构建一个极具弹性的架构。通过云平台实时的监控,一旦发现资源紧张,立刻就可以通过云平台和容器技术自动瞬间扩展出成百上千的服务资源,在高峰过去之后又可以立即把所有的服务注销掉,释放资源,整个过程完全是自动化的。
去中心化和快速响应也是微服务架构给我们带来的好处。在单体架构下,会非常依赖于项目一开始时对于技术选择,一旦选择了一个技术栈,那么之后几年都被绑定在了这样一个技术栈下,很难应对变化。微服务架构则给我们提供了一个更细粒度使用技术的可能,在不同的服务里可以使用完全不同的技术栈,不同的语言、框架甚至数据库,真正做到用最适合的技术解决最适合的问题,从而让我们可以更加敏捷地响应需求和市场的变化,增加了竞争力。
(微服务架构的好处)
从2012年10月份一直到2014年的7月份,在这个时间段有大量与微服务架构相关的工具、技术和框架出现在技术雷达上。包含了很多领域:语言、测试,框架、CI、CD、持续交付,安全等等。
从2012年的3月份微服务架构第一次出现在技术雷达上一直到2014年7月份,虽然微服务架构已经有了比较大的发展,技术雷达上也已经推荐了大量相关的内容,但在当时社区中谈论微服务架构的声音并不多,这也体现出了技术雷达的前瞻性。
技术雷达上微服务架构相关项目
从2014年7月份开始微服务在社区就开始呈现出一种爆发的趋势,但在紧接着的2015年1月刊的技术雷达中却出现一个非常有意思的项目:Microservice Envy。通俗点儿讲就是“微服务红眼病”,或者说是“微服务你有我也要”。
这意味着在社区刚刚爆发,对于微服务架构踩下油门的时候,我们已经踩下了一脚刹车。但这并不是代表我们不看好微服务架构,而是认为需要认真思考我们是否真正需要以及何时以何种方式使用微服务架构,不能看别的人都在使用也盲目切换到微服务架构下。
这是因为微服务架构并不是免费的午餐,使用微服务架构是需要门槛和成本的。我们需要问自己:用微服务我们够“个”吗?或是说用微服务我们够“格”么?我们是否有这个能力和足够的资源驾驭这个新的架构?
Martin Fowler在他的《企业应用架构模式》中,就提到了分布式对象设计的第一原则:“设计分布式对象的第一个原则就是不要使用分布式对象”。因为分布式系统会给我们带来很大的挑战,让系统复杂度大幅增加的同时,我们还需要面对开发环境、测试、部署、运维、监控,一致性和事务等一系列的问题。
(Microservice Envy)
所以说,微服务架构虽然看起来非常美好,但是也是有很大附加成本的。通过下面这张图可以看到,横轴是时间轴,纵轴是生产力。当软件的复杂度很低的时候,单体架构下的生产力是要高于微服务架构的,但随着复杂度的不断增加,无论是单体应用还是微服务应用的生产力都会下降,只是微服务架构的下降会相对缓慢一些。
这也容易理解,因为在微服务架构中,我们的系统是由很多的小的服务组成,每一个服务都很小,相对简单,技术栈也很独立。这样做局部的变更也会更加容易,随着系统复杂度的不断增加,微服务的优势也就慢慢地体现出来了。
那要如何应对呢?为了追求生产力的最大化,一开始我们可以选择从一个单体架构开始,然后争取在微服务架构生产力超越单体架构的那个复杂度点切换到微服务架构上来,这样才能实现生产力的最大化。这就是Martin Fowler提出的单体应用优先原则(MonolithFirst),以单体架构开始,通过演进式设计逐渐重构到微服务架构。
(MonolithFirst)
为了保证从单体架构演进到微服务架构的重构过程安全可控,还需要有一套良好的质量守护机制。下图描述的就是Martin Fowler提出的微服务架构下的测试策略,我所在项目就是按照这种方式来划分和设计我们各种不同类型的测试,帮助我们在对于服务的抽取合并分离的重构过程中做到安全可控。
(Testing Strategies in a Microservice Architecture)
我们刚才提到了康威定律,康威定律说的是设计系统的组织产生的设计和架构等价于组织间的沟通结构。而康威定律还有一个逆定律:如果想改变一个设计架构方式,首先要改变组织结构。我们经常发现推动技术架构的转型和演进很难,因为我们在调整技术架构的同时却忽略了组织结构也要对应做相应的调整以匹配技术架构的变化,当组织结构与技术架构不匹配的时候,就会相互拉扯,这些都是在当时的技术雷达中着重强调的。
截至目前,以上内容都还是在谈论2015年以前各期技术雷达里的内容。在这之后直到现在,技术雷达也还在持续地推荐微服务架构相关的内容。所以说踩下刹车并不是因为我们走错了路,只是走的太快了,需要时刻提醒自己不要盲目,要清楚微服务给我们带来了什么和有着什么样的挑战,最终解决我们的问题。
来到最新的几期技术雷达,微服务架构还在不断的演进,而且慢慢的与其他新兴的技术融合形成一整套的新的不同以往的构建软件的解决方案。例如无服务器架构、对Docker的应用、对PaaS各种云的应用等,这些技术的发展,会不会对微服务架构的演进提供更多可能?是否可以为微服务架构早一天落地、改变我们的开发方式提供可能?让我们大家一起拭目以待。
更多精彩洞见,请关注微信公众号:思特沃克