1.2.2 微服务
微服务架构是云原生架构的核心构成。随着企业的业务发展,传统的单体架构和分层架构面临着很多挑战。
(1)单体架构在需求越来越多时无法满足其变更要求,数百人的开发团队一起开发维护一个巨型应用工程,开发人员对大量代码的变更会越来越困难,同时也无法很好地评估风险,所以迭代速度慢。
(2)所有的应用都运行在一个进程内,无法隔离,经常会因为某处业务的瓶颈导致整个系统业务瘫痪,架构无法扩展,木桶效应显著,无法满足业务的可用性要求。
(3)整体组织效率低下,无法很好地利用资源,存在大量的浪费。
因此,组织迫切需要进行变革。随着大量开源技术的成熟和云计算的发展,服务化的改造应运而生,不同的架构设计风格随之涌现。
在过去几年中,“微服务架构”这一术语开始出现,它描述了一种将软件应用程序设计为一组可独立部署的服务的特定方式。虽然这种架构风格没有明确的定义,但在组织、业务能力上有一些共同的特征:自动化部署、端点智能化、语言和数据的去中心化控制。
——Martin Fowler,2014年3月25日
2014年,架构大师Martin Fowler和James Lewis共同提出了微服务的概念,定义了微服务是以开发一组小型服务的方式来开发一个独立的应用系统,每个服务都以一个独立进程的方式运行,每个服务与其他服务使用轻量级通信机制(如图1-3所示)。这些服务是围绕业务功能构建的,可以通过全自动部署机制独立部署,同时服务会使用最小规模的集中管理(如容器)能力,也可以采用不同的编程语言和数据库。
▲图1-3 单体架构与微服务架构(图片来自Martin Fowler个人网站)
由Martin Fowler给微服务的定义分析可知:一个微服务基本是一个能独立发布的应用服务,因此可以作为独立组件升级、灰度或复用等;对整个大型应用的影响也较小,每个服务可以由专门的组织来单独完成,依赖方只要定好输入和输出接口即可完成开发,甚至整个团队的组织架构也会更精简,因此沟通成本低、效率高。根据业务的需求,不同的服务可以根据业务特性进行不同的技术选型,无论是计算密集型,还是输入/输出(Input/Output,I/O)密集型应用都可以依赖不同的语言编程模型,各团队可以根据本身的特色独自运作。当某一个服务在压力较大时,也可以有更多容错或限流降级处理。
微服务将大型复杂软件应用拆分成多个简单应用,每个简单应用描述一个小业务,系统中的各个简单应用可以被独立部署,各个应用之间是松耦合的,每个应用仅关注完成一件任务并很好地完成该任务。相比传统的单体架构,微服务架构具有降低系统复杂度、独立部署、独立扩展、跨语言编程等特点。
微服务架构并不是技术创新,而是开发过程发展到一定阶段对技术架构的要求,是在实践中不断摸索而来的。微服务的核心思想是化繁为简的应用拆分,这不仅在技术上带来突破,还带来很多潜在的价值,如关注点分离、沟通效率提升、快速演进、快速交付、快速反馈等,这些都是云原生架构所倡导的软件开发模式。
微服务架构确实有很多吸引人的地方,然而它的引入也是有成本的,它并不是银弹,使用它会引入更多技术挑战,比如性能延迟、数据一致性、集成测试、故障诊断等。企业需要根据业务的不同阶段进行合理的引入,不能完全为了微服务而“微服务”。本书第四部分会对如何解决这些问题提供对应不同的方案。
架构的灵活、开发的敏捷同时带来了运维的挑战。应用的编排、服务间的通信成为微服务架构设计的关键因素。目前,在微服务技术架构实践中主要有侵入式架构和非侵入式架构两种实现形式。
微服务架构行业应用深入,侵入式架构占据主流市场。微服务架构在行业生产中得到了越来越广泛的应用,例如Netflix已经有大规模生产级微服务的成功实践。而以阿里巴巴HSF、开源Dubbo和Spring Cloud 为代表的传统侵入式架构占据着微服务市场的主流地位。侵入式架构将流程组件与业务系统部署在一个应用中,实现业务系统内的工作流自动化。
随着微服务架构在行业应用中的不断深入,其支持的业务量也在飞速发展,对于架构平台的要求也越来越高。由于侵入式架构本身服务与通信组件互相依赖,当服务应用数量越来越多时,侵入式架构在服务间调用、服务发现、服务容错、服务部署、数据调用等服务治理层面将面临新的挑战。
服务网格推动微服务架构进入新时代。服务网格是一种非侵入式架构,负责应用之间的网络调用、限流、熔断和监控,可以保证应用的调用请求在复杂的微服务应用拓扑中可靠地穿梭。服务网格通常由一系列轻量级的网络代理组成(通常被称为SideCar 模式),与应用程序部署在一起,但应用程序不需要知道它们的存在。服务网格通过服务发现、路由、负载均衡、健康检查和可观察性来帮助管理流量。
自2017年年初第一代服务网格架构Linkerd公开使用之后,Envoy、Conduit等新框架如雨后春笋般不断涌现。2018年年初,Google、IBM 和Lyft 联合开发的项目Istio 的发布,标志着服务网格带领微服务架构进入新的时代。