技术架构的基本思路
技术架构既要清晰地划分功能模块或子系统,又要对整个网站系统的技术逻辑有清晰的认知。庞大的技术架构确实会让人望而却步,架构设计也变得无从入手。
如果把一个庞大的技术架构分成独立的几部分,然后再逐一深入的话,那么一个庞大的技术架构也不是不可理解的
分层思想
架构设计一般被认为是普通编码的进阶,因此我们先从熟悉的编程思想讲起。想必读者一定了解过面向过程和面向对象编程,无论是面向过程编程还是面向对象编程,都需要关心整个业务流程。很多时候,一些重复、通用的步骤会影响我们对整体业务结构的理解,会不自然地产生一种结构混乱的感觉。
除了面向过程和面向对象的编程思想外,当然还有很多其他编程思想,其中面向切面的编程思想也逐渐在网站技术中得到重用。这种编程思想是想通过抽离重复可用的代码(如日志、用户权限等),让开发人员只关注核心代码,而忽略相同且琐碎的部分。不同编程思想下的业务代码对比如图2.9所示。
图2.9 不同编程思想下的业务代码对比
从图2.9中可以看出,在面向过程和面向对象的编程思想下,我们需要关心整个业务流程,因此不得不用“认证用户-修改信息-日志记录”和“认证用户-修改密码-日志记录”来描述业务结构;而在面向切面的编程思想下,可以清晰地看到一种层次感,由于这种层次感,我们可以把业务结构简单地归纳为“认证用户-具体业务-日志记录”。
面向切面的编程思想能让我们更轻松地理解业务结构,就是因为这种“层次感”。那么,对于大型网站技术架构而言,如果把庞大的网站系统架构分成独立的几层,用分层的思维去理解庞大的架构,那么设计大型网站技术架构就不再无从下手了。因此,对于大型网站技术架构的设计而言,首先需要有分层思想,然后再对其分而治之。
IaaS、PaaS和SaaS分层管理
一般来说,用分层思想来理解大型网站系统,目前比较公认的架构分层是基础设施服务层(IaaS,Infrastructure as a Service)、平台服务层(PaaS,Platform as a Service)和软件服务层(SaaS,Software as aService)。例如,视频网站在IaaS、PaaS和SaaS分层下的技术架构如图2.10所示。需要注意的是,这里省略了应用程序部分和很多技术细节。
图2.10 视频网站在IaaS、PaaS和SaaS分层下的技术架构
IaaS层主要包括服务器、存储设备和网络设备等,即所有物理硬件都属于这一层。大型网站系统的物理设备可以是公有云的服务器(如阿里云服务器),也可以是购买的本地服务器。但无论是何种形式,对这一层的管理,并不是安排线路或者电源,而是估算每一个独立虚拟机的物理配置、磁盘大小及网络带宽等。
PaaS层主要包括一些公共软件,也可以说是大型网站系统的运行环境,如操作系统、分布式数据库和分布式文件系统等。我们对这一层的管理主要是选择需要的软件服务,如数据库和操作系统等。IaaS和PaaS层已经决定了网站系统的运行环境,SaaS层才是需要开发的部分。这里先将SaaS层的内部称为应用程序,具体内容在下面会详细说明。
前端、后端和云计算服务分层开发
本小节继续讨论2.3.2小节中提到的SaaS层中的应用程序。在这一部分,我们不仅要对其分层,而且要对其划分功能模块或子系统。
在第1章中讲过,大型网站一般以B/S架构为主,因此我们可以把应用程序进一步细分成前端、后端和云计算服务。而子系统的划分一般是根据业务架构而定的。以一个视频网站为例,前端、后端和云计算服务分层的技术架构如图2.11所示,其中前端部分的页面可能会使用多个子系统的功能。
图2.11 前端、后端和云计算服务分层的技术架构
前端指的是视图层,其作用是交互和展示,一般指的是网页。一些网站系统也有App或者PC软件,如果按照本小节的分层思路,其实它们也算是前端的一部分,不过很少有人这么说。后端指的是业务处理层,其作用是处理前端发送的请求,并且在处理后返回给前端。一些时候,后端也会接收非前端的请求(开放的API接口),不过后端处理的都是一些业务请求,如数据库操作和云计算任务调度等。
云计算服务受后端软件调度。这一部分一般是指运行时间较长或者需要持续运行的软件服务,如视频转码服务和爬虫服务等。在图2.11中,云计算服务被分成两部分,一部分是自身系统提供的云计算服务,另一部分是第三方云计算服务,它们是由第三方平台提供的。这两部分不一定同时存在,需要根据具体项目情况而定。
我们把IaaS、PaaS和SaaS分层架构与前端、后端和云计算服务分层架构合并,并加上一些技术说明(技术说明是参照1.2.7小节中的图1.11添加的),就可以得到一个完整的技术架构,如图2.12所示。
图2.12 完整的技术架构
图2.12基本能表述清楚一些必要的技术细节、系统逻辑和子系统划分,具体项目可以根据实际需要补充或省略一些细节。但这样的架构图只是架构设计的一部分,一般还需要使用其他辅助文档进一步明确细节。不过对架构有了清晰的理解后,其他文档的编写并不复杂。