4.1 什么是微服务架构
4.1.1 微服务架构的特点
微服务是当前互联网行业的主流架构模式,各大互联网巨头也在用实际行动全面拥抱微服务架构,这种架构模式是在分布式应用和SOA之上的进一步扩展,它的核心思想是“业务系统的组件化拆分和服务治理”。通过微服务架构,我们可以将一个庞大的业务系统拆分成细粒度的服务组件,并且我们可以对这些组件进行独立设计、开发、测试和上线部署。
服务拆分是进行微服务化改造的第一步,传统的业务系统在向微服务架构转型的过程中,都要经历一番大刀阔斧的“拆迁工程”。业界通行的做法是结合领域驱动建模和主链路规划进行服务拆分,本章将对微服务拆分的主流方法做详细介绍。
抛开纸上谈兵的微服务三大特征(Small、Automated和Lightweight),我们从搭建大型应用的视角来看,微服务架构具有以下3个特点:
(1)服务拆分与组件化:结合领域建模理论将一个大型应用拆分成边界清晰的子系统的集合(如订单系统、商品中心、营销优惠系统),再根据业务场景对子系统进行更细粒度的拆分。
(2)独立演进:拆分后的子应用有自己独立的数据库,可以独立进行开发和部署,结合自动化的DevOps和CICD持续集成方案,助力业务快速迭代。
(3)高可用:通过服务治理、流量整形、降级熔断、削峰填谷和弹性计算等一系列技术手段,保证业务系统在高并发场景下的高可用性。
从本书第5章开始,我们就通过优惠券项目的开发及微服务化过程,让读者切身感受微服务架构的优点。
4.1.2 一线大厂为什么采用微服务架构
在互联网飞速发展的同时,诞生了一系列巨无霸式的移动端应用程序,比如以手机淘宝、支付宝和盒马鲜生为代表的淘系产品,以及微信、抖音等具有社交娱乐属性的全民App,它们的后台业务以微服务架构的模式部署在大规模集群之上,支撑着巨量的用户请求。以笔者若干年前参与的“阿里系”产品为例,拿核心主链路上的某一个营销优惠计算的微服务来说,在非大促时期就有近6000台虚拟机的部署规模,整条产品线的体量更是一个极其惊人的数字。这类承接海量用户请求的巨无霸应用,为什么都采用微服务模式来构建业务系统呢?我们从三个方面来分析:
1. 支持快速迭代的业务
在微服务的理念中,微服务架构就等同于微服务团队,一个独立的微服务模块由一个开发团队掌舵,而同时开发团队也保持一个小型的特战队规模。由小规模团队来负责细分领域的业务模块,使团队可以更专注于自己的独立业务,快速将业务落地上线,满足互联网行业快速试错、快速迭代的需求。如今大多数淘系业务的微服务团队仍保持10人以下的小团队规模。
2. 节约大量的计算资源
在单体架构或者粗粒度的SOA、分布式架构之下,系统扩容往往是通过添加硬件服务器的水平扩展模式来实现的,这相当于吃上了大锅饭,所有服务都分配到了资源,无法将计算资源集中在瓶颈业务上,造成了资源浪费。在微服务的架构模式下,系统被拆分成更细粒度的服务化组件,可以根据业务体量和性能压测的结果,在各个服务之间合理分配计算资源,把资源用在真正需要的服务上。
以淘系电商场景为例,营销优惠计算服务是一个承接海量用户请求的模块,商品的优惠价格需要显示在搜索列表页、商品详情页、购物车页和订单结算页,各个页面都要调用营销优惠计算接口。当访问压力增大时,如果营销计算服务的响应变慢,那么依赖营销计算服务的业务线都会受到影响,营销服务就很容易成为整个下单链路的瓶颈。在微服务架构体系下,我们可以有针对性地添加硬件服务器和缓存资源到营销优惠计算服务的集群环境中,将宝贵的计算资源投入瓶颈业务链路上。
3. 技术选型的多样性
对单体应用来说,引入新的技术栈是一件极其困难的事情,不仅要考虑和现有技术栈的兼容性,还要避免引起功能和依赖项的冲突,用新技术栈替换老技术栈更是一场艰苦卓绝的持久战。而对微服务架构的应用来说,每个微服务都是可以独立演进的个体,在技术选型上有相当大的自由度,只要遵循集团层面的框架选型(比如使用指定的服务治理组件),技术团队在选型上就有了更大的话语权,可以自主选择适合业务发展的技术栈,并推进技术栈的更新。
4.1.3 微服务架构对系统运维的挑战
工欲善其事,必先利其器,若要借助微服务架构达到业务快速迭代的目的,需要构建一套高度自动化的CICD工具(Continuous Integration and Continuous Delivery),从代码提交到编译构建,再到单元测试和集成测试,最后根据指定的部署策略分批上线,整套流程需要构建在高度自动化的持续集成平台之上。持续集成是DevOps领域的一个重要部分,不同于大型单体应用动辄数小时甚至十几小时的编译加回归测试,微服务架构下的应用规模足够灵巧,可以在短时间内完成测试验证并发布上线。
微服务架构下的应用部署结构非常复杂,对线上运维体系也提出了更高的要求,需要搭建众多的业务支持系统来保障系统的可用性。比如,业务接口可用性实时监控系统、服务器异常的自动诊断与恢复、洪峰流量下的弹性计算与流量切换,等等。