ZJH

从页面到系统:前后端架构的演进地图

用一张全景图串起前端、后端、数据、部署和可观测性,理解现代 Web 系统为什么会演进成今天的样子,以及真实项目该怎么选型落地。

很多人学前端或后端时,都是从某个工具开始的:React、Vue、Node、Spring、Django、PostgreSQL、Redis、Docker。工具当然重要,但如果只记工具,很容易陷入一种焦虑:每年都有新框架,每个团队都有新架构,好像永远追不上。

更稳的理解方式,是先看系统为什么演进。

前后端架构的每一次变化,基本都在回答同一组问题:

  • 用户怎样更快看到页面。
  • 交互逻辑应该放在浏览器、服务器,还是构建阶段。
  • 业务规则应该集中在哪里。
  • 数据怎样被读取、缓存、变更和追踪。
  • 系统怎样部署、回滚、观测和扩容。
  • 团队怎样在复杂度上升后还能协作。

这篇文章不是框架排行榜,而是一张地图。读完后,你应该能知道一个真实项目从选型到上线时,前端、后端和 DevOps 各自负责什么,边界在哪里,什么时候应该简单,什么时候才需要复杂。

先看一张系统地图

一个常见 Web 系统可以先拆成这几层:

用户 / 浏览器
  |
  v
前端应用
  - 页面结构
  - 路由
  - 状态
  - 表单和交互
  - 性能体验
  |
  v
接口层
  - REST / GraphQL / RPC
  - 鉴权
  - 参数校验
  - 错误约定
  |
  v
后端服务
  - 业务规则
  - 事务
  - 权限
  - 异步任务
  - 外部系统集成
  |
  v
数据与基础设施
  - 数据库
  - 缓存
  - 对象存储
  - 队列
  - 日志 / 指标 / 链路追踪

这张图的重点不是层数,而是职责。

前端不是“写页面的地方”,它负责把产品状态变成可理解、可操作、可反馈的体验。后端不是“查数据库的地方”,它负责把业务规则变成可验证、可扩展、可运维的系统。DevOps 也不是“上线时才想起的脚本”,它负责让开发、测试、部署、回滚和观测成为重复动作。

架构是怎样演进的

第一阶段:服务器直接渲染页面

早期 Web 应用通常由后端模板直接生成 HTML。用户请求一个 URL,服务器查数据、套模板、返回页面。

它的好处很清楚:

  • 首屏简单可靠。
  • SEO 友好。
  • 前后端边界少。
  • 小团队能快速交付。

它的问题也明显:页面交互一多,模板、脚本、接口和业务逻辑会挤在一起。后端发布频率会限制前端迭代,复杂 UI 很难维护。

第二阶段:前后端分离和 SPA

前端框架兴起后,浏览器里开始承载更多状态和路由。后端提供 API,前端通过 API 拉数据、渲染页面、处理交互。

这解决了很多协作问题:

  • 前端可以独立构建复杂交互。
  • 后端可以专注 API 和业务规则。
  • 移动端、小程序、第三方客户端能复用接口。
  • 团队边界更清楚。

但 SPA 也带来新问题:首屏变慢、包体变大、SEO 和可访问性更容易被忽略,数据获取逻辑可能散落在组件里。

第三阶段:SSR、SSG、ISR 和边缘渲染

为了兼顾体验和工程效率,现代框架开始把渲染位置变成一个可选择的策略:

  • 静态生成适合内容页、文档、博客。
  • 服务端渲染适合强 SEO、强首屏、个性化页面。
  • 客户端渲染适合高度交互、登录后应用。
  • 边缘渲染适合低延迟、地域敏感、轻量个性化。

现在的重点不再是“前端还是后端渲染”,而是“每个页面、每段数据、每个交互应该放在哪里最合适”。

第四阶段:混合架构成为常态

今天更常见的是混合架构。

一个产品里可能同时存在:

  • 内容页:构建时生成。
  • 营销页:静态生成,加少量交互。
  • 控制台:客户端应用,登录后访问。
  • 详情页:服务端渲染,带缓存。
  • 后台任务:队列异步处理。
  • 管理后台:权限、审计、表单流转。

这也是为什么 React Server Components、Next.js App Router、Astro Islands、边缘函数、BFF、API Gateway、OpenTelemetry 这些概念会同时出现。它们不是为了制造复杂,而是在不同边界上重新分配责任。

现代架构的核心判断

先分清产品类型

选型之前,先判断项目更像哪一类:

内容型网站
  -> Astro / Next.js / SSG / CMS / 搜索 / RSS

业务型后台
  -> React / Vue / 表单体系 / 权限 / 数据表格 / 状态管理

交易型应用
  -> SSR / 鉴权 / 支付 / 风控 / 审计 / 可观测性

协作型 SaaS
  -> 多租户 / 实时协作 / 权限模型 / 通知 / 计费

内部工具
  -> 快速 CRUD / 权限 / 日志 / 部署简单 / 成本可控

一个博客不需要上来就微服务,一个 SaaS 控制台也不应该只靠几页静态 HTML 硬撑。架构的第一原则是匹配问题规模。

前端关注体验闭环

