目标
快速了解全栈,尤其是后端技术栈。
- 全栈项目整体架构和技术栈地图。
- 电商秒杀系统案例,串联整体架构和关键技术。
- 具体项目选型和架构设计参考。
English version: A Backend Technology Map from a Full-Stack Perspective
全栈架构总览
主链路按“大前端 + 后端”两部分理解。大前端负责端上业务逻辑、客户端框架和本地运行机制;后端负责请求接入、业务处理、数据、异步、部署运行。
| 部分 | 层级 | 主层 | 解决的问题 | 常见技术 / 模式 / 基础设施 |
|---|---|---|---|---|
| 大前端 | 1 | 前端应用层 | 端上业务逻辑、页面流程、用户交互、业务状态 | Web App、Mobile App、Mini Program、Dashboard、Content Site |
| 大前端 | 2 | Framework 层 | 页面/客户端开发范式、组件、路由、状态、API 调用 | Android、iOS、React、Vue、Rax、Next.js、Pinia、TanStack Query |
| 大前端 | 3 | 系统内核层 | 代码编译、运行时、虚拟机、渲染、线程与事件循环 | Compiler、JS VM、JVM、ART、WebView、Browser Rendering、Native Rendering |
| 后端 | 4 | 接入层 | 请求入口、路由分发、反向代理、流量控制 | Nginx、API Gateway、Web 框架:Gin、Gorilla Mux、Spring MVC |
| 后端 | 5 | 认证授权层 | 身份识别、登录态、角色权限、资源访问控制 | JWT、Session、OAuth2、OIDC、RBAC、认证框架 / 库:Better Auth |
| 后端 | 6 | 后端业务层 | 用例编排、事务边界、外部依赖调用、错误语义 | Service、Use Case、Application Service、业务状态机 |
| 后端 | 7 | 领域模型层 | 业务概念、业务规则、状态转换、领域事件 | Entity、Value Object、Aggregate、Domain Event |
| 后端 | 8 | 数据与存储层 | 数据保存、查询、缓存、搜索、上传下载 | MySQL、PostgreSQL、Redis、Elasticsearch、S3、MinIO |
| 后端 | 9 | 异步与实时层 | 削峰、耗时任务、重试、长流程、实时进度推送 | Kafka、RabbitMQ、River、工作流引擎:Temporal、Hatchet、SSE、WebSocket |
| 后端 | 10 | 框架系统层 | 后端开发框架、语言运行时、构建工具、部署运行环境 | 框架:Spring Boot、Gin、NestJS、Express、Fastify 运行时:JVM、Go runtime、Node.js runtime 构建/包管理:Maven、Gradle、Go toolchain、npm、pnpm 部署运行基础设施:Docker、Kubernetes、云运行时 |
横切能力贯穿所有层,负责安全、稳定性和可维护性。
| 横切能力 | 贯穿哪些层 | 解决的问题 | 常见技术 / 云能力 |
|---|---|---|---|
| 配置与环境 | 全部 | 多环境配置、密钥、特性开关、运行参数 | .env、Viper、Vault、Secret Manager、ConfigMap、Feature Flag |
| 安全治理 | 全部 | 防攻击、防泄露、防越权、防滥用、合规审计 | WAF、CORS、Rate Limit、KMS、IAM、Gitleaks、Trivy、bcrypt |
| 可观测性 | 全部 | 日志、指标、链路追踪、健康检查、告警、容量判断 | Prometheus、Grafana、Loki、ELK、OpenTelemetry、CloudWatch |
| 云厂商托管能力 | 全部 | 用托管资源替代自建基础设施,降低运维成本 | CDN、LB、RDS、Redis、S3/OSS/COS、SQS、EKS、Cloud Run |
| AI 治理 | 后端业务层、数据与存储层、异步与实时层、框架系统层 | Prompt 注入防护、内容安全、模型评测、成本控制、调用审计 | Guardrails、Moderation、Eval、Token Budget、Prompt Audit、Model Router |
AI 应用后端补充
AI 应用后端通常是在传统后端链路上增加模型调用、上下文检索、工具调用、异步任务和治理能力。
| AI 后端能力 | 所属链路 | 常见技术 / 模式 |
|---|---|---|
| 检索增强 | 数据与存储层、后端业务层 | RAG、Embedding Store、pgvector、Milvus、Pinecone、Weaviate |
| 任务编排 | 后端业务层、异步与实时层 | AI Use Case、Agent Workflow、Prompt Orchestration、Tool Calling、Agent Task Queue |
| 模型运行 | 框架系统层 | Ollama、vLLM、Triton、SageMaker、Vertex AI |
| 流式返回 | 异步与实时层、接入层 | Streaming Response、SSE、WebSocket |
| 治理与评测 | 横切能力 | Guardrails、Moderation、Eval、Token Budget、Prompt Audit、Model Router |
用电商秒杀系统串起来
1. 业务场景是什么
1 | 100 台手机限量抢购 |
2. 为什么用这个场景
秒杀系统适合作为后端架构案例,因为它同时包含业务闭环和系统质量要求。业务上要完成登录、资格校验、扣库存、下单、支付和取消;系统上要处理高并发、防超卖、幂等、削峰、补偿、扩容和排障。
用这个场景串后端技术栈,关键是把问题拆开,再看每类问题由哪一层后端能力解决:
1 | 业务问题 → 功能需求 → 业务层 / 领域层 / 数据层 |
3. 这个场景的需求和能力要求
这个场景的需求可以拆成两类:功能需求负责完成业务闭环,非功能需求负责保证系统在高流量、故障和业务边界条件下仍然稳定且正确。
功能需求:
| 功能需求 | 对应的后端能力 | 典型技术 / 手段 |
|---|---|---|
| 用户必须登录且有资格参与 | 认证授权层、风控能力 | Session / JWT、RBAC、资格令牌、验证码、IP / 用户限流 |
| 活动必须按时间开始和结束 | 业务规则、活动配置 | 活动配置、时间窗口校验、开关控制 |
| 库存必须能查询和扣减 | 数据与存储层、一致性控制 | Redis 库存、DB 库存、库存流水 |
| 同一用户只能抢一次 | 幂等与去重能力 | 用户维度去重 key、request_id、订单唯一索引 |
| 抢购成功后要创建订单 | 后端业务层、数据持久化 | Application Service、Order Worker、MySQL |
| 订单需要支付、取消和关闭 | 领域模型层、状态流转 | 订单状态机、领域事件、支付回调 |
| 支付超时后要释放库存 | 异步任务、补偿能力 | 延迟队列、定时任务、库存回滚 |
非功能需求可以分为高性能、高可用、高扩展和数据一致性四类:
| 类别 | 非功能需求 | 对应的后端能力 | 典型技术 / 手段 |
|---|---|---|---|
| 高性能 | 大量用户同时进入活动页 | 接入层、流量控制、静态资源加速 | CDN、Nginx、API Gateway、Rate Limit |
| 高性能 | 请求高峰不能直接打爆数据库 | 缓存、削峰、异步处理 | Redis、MQ、Worker、排队 |
| 高性能 | 热点商品访问不能拖垮系统 | 热点缓存、热点隔离、限流 | 本地缓存、Redis、Rate Limit、库存分片 |
| 高可用 | 部分组件失败后不能丢单 | 可靠消息、重试、补偿 | 本地消息表、事务消息、Retry、DLQ、补偿扫描 |
| 高可用 | 出问题要能定位 | 可观测性 | traceId、Metrics、Logs、Tracing、告警 |
| 高扩展 | 流量增长后能扩容 | 水平扩展、容量规划 | 无状态服务、多副本、Redis Cluster、MQ Cluster、Worker 扩容 |
| 数据一致性 | 100 台手机不能超卖 | 原子扣减、事务兜底 | Redis Lua、DB 乐观锁 |
| 数据一致性 | 重复请求不能重复下单 | 幂等、去重、唯一约束 | request_id、幂等表、订单唯一索引 |
| 数据一致性 | 支付超时不能长期占用库存 | 状态流转、补偿 | 延迟队列、订单关闭、库存释放 |
功能需求和非功能需求连起来,就形成秒杀系统的主链路:
1 | 准备阶段 |
秒杀系统演进路线
阶段一:单体版
1 | User → Nginx → Spring Boot / Gin 单体应用 → MySQL |
| 项 | 内容 |
|---|---|
| 目标 | 理解基础 Web 架构,实现完整业务闭环,掌握 Controller / Service / DAO |
| 能解决 | 基本下单、商品查询、用户登录、订单落库 |
| 不能解决 | 高并发下数据库压力大、库存容易超卖、单实例扩展能力有限 |
| 适用 | 小型项目、内部系统、MVP |
核心链路代码:
1 | func Seckill(ctx context.Context, userID, skuID int64) { |
相关技术栈:
| 类别 | 作用 | JS / Node | Go | Java |
|---|---|---|---|---|
| Web 框架 | 接收请求、路由分发、组织接口 | Express、NestJS、Fastify | Gin、Echo、Fiber | Spring Boot、Spring MVC |
| 数据访问 | 查询、事务、CRUD | Prisma、TypeORM、Drizzle | database/sql、GORM、sqlc、ent | MyBatis、Spring Data JPA、MyBatis-Plus |
| 基础工程 | 配置、日志、校验、项目组织 | dotenv、Pino、Zod | Viper、zap、validator | Spring Config、Logback、Hibernate Validator |
该阶段可以完成查询库存、扣库存、创建订单的完整闭环。并发升高后,请求直打数据库,库存行锁和订单写入会成为瓶颈。
阶段二:引入 Redis
1 | User |
| 项 | 内容 |
|---|---|
| 目标 | 降低数据库压力,提升热点读性能,用原子操作控制库存扣减 |
| 能解决 | 热点商品读取、库存快速扣减、重复下单初步拦截 |
| 不能解决 | 异步削峰、订单落库压力、Redis 与 DB 一致性、热 key |
| 升级信号 | Redis 扛住读写,但订单创建、支付、通知等后续链路开始阻塞 |
核心链路代码:
1 | func Seckill(ctx context.Context, userID int64, skuID string) { |
相关技术栈:
| 类别 | 作用 | JS / Node | Go | Java |
|---|---|---|---|---|
| Redis Client | 访问 Redis、执行 Lua | ioredis、node-redis | go-redis | Spring Data Redis、Lettuce、Jedis |
| 缓存与库存扣减 | 热点缓存、库存预扣、去重 | Redis Lua、lru-cache | Redis Lua、Ristretto | Redis Lua、Caffeine、Redisson |
| 限流与防刷 | 控制用户、IP、接口频率 | Bottleneck、rate-limiter-flexible | x/time/rate、redis-rate | Bucket4j、Resilience4j |
该阶段把热点库存扣减从数据库移到 Redis,提升库存判断和扣减能力。订单仍同步写入数据库,请求峰值继续升高时,数据库写入仍会堵塞。
阶段三:引入消息队列
1 | User |
| 项 | 内容 |
|---|---|
| 目标 | 削峰填谷,请求快速返回,后台异步创建订单 |
| 能解决 | 瞬时流量冲击、订单同步写入压力、耗时任务阻塞 |
| 不能解决 | 消息重复、消息丢失、MQ 堆积、库存扣了但订单失败 |
| 升级信号 | 服务模块越来越多,订单、库存、用户、支付需要独立演进和扩容 |
核心链路代码:
1 | func Seckill(ctx context.Context, userID int64, skuID, requestID string) { |
相关技术栈:
| 类别 | 作用 | JS / Node | Go | Java |
|---|---|---|---|---|
| 消息队列 | 削峰、异步下单、服务解耦 | KafkaJS、amqplib、BullMQ | kafka-go、amqp091-go、Asynq、River | Spring Kafka、Spring AMQP、RocketMQ Client |
| 消费可靠性 | 幂等、重试、死信、重复消费控制 | Idempotency Key、Retry、DLQ | Idempotency Key、Retry、DLQ | Idempotency Key、Retry、DLQ |
| 延迟任务 | 支付超时、订单关闭、库存补偿 | BullMQ、Agenda | Asynq、River | Quartz、Spring Batch、RocketMQ Delay Message |
该阶段用 MQ 削峰,请求链路快速返回,订单由 Worker 异步创建。消息重投、Worker 重启、消费失败都会出现,订单创建必须做幂等。
阶段四:服务拆分
1 | User |
| 项 | 内容 |
|---|---|
| 目标 | 支持多人协作、服务独立部署、服务独立扩展 |
| 能解决 | 用户、订单、库存等模块耦合;局部服务按需扩容;团队边界不清 |
| 不能解决 | 分布式事务复杂、链路排查困难、服务治理成本升高 |
| 限制 | 高并发优先处理缓存、削峰、限流和幂等;服务拆分适用于业务复杂度、团队规模、独立部署需求上升后的阶段 |
核心链路代码:
1 | func CreateSeckillOrder(ctx context.Context, userID int64, skuID, requestID string) { |
相关技术栈:
| 类别 | 作用 | JS / Node | Go | Java |
|---|---|---|---|---|
| 服务通信 | 服务间 RPC / HTTP 调用 | gRPC-js、tRPC、OpenAPI | gRPC-Go、Connect-Go、Resty | gRPC Java、OpenFeign、Dubbo |
| 微服务框架 | 服务治理、模块组织、团队协作 | NestJS Microservices、Moleculer | go-zero、Kratos、Kitex | Spring Cloud、Dubbo |
| 服务治理 | 注册发现、配置、限流、熔断 | Consul、etcd | Consul、etcd | Nacos、Eureka、Sentinel、Resilience4j |
| 分布式一致性 | Saga、补偿、长流程状态 | Temporal TypeScript SDK | Temporal Go SDK | Seata、Temporal Java SDK |
该阶段把用户、订单、库存拆成独立服务,可以按压力单独扩容。跨服务链路需要补偿事件,否则订单成功、库存失败、支付失败等状态会不一致。
阶段五:高可用生产版
1 | User |
| 项 | 内容 |
|---|---|
| 目标 | 支撑高并发、故障恢复、容量扩展、生产排障 |
| 能解决 | 单点故障、容量不足、线上问题不可观测、服务不可恢复 |
| 不能解决 | 架构复杂、运维成本高、分布式一致性难度高 |
| 适用 | 用户量大、核心交易链路、对可用性和容灾要求高的系统 |
核心链路代码:
1 | func SeckillHandler(ctx context.Context, req SeckillRequest) { |
相关技术栈:
| 类别 | 作用 | JS / Node | Go | Java |
|---|---|---|---|---|
| 可观测性 | 指标、日志、链路追踪、告警 | OpenTelemetry JS、prom-client、Pino | OpenTelemetry Go、Prometheus Client、zap | Micrometer、Actuator、OpenTelemetry Java Agent |
| 性能诊断 | CPU、内存、阻塞、慢调用分析 | clinic.js、0x | pprof | JFR、Arthas |
| 部署与编排 | 容器化、多副本、滚动发布、扩缩容 | Docker、Kubernetes、Helm | Docker、Kubernetes、Helm | Docker、Kubernetes、Helm |
| 基础设施高可用 | 网关、负载均衡、缓存集群、数据库集群 | Nginx、Envoy、Redis Cluster、MQ Cluster | Nginx、Envoy、Redis Cluster、MQ Cluster | Nginx、Envoy、Redis Cluster、MQ Cluster |
该阶段通过多副本、集群、限流和观测体系提升可用性。系统组件增多后,排障依赖统一 traceId、指标、日志和告警。
实际业务如何选型设计架构
架构设计从业务问题出发,选择满足需求的核心能力,并预留扩展和高可用演进空间。
判断顺序:
1 | 需求澄清 |
1. 需求澄清:先判断当前业务问题
明确业务目标、核心链路、用户规模、数据一致性要求、团队维护能力和部署环境。
需求澄清时重点问:
| 问题 | 判断点 |
|---|---|
| 业务主链路是什么 | 用户从入口到结果,中间经过哪些关键步骤 |
| 当前最大风险是什么 | 性能、数据一致性、安全、交付速度、运维 |
| 流量规模多大 | QPS、峰值、并发用户、热点数据 |
| 数据一致性要求多高 | 强一致、最终一致、允许补偿 |
| 团队能维护什么 | 单体、队列、微服务、K8s、云托管 |
| 部署环境是什么 | 本地、VPS、云厂商、K8s、Serverless |
2. 选取满足业务需求的核心能力
仅引入能解决当前问题的能力。缺少明确问题时,暂缓引入复杂组件。
| 需求信号 | 建议引入 | 不引入的风险 |
|---|---|---|
| 普通 CRUD | 前端、接入层、应用服务、Repository、数据库 | 过度设计拖慢开发 |
| 有登录、角色、资源归属 | 认证授权层 | 越权、数据泄露 |
| 有图片、附件、导出文件 | 文件与对象存储 | DB 膨胀、备份困难、访问慢 |
| 有耗时任务 | Job Queue | 请求超时、用户等待、失败难重试 |
| 有瞬时高并发 | Redis、限流、MQ | DB 被打爆、接口雪崩 |
| 有多步骤长流程 | Workflow Engine | 状态丢失、失败恢复困难、重试混乱 |
| 需要进度条或通知 | SSE / WebSocket | 轮询体验差、压力大 |
| 要上公网生产 | 安全治理 | 被刷、被攻击、密钥泄露 |
| 要稳定运维 | 可观测性 | 出问题不知道原因 |
| 多环境部署 | 配置与环境层 | 配置混乱、环境不可复现 |
| 运维能力不足 | 云厂商托管能力 | 自建成本高、故障恢复慢 |
| 业务规则复杂 | 领域模型层 | 规则散落,后期难维护 |
| 需要长期演进 | 模块化边界 / Clean Architecture / DDD | 代码耦合,功能越多越难改 |
3. 未来高扩展、高可用考虑
未来设计重点是关键位置预留演进空间,避免初始方案过重。
| 未来诉求 | 提前预留什么 | 触发升级条件 |
|---|---|---|
| 流量增长 | 无状态服务、缓存接口、限流点 | 单机 CPU / DB / 网络成为瓶颈 |
| 数据量增长 | 索引、归档、分区、读写分离可能性 | 慢查询、表过大、备份恢复变慢 |
| 高并发峰值 | Redis、MQ、排队、幂等设计 | 峰值流量冲击核心链路 |
| 服务高可用 | 健康检查、多副本、自动重启 | 单实例故障会影响核心业务 |
| 故障排查 | 日志、指标、trace id、告警 | 线上问题无法定位 |
| 多环境交付 | 配置分层、Secret 管理、CI/CD | 开发、测试、生产配置开始分裂 |
| 团队扩大 | 模块边界、接口契约、代码规范 | 多人修改相同模块冲突频繁 |
| 运维复杂 | 云托管服务、IaC、标准化部署 | 自建组件维护成本过高 |
架构选型准则:
- 先确认当前瓶颈,再选择组件。
- 新组件必须直接解决明确问题。
- 组件收益要大于引入后的开发、运维和排障成本。
- 架构复杂度要匹配团队维护能力。
- 没有实际问题时,不提前引入重型方案。
常见误区:
- 高并发问题未出现时,引入 Kafka、Kubernetes、微服务。
- 普通 CRUD 项目套用完整 DDD。
- 运维能力不足时,自建大量基础设施。
- 用云厂商产品列表代替架构设计。
- 罗列技术名词,缺少问题、代价和适用条件。
4. 常见场景的选型
按业务场景先确定基础架构,再按具体能力补充组件。
| 场景 | 推荐架构 / 落地形态 | 说明 |
|---|---|---|
| 内部工具 / 管理后台 | 模块化单体 + CRUD + RBAC | 交付速度、权限边界和数据操作效率优先 |
| 博客 / 内容站 | CMS / Static Site / CDN / Cache | 读多写少,发布流程、缓存和访问速度优先 |
| SaaS 初版 | 模块化单体 + Auth + Tenant Model + Job Queue | 先保证模块边界、租户模型和异步任务 |
| 电商 / 交易 | API + Service + DB + Cache + MQ + Idempotency | 库存、订单、支付、状态一致性优先 |
| 秒杀 / 抢购 / 票务 | Gateway + Redis + MQ + Worker + DB + Rate Limit | 热点、削峰、幂等和补偿优先 |
| AI 应用 | Client → API / BFF → Application Service → Agent Orchestration → AI Infrastructure | 应用层负责业务用例,Agent 编排层负责规划和工具调用;AI Infrastructure 包括 Model Gateway、Tool Adapters、Memory Store、Queue / Worker |
| 多团队复杂业务 | 模块化单体或微服务 + API Contract + Observability | 业务边界、接口契约和独立交付能力优先 |
按能力补充组件:
| 需求 | 建议补充 | 说明 |
|---|---|---|
| 文件上传 / 导出 | Object Storage + Job Queue | 文件不直接塞业务库,导出任务异步执行 |
| 搜索 | Search Engine | 复杂检索不要压在主库上 |
| 通知 / 邮件 | Job Queue + Template + Provider Adapter | 需要重试、模板和供应商隔离 |
| 实时进度 / 在线状态 | SSE / WebSocket + Redis / MQ | 区分单向进度和双向实时通信 |
| 审批流 / 长流程 | State Machine / Workflow Engine | 需要状态恢复、重试和审计 |
| 报表分析 | OLAP / ETL / Read Replica | 分析查询与交易链路隔离 |
| 第三方集成 / Webhook | Adapter + Signature Verify + Retry + Idempotency | 防重复、防伪造、可重放 |
| 高可用生产 | Multi Replica + Observability + Backup + Rollout + Rate Limit | 覆盖运行、恢复和发布风险 |