互联网架构演进

本文是 Service Mesh 系列文章的第一篇,旨在通过介绍互联网架构的演进过程,帮助大家理解微服务(Microservices)以及服务网格(Service Mesh)的概念和出现的原因。

互联网产品往往具备用户量大、高并发、PB 级别的数据存储等特点,同时还需保证系统的高可用弹性伸缩。面对用户的需求,还需要快速迭代。这些都迫使系统架构发生从简到繁的演进。互联网架构先后经历了单体架构、集群架构、分布式架构、SOA、Microservices、Service Mesh

单体架构

架构的发展都是由简到繁,单体架构在历史的潮流中也经历了多次的演变。

简单架构

早期互联网产品用户量少,并发量低,数据量小,多数只需要单个应用服务器可以满足需要,而数据库和文件服务部署在外部单个服务器上,这就是早期的互联网架构,如下图所示:

service-mesh

特点:

  • 所有的功能集成在一个项目工程
  • 所有的功能打一个 war 包部署到服务器
  • 应用与数据库分开部署
  • 通过部署应用集群和数据库集群来提高系统的性能

优点:

  • 项目架构简单,前期开发成本低,周期短,小型项目的首选

缺点:

  • 全部功能集成在一个工程中,一旦出现故障,无法转移,在升级维护中也必须进行停机,可用性低,对于大型项目不易开发、扩展及维护
  • 系统性能扩展只能通过扩展集群结点,成本高、有瓶颈
  • 技术栈受限

读写分离与缓存

随着业务增长,访问量和数据量快速膨胀,应用服务器和数据库服务器性能瓶颈越来越明显。单体服务总是资源有限,而单个数据库的数据流量越来越大,数据的访问性能也明显下降

为了降低数据库的访问压力,对数据库进行读写分离、分库分表等优化。

  • 读写分离:将数据库分为主从数据库,从库实时同步主库的更新内容。请求访问主数据库请求访问从数据库
  • 分库分表:把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。

读写分离和分库分表在一定程度上分解了数据库访问压力。

在实际开发中,数据经常会出现如下特征:

  • 大部分的业务数据只集中于数据中的一小部分
  • 有些数据是需要经常读取,但是更新很少
  • 有些数据是访问量非常大的数据块

这些情况下我们就需要引入缓存层, 如果访问命中缓存,既能减小数据库的访问压力,又可以提高数据访问性能。缓存的发展也是由简单到复杂,由本地缓存缓存集群,由单点到高可用。

  • 本地缓存可以提供快速访问,但无法实现共享,无法保证高可用。
  • 缓存集群可以提供高可用、可共享、大容量的存储,缓存层降低数据库的读写 IO,有效提升系统响应能力。

service-mesh

动静分离

动静分离技术是将服务的静态资源后台应用进行分开部署,提高用户访问静态资源的速度,降低对后台的访问压力。

静态资源一般放在 CDN 上,部署在网络提供商的机房。用户在访问静态资源时,可以很好的利用 CDN 的优点,从距离自己最近的网络提供商机房获取数据。

动静分离后,后端应用更为服务化,更多的是提供 api 接口,前端可以通过更加专业的技术提高访问效率。但同时静态文件的缓存更新以及前后端的更新成本都是动静分离所带来的问题。

service-mesh

集群架构

随着用户规模业务量的不断上涨,单个应用服务器将出现性能瓶颈,对于 PB 级的数据和高并发用户大流量访问,单一或者主备的数据库、文件系统都已经不能满足需求,需要集群化来分担负载

数据规模达到一定规模,传统关系型数据库性能下滑非常严重,通过分库分表也难以应对,为了支撑海量数据和流量,出现了 NoSql 数据库,它关注对数据高并发地读写和对海量数据的存储

应用服务器从单体变为集群,客户端也不再是直接接入后端应用,而是转而通过负载均衡设备代理后端多个服务器集群,一方面将访问压力分摊到了多个后端应用上,单个应用不再是性能瓶颈,另一方面可以实现服务路由,以及异常熔断等特性。

service-mesh

分布式架构

随着业务场景的复杂化,存储规模越来越庞大。将业务进行拆分并分而治之成为更好的选择。大型的业务被细分为单个更小的子业务。例如对于电商系统,按功能维度我们可以拆分为商品中心,订单中心,用户中心,购物车,结算等功能模块。每一个子模块由不同的业务团队负责。每个子业务模块进行独立开发、部署、运维