前端选型要回答:

  • 路由和页面怎么组织。
  • 数据在哪里获取,怎么缓存和失效。
  • 表单、错误、加载、空状态怎么统一。
  • 首屏和交互性能怎么控制。
  • 组件边界怎样服务长期维护。

对于现代前端,框架只是第一层。真正拉开差距的是状态模型、设计系统、数据请求、可访问性、错误处理和性能预算。

后端关注业务闭环

后端选型要回答:

  • 业务规则放在哪里。
  • 数据模型和事务边界怎样设计。
  • API 是否稳定、可演进、可观测。
  • 权限、审计、幂等、限流怎样处理。
  • 部署后怎样定位问题。

很多后端问题不是语言选择造成的,而是边界不清:控制器里写业务、数据库 schema 追着页面变、异步任务没有重试策略、日志只有字符串没有上下文。

DevOps 关注可重复动作

项目上线不是最后一步,而是架构的一部分。

至少要回答:

  • 本地环境怎样启动。
  • CI 怎样跑测试和构建。
  • 配置怎样按环境隔离。
  • 部署怎样回滚。
  • 错误怎样报警。
  • 日志、指标、链路追踪怎样关联。

如果一个项目只能靠某个人手动上线,它的架构还没有闭环。

真实项目如何选型

我会用这套顺序判断:

1. 先定义约束

先写清楚:

  • 用户是谁。
  • 最重要的路径是什么。
  • 首屏、SEO、登录态、实时性哪个重要。
  • 团队熟悉什么技术。
  • 部署在哪里。
  • 预算和维护周期有多长。

技术选型不是展示品位,而是减少未来的不确定性。

2. 再选渲染模式

内容多、更新频率低:优先 SSG。

强 SEO、强个性化、数据实时:考虑 SSR。

后台系统、登录后重交互:SPA 或混合渲染都可以。

部分页面静态、部分页面动态:选择支持混合模式的框架。

3. 再设计 API 边界

接口不要只跟着页面写。更好的方式是按业务动作组织:

GET /projects
GET /projects/:id
POST /projects
PATCH /projects/:id
POST /projects/:id/archive

列表、详情、创建、修改、状态流转,是比“给某个按钮写一个接口”更稳的边界。

4. 再定数据和异步模型

数据库是事实来源,缓存是性能手段,队列是削峰和异步处理手段。不要反过来。

常见判断:

  • 有强一致事务:先用关系型数据库。
  • 读多写少:加缓存,但要设计失效策略。
  • 任务耗时:放队列,记录任务状态。
  • 外部系统不稳定:加重试、幂等、超时和补偿。

5. 最后补齐上线链路

一个能进入日常开发的项目,至少应该有:

  • README 写清启动方式。
  • .env.example 写清配置项。
  • Dockerfile 或明确的运行环境。
  • CI 跑测试和构建。
  • 预览环境或 staging。
  • 错误日志和基础监控。

这些不是“高级工程化”,而是避免团队靠记忆工作。

一个推荐的默认架构

如果没有特殊约束,我会从这个默认形态开始:

Frontend
  - TypeScript
  - Astro / Next.js / React
  - 内容页静态生成
  - 登录后页面客户端增强
  - 组件和数据请求分层

Backend
  - TypeScript / Java / Python / Go 任选团队熟悉的
  - 清晰 service 层
  - PostgreSQL 作为主数据库
  - Redis 只解决明确的缓存或队列问题
  - OpenAPI 或类型约定保护接口

Delivery
  - Docker 固化运行环境
  - GitHub Actions 跑测试和构建
  - 云平台部署静态站点或容器服务
  - 日志、指标、错误报警从第一版开始接入

这个默认架构不炫技,但很耐用。它允许你先上线,再随着业务增长逐步引入更复杂的能力。

常见误区

误区一:把微服务当成先进

微服务解决的是组织和系统规模问题,不是小项目起步问题。没有自动化部署、可观测性、接口治理和团队边界,微服务只会把本来能在一个进程里解决的问题拆成网络问题。

误区二:把前后端分离当成绝对正确

前后端分离是协作方式,不是宗教。内容站、文档站、个人站完全可以让服务端或构建阶段承担更多渲染。复杂后台则适合让前端掌握更多交互状态。

误区三:把缓存当成救命药

缓存会带来失效、一致性和排查成本。先确认数据库查询、索引、接口设计和页面请求是否合理,再加缓存。

误区四:上线后才考虑观测

没有日志、指标和链路追踪,线上问题就只能靠猜。可观测性不是大公司专属,小项目也至少要有错误日志、请求日志和构建部署记录。

这组专题后面怎么读

这篇是地图。后面可以按这条路线展开:

  1. 前端:现代前端工程、渲染模式、状态管理、性能。
  2. 后端:API、服务分层、数据库、缓存、可靠性。
  3. DevOps:Docker、CI/CD、部署、监控。
  4. 工具:Git、编辑器、调试、团队约定。

真正的目标不是把每个名词都背下来,而是在做项目时能回答:

  • 这个复杂度是否值得。
  • 这个边界以后会不会拖累团队。
  • 这个方案上线后是否能排查问题。
  • 这个项目从今天到半年后还能不能维护。

延伸阅读