系统架构演变概述

系统架构演变概述

随着互联网的发展,各个应用系统的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。从互联网早起到现在,系统架构大体经历了下面几个过程:

  1. 单体应用架构
  2. 垂直应用架构
  3. 分布式架构
  4. SOA架构
  5. 微服务架构
  6. service mesh

上图引自dubbo官网,其中分别是单体架构,垂直架构,分布式架构,soa架构。没有微服务和service mesh(这个本文不做介绍)

下面分别简单介绍一下这几种架构

单体应用架构

早期的时候,系统业务简单同时流量也不大,此时开发人员将所有的功能写到一个项目中就可以了,然后将这个项目部署之后,用户即可使用。比如一个电商的项目,我们会将商品管理,支付管理,物流管理等功能写到一个项目中。单体应用架构适合小项目。

优点:架构简单

缺点:不利于扩展和维护,仅修改一个小功能之后,需要将项目全部重新编译,打包,部署

垂直应用架构

为了解决上面的问题,可以将这个应用按照业务功能的不同拆分为多个应用,例如上面的电商项目,可以拆分为商品管理项目,支付管理项目还有一个物流管理项目,这3个项目分开部署,各个项目独立发展。

优点:提高了单点的容错性,利于扩展和维护

缺点:系统之间无法相互调用,会有一些重复的功能。

分布式应用架构

将上面电商的3个项目中功能重复的内容抽取出来作为服务,这些服务可以被不同的项目来调用,例如商品价格查询服务,支付订单查询服务,物流状态查询服务等。

优点:增加功能的复用性

缺点:服务调用关系复杂,需要解决异构服务之间的协作问题。

SOA应用架构

SOA(Service Oriented Architecture)面向服务架构,为了解决上面的缺点,可以将这些服务统一管理起来,对外部隐藏调用关系,常见的落地方式有

  • 分布式服务化具有代表性的分布式服务化技术有dubbo。是去中心化的
  • 集中式管理化通过ESB(企业服务总线)将服务集成起来,oracle,ibm,jboss等公司都有推出ESB产品。是中心化的

优点:解决了多个模块复杂的调用关系

缺点:服务拆分的不够细

微服务架构

微服务(MicroServices Architecture,简称MSA),可以看做是SOA的一种提炼,在之前的服务上再进行拆分,使用粒度更细的服务,需要注意的是微服务并不是越小越好,需要根据团队大小和业务规模来划分。关于微服务没有精确的概念定义,不过微服务的提出者Martin Flowler在这篇文章(https://martinfowler.com/articles/microservices.html)中有提及一些关键点:

  • 由一些独立的服务共同组成应用系统
  • 每个服务单独布署、独立跑在自己的进程中
  • 每个服务都是独立的业务
  • 分布式管理

优点:将服务进行了更细的拆分,各个微服务可以独立部署,扩展性强

缺点:架构复杂,开发成本高

架构的选型要结合团队规模,业务复杂度等因素,切记不要为了微服务而微服务。

CAP理论

布式系统有一个著名的CAP理论,CAP分别表示,一致性(Consistency)、可用性(Availablility)和分区容错(Partition Tolerance)。

  • 一致性(Consistency):指的是数据的强一致性,所有节点在同一时间的数据完全一致,这就是分布式的一致性。
  • 可用性(Availability):指的是服务的可用性,即用户的每个请求都能在合理的时间内获得符合预期的响应结果,不会出现用户操作失败或者访问超时等结果。
  • 分区容错性(Partition Tolerance):指的是当分布式系统中节点之间的网络出现问题之后,系统仍然能够对外提供满足一致性(Consistency)或可用性(Consistency)的服务。

CAP理论指出,当出现了分区容错性之后,可用性和一致性只能二选一。

比如网络中有A和B两台服务器,他们之间是有通信的,分区容错性指的是当出现了故障导致A和B无法进行通信时,我们要保证系统对用户依然能够提供服务。若要保证系统能够提供服务,那只能在一致性和可用性上二选一了。

一致性,比如A和B之间同步数据,A接收到了写入请求,可是由于网络出现了问题导致B无法收到该请求,此时A是不会执行这个写入请求的,这样就保证了A和B数据的一致性。

可用性,比如A和B之间同步数据,A接收到了写入请求,可是由于网络出现了问题导致B无法收到该请求,此时A会执行写入请求,这样A就保证了可用性。

CAP中的P是前提,当P发生了之后,我们会在C和A之间二选一,倘若P没有发生,C和A都是可以保证的。

举个例子,电商系统中,有两台服务器A和B都保存了商品的价格,商家在后台将商品价格从10元修改为20元,此时出现了P,那么

  • 一致性:买家张三访问服务器A看到的价格是10元,买家李四访问服务器B看到的价格也是10元。
  • 可用性:买家张三访问服务器A看到的价格是20元,买家李四访问服务器B看到的价格是10元。