Server-Client二层架构简单说明

核心定义

Server-Client形式的二层架构 ,通常简称为 C/S架构两层架构,是一种将系统功能或任务分配到两个不同逻辑单元上的软件架构模型:

  1. 客户端 :负责用户界面业务逻辑的呈现与交互。

  2. 服务器端 :负责数据存储管理,并提供核心的数据服务。

这里的"二层"指的是两个主要的、逻辑上分离的层次:客户端层服务器层(或数据服务层)。


两层架构的详细分解

1. 客户端
  • 角色:前端。它是用户直接与之交互的部分。

  • 主要职责

    • 展示用户界面:提供图形界面、表单、按钮等,用于输入和显示数据。

    • 执行业务逻辑:处理用户输入的数据验证、执行计算、实现应用程序的流程控制等。

    • 向服务器发送请求:根据用户操作,生成具体的请求(如查询、更新、删除数据),并发送给服务器。

    • 接收并处理服务器响应:接收服务器返回的数据或结果,并将其展示给用户。

  • 特点:通常被称为"胖客户端"或"富客户端",因为它承担了相当一部分的计算和业务处理任务。

2. 服务器端
  • 角色:后端。它是系统的核心数据和处理中心。

  • 主要职责

    • 数据管理:存储、组织和维护所有数据,通常通过数据库管理系统实现。

    • 处理客户端请求:接收来自客户端的请求,执行相应的数据库操作(如SQL查询)。

    • 确保数据一致性和安全性:管理用户权限、处理并发访问、保证数据的完整性和安全性。

    • 返回请求结果:将数据库操作的结果(数据集、成功/失败状态)返回给客户端。

  • 特点:通常被称为"数据库服务器",因为它的核心功能是响应数据请求。


工作原理(交互流程)

一个典型的交互流程如下:

  1. 请求:用户在客户端软件上进行操作(例如,点击"查询所有订单"按钮)。

  2. 处理与发送:客户端应用程序执行业务逻辑(如验证查询条件),然后将格式化好的请求(如一条SQL语句)通过网络发送给服务器。

  3. 服务器处理:服务器接收请求,验证其合法性,然后在数据库上执行相应的操作。

  4. 数据库响应:数据库完成操作后,将结果(例如,一组订单记录)返回给服务器进程。

  5. 服务器响应:服务器将数据结果打包,通过网络发送回客户端。

  6. 客户端展示:客户端接收数据,并根据业务逻辑进行处理,最后在用户界面上将结果展示出来(例如,在表格中显示订单列表)。


典型例子

  • 早期的桌面应用程序

    • MySQL客户端工具:你在自己电脑上安装一个客户端软件,它直接连接到远端的MySQL数据库服务器。

    • 早期的银行柜台系统:柜员使用的桌面程序直接连接银行的后台数据库服务器。

    • 大量企业内部管理系统:如库存管理、人事管理系统等。


优势与劣势

优势:
  1. 响应速度快:由于大部分业务逻辑在客户端处理,只有数据交互需要网络传输,所以对用户操作的响应通常很快。

  2. 界面丰富:客户端可以利用操作系统的全部功能,开发出功能强大、交互性好的用户界面。

  3. 充分利用客户端计算能力:将计算任务分摊到各个客户端,减轻了服务器的压力。

劣势:
  1. 部署和维护困难 :这是最大的缺点。任何业务逻辑的更新都需要在每一个客户端上进行安装和升级,对于用户数量多、分布广的系统来说,成本极高。

  2. 客户端负担重:客户端需要较高的硬件配置,并且安装过程复杂。

  3. 可伸缩性差:服务器通常直接与每个客户端建立连接,当客户端数量巨大时,服务器可能成为瓶颈。业务逻辑分散在客户端,难以集中优化和扩展。

  4. 安全性挑战:业务逻辑暴露在客户端,更容易被反编译和篡改,对数据安全构成威胁。


与现代三层/多层架构的对比

为了解决二层架构的问题,现代系统普遍采用三层架构

  • 表示层:只负责用户界面,相当于"瘦客户端"(如Web浏览器)。

  • 业务逻辑层 :专门处理应用程序的核心业务规则和逻辑。这是从二层架构的客户端和服务器中分离出来的独立一层。

  • 数据访问层:负责数据存储,与二层架构的服务器端类似。

核心区别 :二层架构将业务逻辑主要放在客户端,而三层架构将其抽离到一个独立的中间层。这使得系统更易于维护、升级和扩展。今天的Web应用(浏览器-Web服务器-数据库)就是典型的三层架构。

总结

Server-Client形式的二层架构是一种经典的分布式计算模型,它明确划分了客户端(负责UI和逻辑)和服务器(负责数据)的职责。虽然因其部署维护困难等问题,在Web时代逐渐被三层/多层架构所取代,但理解它对于学习系统架构的演变至关重要,并且在某些对界面性能和离线操作要求高的特定场景下,它依然有其用武之地。

相关推荐
用户479492835691510 小时前
0.1加0.2为什么不等于0.3-答不上来的都挂了
前端·javascript·面试
南山安10 小时前
React学习:Vite+React 基础架构分析
javascript·react.js·面试
yaoh.wang11 小时前
力扣(LeetCode) 66: 加一 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
a努力。13 小时前
网易Java面试被问:偏向锁在什么场景下反而降低性能?如何关闭?
java·开发语言·后端·面试·架构·c#
小鸡吃米…14 小时前
Python编程语言面试问题一
python·面试
老王熬夜敲代码15 小时前
Linux信号量
linux·笔记·面试
风止何安啊16 小时前
从 “翻页书” 到 “魔术盒”:React 路由凭啥如此丝滑?
前端·react.js·面试
程序员祥云16 小时前
港股证劵 社招 一面
前端·面试
踏浪无痕16 小时前
Nacos到底是AP还是CP?一文说清楚
分布式·后端·面试
踏浪无痕16 小时前
深入JRaft:Nacos配置中心的性能优化实践
分布式·后端·面试