面对微服务如火如荼的发展,很多人都在了解,学习希望能在自己的项目中帮得上忙,当你对微服务的庐山真面目有所了解后,接下来就是说服自己了,到底如何评估微服务,什么时候使用微服务,什么时间点最合适,需要哪些技术储备和资源投入等等,这些都是你需要面对和解决的。 本文从单体架构,微服务架构,微服务风险评估,微服务落地条件等几个方面探讨微服务的落地过程,希望对你有所启发。
讲解微服务之前,我们先简单了解下单体架构。
随着业务的复杂度增加,单体的灵活度会逐渐下降,比如:
架构设计的三大原则告诉我们,架构需要的是简单、适度、演化。
对于项目起步阶段,单体是最高效也是最节省成本的方式。因为初期阶段,由于人力,成本,业务熟悉程度,微服务技术积累等因素,如何过度设计可能工期和复杂度会急剧上升,造成交付困难,问题百出,从而错过了时间窗口。最合适,简单的方式还是单体优先,这是创业公司的特点决定的。当然设计面向微服务的单体架构也是一种聪明的方法,这遵守了系统演化的法则。
无论采取何种维度的架构分层,分层的最核心目的是保证各层之间的差异足够清晰,边界足够明显,为将来可能产生的变化提供最容易、最小化的修改。比如客户端要从安卓替换为IOS,底层无须任何改动,就像替换积木一样。又比如,设备需要接入新的设备或协议,其他层也不需要做任何变化,可以无缝平滑接入任何设备。
如果前期在业务不十分清晰,求的是验证想法,证明产品思路是否可行性,并且业务量不大,仅限于省级范围,建议只要对当前架构稍加改良升级就可以了,这样改动量相对较小,且至少能支撑一定时间段的业务增长。
支撑的业务更加庞大,可以支撑海量用户高并发和海量设备接入,支持分布式多机房,多区域部署,支持服务器无限扩容。支持私有云,公有云,混合云等部署方式。所以微服务是大多数互联网公司的首选。
微服务架构图谱谷歌或Bing下,可以看到各种各样的架构图,源于业务和架构师自身的喜好或者粗细粒度,但是每个架构图的基本组件和架构分层都差别不大,只是有的细一些,有的粗一下。比如有客户端层,容器层(K8S),API Gateway,微服务集群层,EventBus层是必须要有的,至于服务监控和服务跟踪、服务治理本身就是一个完整的系统,粒度就没有细了。基于这些概念,我把架构图稍微细化一下,这里省去服务监控跟踪和治理的部分,后续单独抽离出来分析。
这边的架构图谱相对之前的架构图,更加贴近业务,粒度也更细,虽然个别组件有所省略,比如跟踪和治理部分。
以上架构图主要分4层,每个层次遵循架构分层的核心思想:关注点分离,职责各异,边界清晰。
第1层:客户端:理论上包含一切可以联网的设备,包括移动设备,Android、IoS、Pad、微信、微博、QQ、Web、各自浏览器、物联网设备等等……
第2层:API网关:包括服务注册,发现,认证授权,单点登录,熔断,限流……网关的知识点丰富,是微服务的核心之一。
第3层:微服务集群:包括各种具体的microservice,比如纵向划分的业务服务(用户服务,订单服务,……),横向划分的基础或公共服务(元数据服务,公共服务……)
其他微服务的地址可能是这样的:
第4层:事件总线:Event Bus 目的是消息解耦,不要让服务之间直接的链接。不同与SOA的服务总线,事件总线相对比较轻量,经常基于消息队列引擎进行解耦,目的是为了让服务之间的关联弱化,不直接进行关联。很多时候用的是相对稳定、可靠、企业级的RabbitMQ。
微服务的架构其实不难,根据以上的架构,每种业务都可以进行套用,这里的难点在于服务的划分和粒度控制,另外如何管理膨胀的服务是一个麻烦事。
这里引用架构师杨波(前Ebay架构师,目前任职拍拍贷研发部总监,资深技术架构师,微服务技术专家)的一些观点:
“企业一开始不推荐直接使用微服务,因为微服务需要前期基础设施的投资,复杂性很高,如果对问题领域并不是很理解,一开始用微服务,你很难去划分服务的边界,你的生产力反而会比较低,而且你花了很大精力进行开发,你的产品并没有被市场验证过,有可能会失败,所以这个选项风险会比较高。所以我们推荐的是单块优先,先从单块运用做起,这样成本低,团队成员也比较少,无须太多研发投入,就可以交付一些基本的功能给客户使用。
随着应用越来越成功,客户增加,你的系统复杂度会越来越高,就会出现单块应用和团队规模之间的矛盾,生产力会随着业务复杂度逐渐降低。所以在一些初创型公司,你更多看到的是单块应用,只有一些中大型的公司会看到微服务架构。”
“交叉点表明,业务已经到达了一定的复杂性,单块应用已经无法满足业务增长的需要,研发效率开始下降了,而微服务可以提升研发和交付的效率。这个点需要架构师去综合,权衡。个人经验,一般团队需要达到百人规模,才去考虑微服务。”
以上的观点讲的很中肯,给我的启发和帮助非常大。这里的交叉点怎么来确定和评估是重点,比如我们上线一个社交姑且叫抖信,初期为了快速上线,验证可行性,可以只开发首页聊天、通讯录、评论等基本功能。产品上线后,经过一段时间的运营,用户开始逐步增多,可行性验证通过,下一阶段就需要进一步增加更多的新特性来吸引更多的目标用户,比如再给这个社交抖信添加朋友圈、消息通知、游戏、电商等等功能。
“一般情况下,这个时候就需要大规模地扩张开发人员,以支撑多个功能的开发。如果这个时候继续采用单体应用架构,多个功能模块混杂在一起开发、测试和部署的话,就会导致不同功能之间相互影响,一次打包部署需要所有的功能都测试 OK 才能上线。
不仅如此,多个功能模块混部在一起,对线上服务的稳定性也是个巨大的挑战。比如 A 开发的一个功能由于代码编写考虑不够全面,上线后产生了内存泄漏,运行一段时间后进程异常退出,那么部署在这个服务池中的所有功能都不可访问。
根据我的实际项目经验,一旦单体应用同时进行开发的人员超过 10 人,就会遇到上面的问题,这个时候就该考虑进行服务化拆分了。”---胡忠想(微博微服务技术专家)
至此,我们何时采用微服务已经十分明确了,关键是业务复杂度和团队规模两大要点,而业务复杂度和市场窗口是权衡和抉择的首要因素。
一般情况下,业务系统引入新技术就必然会带来架构的复杂度提升,在具体决策前,你先要认识到新架构会带来哪些新的问题,这些问题你和你的团队是否能够解决?如何解决?是自己投入人力建设,还是采用业界开源方案?假如你和我一样都是微服务的旁观者或者学习者,那么下面的评估也许对你又所参考。
如何正确拆分?这里正确指的是合理,因为没有绝对的标准。按照前人的经验可以分为纵向和横向两种划分方法:
由于SOA和微服务有千丝万缕的关系,这里简单罗列双方的对比图,算是一个小知识点:
两种架构背后的意图是不同的:SOA尝试将应用集成,一般采用中央管理模式来确保各应用能够交互运作。微服务尝试部署新功能,快速有效地扩展开发团队。它着重于分散管理、代码再利用与自动化执行。
最后让我们回顾一下前人经典的话语:
还是回到我们架构设计的原则上,遵循简单,适用,演化的原则,那么你的抉择也许会变得没有那么令人纠缠。
-END-