随着对业务场景越来越细的划分,模块越来越多,整个应用的复杂度也越来越高,大量的独立子应用对数据库的独立访问,导致后端数据库的压力越来越大,需要将各个子应用的重叠逻辑再进行抽取为独立子服务,子应用服务之间通过 RPC 或者消息系统进行相互通信,因此出现了分布式应用

service-mesh

SOA

随着应用的更细力度的拆分,逐渐呈现了一个相互依赖、公共的模块,这些模块大都依赖于相同的逻辑或者功能代码。这时候就需要把这些应用的公用模块提出来,采用独立部署统一管理的方式,提高重用度,这就是服务导向架构(SOA)。

SOA 是一种理念,它的主要特性:面向服务的计算,服务之间松散耦合,支持服务的封装,服务注册和自动发现。SOA 并没有定义出具体的实现方式,目前一种主要的实现方式是企业服务总线(Enterprise Service Bus,ESB),ESB 的根本目标是解决异构系统的连通性,通过协议转换、消息解析、消息路由把服务提供者的数据传递到服务消费者。所以 SOA 的中心化虽然重,但是会解决一些公用逻辑的问题。

service-mesh

微服务

SOA 架构实现了松耦合,系统之间通过服务接口ESB 进行交互。但这种拆分往往是业务系统的一种垂直拆分,拆分的子系统随着业务的复杂耦合仍然面临难以开发和维护的问题。因此更细粒度的拆分变得必要,将子系统功能进一步拆分,变成一项项的服务。系统分布式架构,服务去中心化实现,也即微服务的思想。

Martin Fowler 在 2014 年定义了微服务架构的概念:微服务架构是一种软件系统风格。这种架构风格就是把一组小服务演化成为一个单一的应用的一种方法。每个应用都运行在自己的进程中,并通过轻量级的机制保持通信,就像 HTTP 这样的 API。这些服务要基于业务场景,并使用自动化布署工具进行独立的发布。可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储

微服务架构通过业务拆分实现服务组件化,通过组件组合快速开发系统,业务单一的服务组件又可以独立部署,使得整个系统变得清晰灵活。但是,大量的分布式服务又使得架构实现面临许多问题

  • 服务注册发现
  • 服务统一入口
  • 鉴权
  • 负载均衡
  • 服务配置的集中管理
  • 熔断
  • 监控

所以在微服务架构中除了业务服务组件外通常会引入服务注册发现组件来进行服务治理;引入服务网关来提供统一入口和鉴权;引入负载均衡组件来提供客户端或服务器端的负载均衡;引入集中配置组件来提供服务集中管理;引入熔断器组件来提供服务熔断;引入服务追踪组件来提供服务监控等。因此微服务架构是由这些基础的服务组件和业务微服务组件共同组成,如下图所示:

service-mesh

Service Mesh

Service Mesh 是在微服务架构盛行的必然产物。Service Mesh 可以说是微服务架构的一种实现,它提供了一种透明的、与编程语言无关的方式,使网络配置、安全配置以及遥测等操作能够灵活而简便地实现自动化。Service Mesh 将开发人员从服务之间的交互中释放出来,专心维护业务逻辑。Service Mesh 是解决服务间通讯的基础设施层,用于代理服务间的通信,来负责消息直接按需传递,开发人员不再需要在考虑服务发现等非业务逻辑服务治理也上升到统一的层面。从本质上说,Service Mesh 解耦了服务的开发与运维工作

Service Mesh 通常是通过一组轻量级网络代理(Sidecar proxy),与应用程序代码部署在一起来实现,而无需感知应用程序本身。

service-mesh

不同的业务之间通过 Service Mesh 进行通讯,Service Mesh 根据预先定义好的规则进行流量治理:可以配置 A/B 测试金丝雀发布,同样也可以根据 Service Mesh 的进行流量统计

微服务大量部署之后,每个服务节点的 Sidecar 自然就形成了一个网格, 如下图所示:

service-mesh

更多 Service Mesh 的知识点可以阅读 什么是 Service Mesh(服务网格)Istio

小结

本文主要向大家介绍了互联网架构的演进,帮助大家理解 Service Mesh 的概念和出现的原因。后续的文章,我们将通过理论和实践相结合的形式继续讲解 Service Mesh,咱们下一篇见。

MakeOptim

MakeOptim

MakeOptim 是个人所学总结完再总结而形成的高质量文集。旨在通过这些文章,沉淀自己,帮助他人。