如何构建一份简单的互联网架构图

在面试的时候,经常会被面试官要求当场画出一个简单的架构图。

至于架构图怎么画,都包含了哪几部分。这里简单的梳理一下,并标出每一部分包含的服务、组件以及作用。

1. 用户层

架构最前端为用户层,用户可以利用手中的任何联网设备接入网络进行对应服务的访问,并获取对应结果。

设备有很多,大概分为以下几种:

  • APP(Android/IOS)
  • H5 (移动端)
  • WEB(PC端)

在这一层,有一个互联网服务组件距离用户很近,它的作用使用很广泛,甚至在某些业务场景中处于必不可少的位置。它就是CDN(内容分发网络),主要用来存储一些静态资源,例如:静态页面、静态图片等。CDN里面存储的数据往往来自于各个应用后台管理端的数据更新推送。

对CDN依赖很强的场景业务,莫过于秒杀活动。当秒杀开始时,有大批量的用户涌进业务中,如果任何资源都放在服务集群里面的话,往往那些不经常变动的静态资源占据着整个网络带宽的大部分,会给网关带来很大的访问压力。所以,很多公司会把静态资源在活动开始之前推送到距离用户最近的各个CDN节点里面。

这样的好处主要有:

  1. 加快静态资源访问以及页面加载
  2. 减少服务网关访问压力

2. 服务接入层

服务接入层是整个后台服务的最前端,在这一层往往会有几个最重要的用于防护的组件:防护墙、DDoS防护组件、SLB、流量防控组件。

防火墙、DDoS:主要用来屏蔽掉异常的访问与攻击。

SLB:主要用来负载均衡访问请求到下一层集群中,往往后台服务会有多地部署,在这一层也可以把访问分发到不同的国家、城市、地域以及机房。

流量防控组件:主要用来给网关设置一层保险,当整个请求流量达到设置的某个阈值之后,会把多余的请求直接挡回,以免冲垮后面的服务,造成整个服务的瘫痪。此处阈值,可以动态的设置、调整。

3. 业务网关层

从服务接入层接收到的请求被分发到各地机房之后,请求就到达了业务网关层。在这一层,往往具有以下特性:

  1. 权限校验(用户登录身份ID、加密参数等验证)
  2. 接口级别请求转发(因为这里是网络的第七层),分发到各个子服务
  3. 牵扯多个子服务数据的话,可以进行数据聚合
  4. 限流(IP级别、用户级别)
  5. 熔断
  6. 监控各个子服务
  7. 服务发现

这一层的存在非常重要,如果没有这一层可能会出现庞大、耦合度非常高的单体服务,各个模块的代码都在一个代码仓库里面,维护成本很高、容易出问题、对未来的业务扩展来说就是灾难(笔者亲身经历过,所有代码都在一起,大家都可以随便修改,真正的“牵一发而动全身”,上线个小的功能都战战兢兢)。

4. 子服务层

通过业务网关的接口请求转发就来到了各个子服务层,在这一层往往每个子服务都是单独部署的,不同的机房、专用的集群。每个子服务只实现该功能模块单一的功能。在这一层,往往具有以下特点:

  1. 服务注册
  2. 功能单一
  3. 对外提供服务接口(http的接口、rpc的接口)
  4. 通过mq或者直接的rpc/http与第三方交互
  5. 发布上线操作简单

子服务层很多公司往往会使用专用封装的rpc框架进行业务开发。但是还有一点需要注意的是,子服务按什么维度来进行划分也非常关键,稍一不慎,可能会造成庞大的子服务数目,会增大维护的成本。

5. 缓存/MQ/OSS存储层

这一层主要提供数据的存储支持,是整个服务架构的倒数第二层,位于数据库层之前。其存储的数据跟数据库存储的数据有本质的区别。

这一层的组件除了大公司会自研,剩余公司基本都是使用的云厂商提供的对应服务。

缓存:最常用的是Redis、Memcache等基于内存的kv存储组件。

MQ:消息队列,用途主要有3点

  • 异步
  • 解耦
  • 流量削峰

OSS:对象存储服务,一般是海量的小文件存储。

在这一层,往往具有以下特点:

  1. 存储临时性的数据
  2. 并发量高
  3. 相应数据快

6. DB数据库层

该层位于整个服务架构的最底层,也称之为持久化层,用来落地存储持久化数据。最常用的是MySQL等数据库。

在这一层,具有的特点:

  1. 一般需要支持事务(单机事务、分布式事务)
  2. 数据落盘(存储在掉电不会丢失数据的磁盘,硬盘常用的有:机械硬盘、固态硬盘)
  3. 响应速度较慢(因需要I/O操作,再加上硬盘的结构,导致响应速度相对其他组件会较慢)
  4. 稍一不慎可能导致整个服务的崩溃

7. 监控、日志层

这一层基本是内嵌在上面各层之中,一般用来收集服务相关维度的数据,并生成对应的用于展示服务健康程度的图表。

监控:

  1. 包括服务器硬件、系统监控以及业务监控
  2. 一般各层业务之中会有封装好的监控API
  3. 监控数据一般通过异步的方式投递到某些集群之中

日志:

  1. 常指业务日志
  2. 链路追踪日志
  3. 日志数据一般异步投递到某些集群之中

监控以及日志往往会用在检测整个服务健康度的功能之中,常用的组件是ELK技术栈。

这一层也至关重要,因为只有及时的看到各个服务的健康状态,才能对服务进行调整,以使整个服务健康的运行。

总结

至此,基于文章中一副简单的架构图,本文简单阐述了整个架构的构成以及每层的作用、所使用的组件。
在实际的开发过程之中,需要考虑的因素会更多,也需要相关的人员掌握更多的知识,相对来说对技能要求也是比较高的。

掌握架构同时又是比较重要的,因为只有了解了整个架构各个模块的交互,才能称之为熟悉业务。一般在新员工入职一家公司的时候,都是需要花时间对架构进行一次全面梳理的。

正所谓:知己知彼百战百胜。