在多台计算机需要协作共同完成任务的情况下,通常会采用客户端-服务器模型。这个模型广泛应用于各种计算机系统,包括计算机网络、数据库系统、操作系统、互联网应用等。
1、客户端计算架构的演变
客户端-服务器架构是架构模式和网络的关键部分。一开始,它很简单,主要用于数据交换和基础计算,服务器是主要的处理中心,而客户端的工作相对较少。但随着时间的推移,这种架构逐渐发展成为更复杂和多样化的形式,以满足不断增长的技术需求和挑战(如图5-6所示)。
下面,我们来看看客户端-服务器架构是怎样发展的。
1.1、大型机
在七八十年代的计算环境,就像一个大老板(大型计算机)和一群小秘书(哑终端)的工作方式。这个大老板做所有的重要工作,而小秘书们只是把信息传递给大老板处理。但慢慢地,这些小秘书(个人电脑)开始有了自己处理事情的能力,虽然还是要依赖大老板完成大部分工作。就像一个公司逐渐让员工独立处理事务,一些组织开始尝试让大老板和小秘书共同分担工作。这就是客户端-服务器架构的起步,它让工作更有效率,每个人都有自己的任务。
1.2、客户端-服务器架构
单层架构
在单层架构中,展示层、应用层和数据库层都集中在同一台机器上,如图5-7所示。这种架构的应用通常被称为单机应用程序。例如,微软Office和MP3播放器就是典型的单层架构应用。然而,在实际的生产环境中,这种架构的使用相对较少。
双层架构(客户端-服务器架构)
在双层架构结构中,第一层是客户端,第二层是服务器。应用逻辑可能分布在客户端的用户界面(UI)或数据库服务器中,也可能同时存在于两者之中。这意味着在客户端和服务器之间不存在中间件。具体可参见图5-8所示。
三层架构(基于Web的架构)
在三层架构中,系统被划分为客户端层、应用层和数据库层三个独立的层次。这种架构的特点是各层之间的线性连接,即所有通信都必须经过中间层处理。具体来说,无论是请求还是响应,都由位于中间的应用层接收和转发,然后才能到达客户端或服务器端。在这种架构下,客户端主要负责展示层的处理,应用服务器则管理应用层,而数据库服务器专注于数据库层。有关这种架构的具体布局,可以参见图 5-9。
N 层架构(多层架构)
在多层架构中,展示、应用处理和数据操控功能在物理层面上是分开的,形成了清晰的层次结构。其中,最常见的多层架构形式便是三层架构。
1.3、面向服务模式
在20世纪90年代中期,随着万维网(WWW)开始引起广泛关注,最初的万维网采用了三层架构。在这种架构中,网络浏览器充当客户端,而Web和应用服务器则托管所有的处理和逻辑。与此同时,面向服务的架构(SOA)也开始崭露头角。
**面向服务的架构(SOA)**是一种设计原则,使得应用程序能够利用网络中的服务。在SOA(如图5-10所示)中,主要有两种角色:
- 服务提供者:负责维护服务,并向消费者提供这些服务。
- 服务消费者:在服务目录中寻找服务的元数据,并开发客户端组件应用程序,以绑定和使用服务提供者提供的服务。
1.4、云服务模式
在21世纪的前十年,随着基于云的托管服务的兴起,开发者开始倾向于使用这些服务,因为它们提供了根据需求进行弹性伸缩的资源。云服务包含三种不同的托管选项:
- 基础设施即服务(IaaS) :在这种模式下,开发者需关注应用程序、操作系统、数据和中间件等方面,而云服务则负责硬件、操作系统和网络等基础设施层面的事务。
- 平台即服务(PaaS) :开发者主要关注应用程序和数据,其他如运行环境、操作系统等则由云服务提供和管理。
- 软件即服务(SaaS) :这种模式允许在云中托管整个应用程序,用户通过网络访问。
如图5-11所示展示了IaaS、PaaS和SaaS这三种服务模式之间的区别。
1.5、微服务模式
在微服务架构方式下,应用服务被构建为一组松散耦合的服务。每个服务都运行在自己的进程中,并通过轻量级协议与其他客户端或服务进行通信。这种方式特别适合于采用敏捷开发方法的小型项目。有时,人们将其视为面向服务的架构(SOA)的一种变体,因为应用服务是由多个小型服务组成的,而不是作为一个单一的大型应用服务(单体应用服务)。Spring Boot、Swagger和Jersey等框架通常被用来构建微服务架构。如图5-12展示了单体应用服务与微服务架构之间的区别。
2、客户端和服务器通信
在理解客户端和服务器之间的通信之前,我们先弄清楚以下几个术语(如图5-13所示):
- 请求(Requests) :当客户端需要服务器提供数据(如文件)或通知服务器发生某些活动(例如用户尝试登录)时,它会发送一个请求。
- 响应(Response) :响应是服务器发回给客户端的信息,用于回应客户端的请求。比如,响应可能包含身份验证的结果。
- 客户端(Client) :客户端是发起请求的那一方。通常,客户端是一款需要从服务器获取信息或资源的软件应用,比如网络浏览器或电子邮件客户端。客户端发送请求给服务器,并等待服务器回应。
- 服务端(Service) :服务端则是接收并响应客户端请求的那一方。它提供客户端所需的资源或信息。服务器通常位于远程计算机上,并通过网络进行访问。
需要注意的是,一台计算机可以同时运行Web服务器和文件服务器软件,以应对不同客户端提出的不同类型的请求,并提供相应的数据。
在客户端和服务器之间,信息的交换遵循一种叫做请求(requests)-响应(Response)消息模式。这个过程是这样的:客户端发出请求,服务器接收到请求之后,返回一个响应。这种消息的交换是进程间通信的一个典型例子。服务器组件不断地监听来自客户端的请求,一旦收到请求,服务器就会处理这个请求,然后把响应发送回客户端。根据不同的需求,服务器可以被进一步分为无状态服务器和有状态服务器。
- 有状态:有状态服务器会记住客户端从一个请求到下一个请求之间的数据(状态),存储会话状态,并跟踪诸如哪些客户端打开了哪些文件、文件的当前读写指针位置、哪些文件被哪些客户端锁定等信息。
- 无状态:无状态服务器则不保留任何状态信息,不存储任何会话状态,这意味着每个客户端的请求都是独立处理的,不属于任何新的或现有的会话。
为了能够同时处理多个客户端的请求,服务器常常采用主从模式。在这种模式下,主服务器不断监听客户端的请求。当收到一个请求时,主服务器会创建一个从服务器来处理这个请求,同时自己继续监听其他请求。与此同时,从服务器负责执行与客户端的所有后续通信。
如图5-14所示可以清晰地解释这种典型的客户端-服务器交互过程。
3、浏览器通常如何与服务器交互
- 首先,用户在浏览器中输入一个网站或文件的URL(统一资源定位符)。接着,浏览器向DNS(域名系统)服务器发送一个请求(如图5-15所示)。
- DNS服务器的任务是查找并确定网站服务器的具体地址。
- 当DNS服务器找到了网站服务器的地址后,它会回应并提供该网站服务器的IP地址。
- 有了网站服务器的IP地址(由DNS服务器提供)之后,浏览器就会向该IP发送一个HTTP/HTTPS的请求。
- 服务器接收到请求后,会发送回网站所需的文件。
- 最后,浏览器将这些文件进行渲染,然后网站内容就会在用户面前显示出来。这个渲染过程是通过DOM(文档对象模型)解释器、CSS解释器和JS引擎共同完成的,这些组件统称为JIT(即时编译器)。
4、客户端-服务器模型的优点
- 中心化:客户端-服务器网络的一个主要优势在于集中控制。所有关键信息都储存在一个地方,这对网络管理员来说尤其有利,因为他们可以完全控制管理和行政工作。网络中的任何问题都可以在同一个地方得到解决。同时,更新资源和数据也变得更加简单和高效。
- 安全性:在客户端-服务器网络的集中式架构中,数据的安全性得到了很好的保障。可以实施访问控制,确保只有授权用户可以访问,比如使用用户名和密码等凭证。此外,如果数据丢失,可以从中央备份轻松恢复。
- 可伸缩性:客户端-服务器网络具备很高的可伸缩性。用户可以根据需要增加资源,如增加客户端和服务器。扩展服务器的规模基本上不会导致中断,并且即使网络规模扩大,也不会有获取网络资源权限的问题,因为服务器是集中管理的。因此,所需的配置工作量较小。
- 易于管理:所有文件都存储在中心服务器上,使得文件管理变得更加容易。客户端-服务器网络能够方便地追踪和定位所需文件的记录。
- 可访问性:在客户端-服务器网络中,无论位置或平台如何,每个客户端都能登录系统。这使得所有用户都可以轻松访问他们的企业信息,而不需要依赖特定的终端模式或处理器。
5、客户端-服务器模型的缺点
- 流量拥堵:客户端-服务器网络的一个主要弱点是流量拥堵。如果过多的客户端同时向同一服务器发送请求,可能会导致服务器崩溃或连接速度降低。服务器过载会在访问信息时带来各种问题。
- 健壮性差:我们知道,客户端-服务器网络是集中式的。如果主服务器出现故障或受到干扰,整个网络可能会中断。因此,这种网络结构缺乏健壮性。
- 成本高:在客户端-服务器网络中,设置和维护服务器有时是一笔昂贵的开销。由于这类网络功能强大,其购买成本可能相当高,这可能不是所有用户都负担得起的。
- 难****维护:服务器一旦开始运行,通常会持续不断地工作。这就意味着每个服务器都需要得到适当的关注。任何问题的出现都需要立即解决,不能有任何延误。因此,应该由专业的网络管理员来负责服务器的维护。
6、小结
客户端-服务器模型是网络通信的一个基础模式。它描述了两台计算机------客户端和服务器------如何通过网络进行交互。在这个模型中,客户端是发起请求的计算机。当客户端需要某种服务或数据时,它向服务器发送一个请求。而服务器,则是接收并响应这些请求的计算机。
有些情况下,服务器在处理客户端的请求时,可能需要查询数据库以获取所需的信息。这时,服务器本身就扮演了客户端的角色,向数据库服务器发送请求。数据库服务器处理这些请求,并将所需的信息回送给原服务器。然后,原服务器再以此信息响应最初的客户端请求。在这个过程中,数据库可以被视为一种特殊类型的服务器,专门用于存储和管理数据。