1.1 Web应用开发概述
本节将介绍Web应用的基本概念、B/S与C/S架构的差异、B/S架构的工作原理以及HTTP协议。
1.1.1 什么是Web应用
Web应用(Web application),是指那些通过互联网访问和交互的软件应用程序。用户通常使用网络浏览器作为客户端来访问并与这些应用交互。Web应用与传统的桌面应用不同,它不需要在个人计算机上安装特定的软件,只需要一个支持的网页浏览器。它们通过互联网向用户提供服务和功能,无论用户身处何地,都能通过浏览器来访问这些应用。这种开放性、跨平台性以及无须安装的特点,让Web应用在现代社会中扮演着不可或缺的角色。
Web应用之所以能够如此灵活地为用户提供服务,要归功于一种被广泛采用的架构模式——B/S架构。B/S架构,也称为浏览器/服务器(browser/server)架构,是一种网络应用程序架构。在B/S架构中,用户界面和客户端逻辑大多数情况下都在网络浏览器中实现,而应用服务器则负责处理业务逻辑、数据和存储。
B/S架构将Web应用的构建分为前端和后端两个关键组成部分,它们各自担负着不同的任务,共同构筑一个无缝的用户体验。
1.前端:用户交互的界面
前端是用户直接互动的应用程序部分,即用户界面。在Web开发中,前端特指在浏览器中运行的部分,涵盖页面布局、设计和交互性功能。前端的核心任务是通过浏览器向用户展示Web应用的外观和功能。常用的Web前端技术如下。
HTML:构建网页内容的结构。
CSS:设定网页的样式和外观。
JavaScript:赋予网页交互性。
框架和库:如React、Angular、Vue.js等,用于开发复杂的前端应用。
前端开发者的职责包括构建用户友好的界面,确保应用在不同设备和浏览器上的兼容性,并优化整体的用户体验。
2.后端:数据处理的核心
后端是在服务器上运行的应用程序部分,负责处理业务逻辑和数据操作。在B/S架构中,后端从数据库检索数据,执行计算和逻辑处理,然后将结果传送至前端。后端开发涉及多种编程语言和框架,以便高效处理请求、管理数据,并响应用户的操作。常用的Web后端技术如下。
编程语言:如Java、Python、Ruby、Node.js、PHP等。
数据库:如MySQL、PostgreSQL、MongoDB等,用于数据存储。
服务器:如Apache、Nginx、Tomcat等。
框架:如Spring Boot(Java),Express.js(Node.js)、Django(Python)等。
后端开发者负责实现业务逻辑,保证数据的安全性和完整性,并构建供前端使用的API(application programming interface,应用程序编程接口)。
3.前后端协作:构建完整的Web应用
在B/S架构中,前端和后端通过HTTP协议通信,API定义了数据交换的方式。前端向后端发送请求以获取数据,后端处理这些请求并返回处理结果。这种协作机制为用户提供了丰富的应用功能,同时隐藏了底层技术细节。
如果开发者既懂前端开发,也懂后端开发,可以称为全栈(full stack)开发,全栈开发者有能力构建整个应用程序,从用户界面到服务器和数据库。全栈开发者可以参与项目的整个生命周期,从需求分析、设计、开发到部署和维护。
随着技术的进步,前端和后端的界限变得越来越模糊。例如,某些前端框架(如Next.js和Nuxt.js)提供后端功能,而某些后端技术(如Node.js)也可用于前端开发。
4.前后端架构分离
前后端分离是现代Web开发的重要趋势,它强调前端(用户界面)和后端(服务器逻辑和数据处理)之间的清晰界限。在这种架构下,前端通过API(通常是RESTful API)与后端交互。前端发送API请求,后端处理这些请求并以JSON或XML格式返回数据。这种模式使得一个后端能够支持多个前端应用(如Web、移动、桌面应用)。
与传统的静态网站不同,B/S架构中的Web应用可以动态生成页面内容。例如,根据用户的输入或数据库中的数据,服务器可以动态地生成HTML页面,这种方式通常称为服务端渲染,当然页面也可以在浏览器端根据服务端返回的数据生成,称为客户端渲染。
前后端分离还允许不同的开发团队使用各自的技术栈进行开发,并实现独立部署。这种独立性使得前后端可以根据需要进行单独的扩展,例如,增加后端服务器以应对增加的数据处理需求,而不影响前端。
目前,前后端分离技术主要采用客户端渲染方法,这一趋势得益于Ajax技术和现代JavaScript框架(如React、Angular和Vue.js)的发展。这些技术使得B/S架构中的前端和后端可以更加清晰地分离。前后端分离的方法将用户界面与业务逻辑和数据处理分开,带来了多种优势,但同时也面临如下一些挑战。
安全性:API的开放性可能导致新的安全威胁,需要确保API端点的安全。
CORS:前后端分离可能会遇到CORS(cross origin resource sharing,跨域资源共享)的问题,这需要特别处理,以确保资源的正确共享。
SEO:传统的客户端渲染方法可能对SEO(search engine optimization,搜索引擎优化)产生不利影响。然而,现代的前端框架和工具,如服务器端渲染(SSR),已经可以有效地解决这一问题,提升网页在搜索引擎中的表现。
1.1.2 B/S架构与C/S架构
C/S(client/server)架构是一种两层架构,通常也称作客户端/服务器架构。在这个架构中,服务器运行服务端程序,而客户端设备上安装客户端软件。服务端负责后台业务逻辑和数据处理,而客户端则处理前端界面和用户交互。
C/S架构的主要优点是充分利用客户端PC的处理能力,提高响应速度。然而,这也意味着需要考虑不同操作系统和硬件平台的兼容性,并且在应用更新时需要逐个更新客户端软件。
相比之下,B/S架构特别适用于Web应用程序,如社交媒体、在线购物和博客平台。这种架构允许用户通过Web浏览器访问服务器上的功能,无须在本地设备上安装任何应用程序。
C/S架构和B/S架构的主要特点和差异如表1-1所示。
表1-1 C/S架构与B/S架构的主要特点和差异
在选择这两种架构时,需要考虑多个因素,如应用的交互性、跨平台访问、维护和更新的需求、性能等。最终的选择通常取决于应用的性质和目标用户的需求。
例如,对于需要高度交互性和实时性能的应用,如在线游戏和图形处理应用,C/S架构可能更为合适。而对于需要跨平台、分布式访问和实时更新的Web应用,B/S架构更为理想。
1.1.3 B/S架构的工作原理
B/S架构中的数据交互过程开始于用户在浏览器中输入URL并按下Enter键,由此触发了一系列复杂的步骤。
(1)浏览器缓存检查。浏览器会检查它的缓存中是否有请求的URL的资源(包括页面、图片等)。如果存在匹配项且未过期,则浏览器可以直接从缓存中加载资源,而无须通过网络请求。
(2)DNS查询。如果资源不在缓存中,则浏览器会进行DNS查询,将可读的域名(如www.example.com)解析为一个IP地址。这通常涉及查询本地的DNS缓存、操作系统的DNS缓存、路由器的DNS缓存,或者可能是一个远程的DNS服务器。
(3)建立TCP连接。获取IP地址后,浏览器与目标服务器将建立一个TCP连接,以进行后续的通信。这个过程包括一个称为三次握手的过程。
(4)发送HTTP请求。TCP连接建立后,浏览器会通过这个连接发送一个HTTP请求到服务器。这个请求包括了请求的资源、方法(如GET或POST)和一些其他的头部信息。
(5)服务器处理。服务器收到HTTP请求后,通常会通过Web服务器软件(如Apache、Nginx或IIS)进行处理。对于动态内容,如PHP、Python或Node.js脚本,服务器可能会交给相应的处理器进行处理。
(6)服务器响应。服务器处理完成后,会发送一个HTTP响应回到浏览器。这个响应包括一个状态码(如200 OK、404 Not Found等)、响应头部信息,以及请求的实际数据或内容。
(7)HTTPS/TLS握手。如果URL的前缀是HTTPS,那么在TCP连接之后和发送HTTP请求之前,浏览器和服务器之间会进行TLS握手,以安全地加密和解密传输的数据。
(8)渲染页面。浏览器开始解析返回的HTML、CSS和JavaScript。它会构建DOM(文档对象模型)和CSSOM(CSS对象模型),并执行JavaScript,最后呈现页面给用户。
(9)加载其他资源。HTML页面可能还包含其他资源的引用,如图片、视频、CSS文件、JavaScript文件等。浏览器会继续为这些资源发起额外的HTTP请求,并在收到响应数据后进行处理或渲染。
(10)关闭TCP连接。数据传输完成后,浏览器和服务器会关闭TCP连接。但如果使用了HTTP/2协议,则连接可能会保持开放,用于后续的请求。
1.1.4 HTTP协议
浏览器与服务器之间数据的传输离不开通信协议,而B/S架构的核心是HTTP协议。HTTP是一种无状态的请求/响应协议,这意味着每个请求都是独立的,服务器不会“记住”之前的请求。HTTP有多种请求方法,如GET、POST、PUT、DELETE等,分别支持不同的操作。HTTP响应包括状态代码,如200 OK、404 Not Found等,用于表示请求的结果。
理解HTTP的无状态特性的关键点如下。
独立的请求:每次HTTP请求都是完整的。从一个请求开始,服务器处理,然后返回响应,这个请求就结束了。服务器不会(基于HTTP协议本身)“记住”这个请求。
无法记忆:假设你在一个电商网站上登录并添加了一个商品到购物车,但是当你尝试去结账时,如果HTTP是完全无状态的,则服务器会“忘记”你是谁以及你加入购物车的商品是什么。
设计成无状态的原因:HTTP的无状态性有助于简化服务器的设计,因为服务器不需要保存与每个客户端的会话相关的信息。这也使得Web服务可以更轻松地扩展,因为新的请求可以由任何可用的服务器处理,而不必担心丢失与先前请求的状态相关的信息。尽管HTTP本身是无状态的,但Web应用往往需要维护管理状态(例如,跟踪用户是否登录,用户的购物车内容等)。为了解决这个问题,Web开发者使用了一些技巧和工具,如Cookies、URL参数、隐藏的表单字段和服务器端的session存储。
Cookies:当用户首次登录一个网站时,服务器可能会发送一个Cookie给浏览器。此后,每次发出请求,浏览器都会自动携带这个Cookie,这样服务器就可以“识别”用户了。
Session:服务器可以使用由Cookie或其他机制提供的ID来存储有关用户的状态信息。这些信息保存在服务器上,每次请求时,服务器可以使用ID来查找和使用该信息。
在后续章节中会详细介绍RESTful API设计,无状态是其核心原则之一。每个请求应该包含所有必要的信息供服务器处理。这确保了服务器可以自由地处理任何请求,而不需要考虑之前的请求。