这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
REST的第一条约束:Client-Server
,也就是C/S架构
论文原文 5.1.2 Client-server
首先添加到我们的混合架构风格中的架构约束,是来自 3.4.1 小节描述的客户-服务器风格(图 5-2)。客户-服务器架构约束背后的原则是分离关注点。==通过分离用户界面和数据存储这两个关注点,我们改善了用户界面跨多个平台的可移植性;同时通过简化服务器组件,改善了系统的可伸缩性==。然而,对于 Web 来说,最重要的是这种关注点的分离==使得组件可独立地进化,从而支持多个组织领域的互联网规规的需求==。
这种架构分离了客户端和服务器的关注点,使得他们可独立地进化 在现在看来,服务器和客户端的进化表现是:
- 服务器关注数据处理。用集群、分布式、微服务等技术来提高处理速度和稳定性。
- 客户端关注用户界面。但因为客户端直接与人交互,涉及到人们的各种生活需求,发展的非常丰富:桌面应用、浏览器、手机App、各种智能穿戴设备App、小程序等等。
客户端和服务器通过网络接口来进行通信,这种促进服务器和客户端独立进化的软件架构,大大丰富了人们的生产生活
C/S(B/S)和"前后端分离"
为什么我们要去讨论C/S架构和"前后端分离"? 先来一句话:=="前后端不分离",限制了服务器的进化,降低了客户端在浏览器的可移植性==
B/S架构属于C/S的变种,他们有一些差异:
- B/S相比于C/S 最大的好处是:用户仅需要安装一个浏览器,就可以使用各种各样的网络服务,而不需要下载专门的客户端软件;开发人员也不需要考虑客户端的跨平台的问题,只需要浏览器厂商开发不同平台上的浏览器即可
- 在提供用户界面的方式上:C/S的用户界面完全构建在客户端(比如爱奇艺),而B/S的用户界面则需要浏览器向服务器请求
"前后端分离"是B/S架构上的概念。在"前后端分离技术"时代之前,是"动态页面技术"时代。
在web早期(静态网页时代),静态网站只能够根据用户的请求返回指向的网页,除了进行超链接跳转,没办法实现任何交互 为了做到用户和网站的动态交互,出现了以3P(PHP、JSP、ASP)为代表的"动态页面技术" 这些服务器端的动态页面技术使得网页可以获取服务器的数据并保持动态更新,推动了Google为代表的搜索引擎和各种论坛的出现,万维网开始快速发展
动态页面技术的缺点
- 限制了服务器的进化。它降低了服务器的专注性,服务器不仅要进行数据处理,还要渲染出HTML代码发送给客户端。
- 降低了客户端在浏览器的可移植性。因为B/S的请求需要接口返回嵌入了数据的HTML代码,而C/S则只需要返回纯数据,所以他们的接口是不通用的,需要分别写接口。
- 开发模式不专业。前端代码要在服务端工程中开发,要么需要服务端懂前端,要么需要前端懂服务端。随着前端发展的越来越完善、庞大,这种开发方式也越来越不专业。
直到Ajax的出现,让前后端分离成为了可能
Ajax和"前后端分离" Ajax由微软开发,从1998年开始初步应用,但并没有火(好像是因为速度比较慢,人们对交互的需求也还不高)。直到2005年初,Google在它发布的著名的交互应用程序(Google Map、Gmail、Google讨论组、Google搜索建议等)中大量使用了Ajax异步通讯,这让页面无需刷新就可以发起HTTP请求,用户也不用专门等待请求的响应,而是可以继续网页的浏览或操作。 Google在当时可以说将Ajax运用到了登峰造极的地步,突然间刺激了人们的神经,刷新了交互的需求,开发者们迅速关注起Ajax。从此Ajax开始普及,AJAX的广泛使用,标志了 Web2.0 时代的开启。
得益于AJax的异步通讯,以及前端技术发展的越来越快。前端为了寻求良好的可维护性和可复用性,也不得不参考后端 MVC 进行了设计和拆分,后来出现了三大前端框架:AngularJS(2009)、React(2010)、Vue(2014),"前后端分离的时代"正式来临
"前后端分离",让服务器进化能力更强,客户端可移植性更高,比如现在的多平台客户端:百度网盘、爱奇艺、优酷等等,可以在网页、桌面应用、手机App等平台使用,所有平台上的同样功能走的都是同一个接口
"前后端分离",是一定意义上的客户端-服务器分离
B/S架构其实无论怎样都做不到像C/S架构一样真正的客户端-服务器分离,因为浏览器不可能保存所有网站的用户界面,用户界面必须向服务器请求。
但是我们可以变通地将"服务器"分为:"用户界面服务器"和"逻辑服务器" 事实上,"用户界面服务器"叫做"静态资源服务器" 利用"前后端分离"开发出来的程序,可以将前端工程部署到专门的静态资源服务器(Apache、Nginx)。 这就实现了一定意义上的 "客户端-服务器分离":==客户端由 静态资源服务器+浏览器 组成,(逻辑)服务器专心做数据处理==