如何构建一份简单的互联网架构图
如何构建一份简单的互联网架构图
ivansli在面试的时候,经常会被面试官要求当场画出一个简单的架构图。
至于架构图怎么画,都包含了哪几部分。这里简单的梳理一下,并标出每一部分包含的服务、组件以及作用。
1. 用户层
架构最前端为用户层,用户可以利用手中的任何联网设备接入网络进行对应服务的访问,并获取对应结果。
设备有很多,大概分为以下几种:
- APP(Android/IOS)
- H5 (移动端)
- WEB(PC端)
在这一层,有一个互联网服务组件距离用户很近,它的作用使用很广泛,甚至在某些业务场景中处于必不可少的位置。它就是CDN(内容分发网络),主要用来存储一些静态资源,例如:静态页面、静态图片等。CDN里面存储的数据往往来自于各个应用后台管理端的数据更新推送。
对CDN依赖很强的场景业务,莫过于秒杀活动。当秒杀开始时,有大批量的用户涌进业务中,如果任何资源都放在服务集群里面的话,往往那些不经常变动的静态资源占据着整个网络带宽的大部分,会给网关带来很大的访问压力。所以,很多公司会把静态资源在活动开始之前推送到距离用户最近的各个CDN节点里面。
这样的好处主要有:
- 加快静态资源访问以及页面加载
- 减少服务网关访问压力
2. 服务接入层
服务接入层是整个后台服务的最前端,在这一层往往会有几个最重要的用于防护的组件:防护墙、DDoS防护组件、SLB、流量防控组件。
防火墙、DDoS:主要用来屏蔽掉异常的访问与攻击。
SLB:主要用来负载均衡访问请求到下一层集群中,往往后台服务会有多地部署,在这一层也可以把访问分发到不同的国家、城市、地域以及机房。
流量防控组件:主要用来给网关设置一层保险,当整个请求流量达到设置的某个阈值之后,会把多余的请求直接挡回,以免冲垮后面的服务,造成整个服务的瘫痪。此处阈值,可以动态的设置、调整。
3. 业务网关层
从服务接入层接收到的请求被分发到各地机房之后,请求就到达了业务网关层。在这一层,往往具有以下特性:
- 权限校验(用户登录身份ID、加密参数等验证)
- 接口级别请求转发(因为这里是网络的第七层),分发到各个子服务
- 牵扯多个子服务数据的话,可以进行数据聚合
- 限流(IP级别、用户级别)
- 熔断
- 监控各个子服务
- 服务发现
这一层的存在非常重要,如果没有这一层可能会出现庞大、耦合度非常高的单体服务,各个模块的代码都在一个代码仓库里面,维护成本很高、容易出问题、对未来的业务扩展来说就是灾难(笔者亲身经历过,所有代码都在一起,大家都可以随便修改,真正的“牵一发而动全身”,上线个小的功能都战战兢兢)。
4. 子服务层
通过业务网关的接口请求转发就来到了各个子服务层,在这一层往往每个子服务都是单独部署的,不同的机房、专用的集群。每个子服务只实现该功能模块单一的功能。在这一层,往往具有以下特点:
- 服务注册
- 功能单一
- 对外提供服务接口(http的接口、rpc的接口)
- 通过mq或者直接的rpc/http与第三方交互
- 发布上线操作简单
子服务层很多公司往往会使用专用封装的rpc框架进行业务开发。但是还有一点需要注意的是,子服务按什么维度来进行划分也非常关键,稍一不慎,可能会造成庞大的子服务数目,会增大维护的成本。
5. 缓存/MQ/OSS存储层
这一层主要提供数据的存储支持,是整个服务架构的倒数第二层,位于数据库层之前。其存储的数据跟数据库存储的数据有本质的区别。
这一层的组件除了大公司会自研,剩余公司基本都是使用的云厂商提供的对应服务。
缓存:最常用的是Redis、Memcache等基于内存的kv存储组件。
MQ:消息队列,用途主要有3点
- 异步
- 解耦
- 流量削峰
OSS:对象存储服务,一般是海量的小文件存储。
在这一层,往往具有以下特点:
- 存储临时性的数据
- 并发量高
- 相应数据快
6. DB数据库层
该层位于整个服务架构的最底层,也称之为持久化层,用来落地存储持久化数据。最常用的是MySQL等数据库。
在这一层,具有的特点:
- 一般需要支持事务(单机事务、分布式事务)
- 数据落盘(存储在掉电不会丢失数据的磁盘,硬盘常用的有:机械硬盘、固态硬盘)
- 响应速度较慢(因需要I/O操作,再加上硬盘的结构,导致响应速度相对其他组件会较慢)
- 稍一不慎可能导致整个服务的崩溃
7. 监控、日志层
这一层基本是内嵌在上面各层之中,一般用来收集服务相关维度的数据,并生成对应的用于展示服务健康程度的图表。
监控:
- 包括服务器硬件、系统监控以及业务监控
- 一般各层业务之中会有封装好的监控API
- 监控数据一般通过异步的方式投递到某些集群之中
日志:
- 常指业务日志
- 链路追踪日志
- 日志数据一般异步投递到某些集群之中
监控以及日志往往会用在检测整个服务健康度的功能之中,常用的组件是ELK技术栈。
这一层也至关重要,因为只有及时的看到各个服务的健康状态,才能对服务进行调整,以使整个服务健康的运行。
总结
至此,基于文章中一副简单的架构图,本文简单阐述了整个架构的构成以及每层的作用、所使用的组件。
在实际的开发过程之中,需要考虑的因素会更多,也需要相关的人员掌握更多的知识,相对来说对技能要求也是比较高的。
掌握架构同时又是比较重要的,因为只有了解了整个架构各个模块的交互,才能称之为熟悉业务。一般在新员工入职一家公司的时候,都是需要花时间对架构进行一次全面梳理的。
正所谓:知己知彼百战百胜。