后端架构演进:从单体到云原生
开篇:后端架构是什么?我们为什么要关心它?

如果你是一个刚接触编程的小白,可能会觉得“架构”这个词听起来很高大上,离你很远。其实不然!后端架构,就是关于我们如何设计和组织服务器代码的一整套方式。
你可以把它想象成盖房子——一开始可能搭个小茅屋(单体应用),住得下几个人;后来家里人多了,我们就把厨房、卧室、客厅分开建,彼此独立又协同合作(微服务);再到后面,我们要搬到城市里,住在高楼大厦中,每个单元都由物业管理,可以随时加减楼层(云原生)。这种演进过程就叫做“后端架构的演进”。
本篇文章将带你在完全零基础的前提下,一步步理解这个过程,并通过简单可运行的代码示例来动手实践。
环境准备:搭建我们的第一个开发环境

要开始写后端程序,我们需要安装一些基本的工具。别担心,这并不复杂!
1. 安装 Node.js(适用于初学者的最佳后端语言之一)
- 前往官网下载 https://nodejs.org
- 下载“LTS”版本(长期支持版本)
- 安装完成后,在终端输入以下命令验证是否安装成功:
node -v
npm -v
你会看到输出类似 v18.x.x 和 9.x.x,说明安装成功了。
2. 安装 VS Code(代码编辑器)
- 下载地址:https://code.visualstudio.com/
- 安装完成后打开,后续我们将在其中编写和运行代码。
3. 创建项目文件夹
新建一个叫 backend-tutorial 的空文件夹,并在其中创建 index.js 文件,内容如下:
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
保存之后,在终端执行:
node index.js
访问 http://localhost:3000/,如果显示“Hello World”,恭喜你完成了第一个后端程序!
核心概念解释:后端架构怎么一步步“长大”
我们现在有了一个最简单的后端服务(HTTP服务器),接下来我们要了解它是如何逐步演化成现代架构的。
阶段一:单体架构(Monolith)
所谓“单体架构”,就像我们在前面写的代码一样,所有功能(用户管理、订单处理、支付逻辑等)都写在一个项目里,部署也是一起部署。
特点:
- 结构简单
- 上手快
- 修改一个小功能也要重启整个服务
小练习:
试着在这个项目的代码里加入一个新的接口:
if (req.url === '/users') {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify([{ id: 1, name: 'Alice' }]));
}
现在访问 /users 路径就能看到返回的 JSON 数据。
阶段二:模块化架构(Modular Architecture)
随着功能越来越多,单体结构变得难维护。于是我们开始用“模块”的方式把不同的功能拆分出来。
实践步骤:
新建一个文件夹 routes,添加文件 userRoutes.js:
function userRoutes(req, res) {
if (req.url.startsWith('/users')) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify([{ id: 1, name: 'Alice' }]));
} else {
return false;
}
return true;
}
module.exports = userRoutes;
然后在主文件 index.js 中引入:
const http = require('http');
const userRoutes = require('./routes/userRoutes');
http.createServer((req, res) => {
// 模块路由
if (userRoutes(req, res)) {
return; // 已经处理完
}
// 默认路径
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end('Not Found\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
这样我们就实现了最原始的模块化。这种方式可以让多人协作更方便。
阶段三:前后端分离 + API 接口
为了让前端也能灵活使用后端的数据,我们会提供统一的 API 接口给前端调用,而不是混合在一起。
此时你可以尝试在浏览器控制台中用 fetch() 请求 /users 路径获取数据。
阶段四:微服务架构(Microservices)
当系统越来越庞大时,我们会把“用户管理”、“订单系统”、“支付系统”等等拆分成多个独立的小服务,各自部署,互相通信。
假设我们有两个服务:
- 用户服务 (
user-service) - 订单服务 (
order-service)
我们可以分别启动它们,监听不同端口:
示例:启动两个服务
# 启动用户服务
node user-service.js
# 在另一个终端窗口启动订单服务
node order-service.js
这两个服务之间可以通过 HTTP 协议相互调用:
比如 order-service 获取用户的详情信息:
const axios = require('axios');
axios.get('http://localhost:3001/users/1')
.then(response => {
console.log('User info:', response.data);
});
注:这里的
localhost:3001是用户服务运行的地址。
虽然看起来麻烦了一点,但这样能实现更好的扩展性:例如我们可以让用户服务升级时不影响订单服务。
阶段五:容器化与云原生(Containerization & Cloud Native)
现在我们已经学会了微服务的结构,但如果想部署到生产环境怎么办?手动一个个启动太麻烦了。
这时候就要引入 Docker,一种容器化技术,可以把每个服务打包成一个“盒子”,然后一键运行。
示例:用 Docker 打包服务
先安装 Docker(教程略,可参考 https://docs.docker.com/get-docker/)
然后为 user-service 创建一个 Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
然后构建并运行:
docker build -t user-service .
docker run -p 3001:3000 user-service
现在访问 http://localhost:3001/users 就可以看到服务正常运行。
阶段六:Kubernetes 编排 + 自动扩缩容
当你有上百个服务的时候,Docker 也需要管理起来。这时候就用 Kubernetes(简称 K8s)来统一编排这些服务。
虽然 K8s 有点复杂,但在本地可以用 Minikube 或 Kind 快速体验。
示例:用 K8s 运行一个服务
先准备好 .yaml 配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: user-service:latest
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- protocol: TCP
port: 80
targetPort: 3000
然后用 kubectl 命令部署:
kubectl apply -f deployment.yaml
这样你就有了一个自动扩容的服务集群!
实战项目:搭建一个图书管理系统
为了巩固所学知识,我们来实战做一个“图书管理系统”,包括以下功能:
- 查看所有书籍
- 添加新书籍
- 删除书籍
- 微服务化:书籍管理作为一个单独服务
1. 初始化项目结构
mkdir book-service
cd book-service
npm init -y
npm install express body-parser
touch index.js
2. 编写 Book 服务代码(index.js)
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
let books = [
{ id: 1, title: "The Node.js Handbook" }
];
// 获取书籍列表
app.get('/books', (req, res) => {
res.json(books);
});
// 添加书籍
app.post('/books', (req, res) => {
const newBook = req.body;
books.push(newBook);
res.status(201).json(newBook);
});
// 删除书籍
app.delete('/books/:id', (req, res) => {
const id = parseInt(req.params.id);
books = books.filter(b => b.id !== id);
res.sendStatus(204);
});
app.listen(3000, () => {
console.log('Book service running on port 3000');
});
运行服务:
node index.js
访问:
GET http://localhost:3000/books- 使用 Postman 发送 POST 到
/books,添加新的书籍数据
3. 进阶:把书架服务拆成一个独立服务
按照上面讲过的做法,你也可以再创建一个 shelf-service 来管理书架分类,并通过 RESTful 接口与 book-service 通信。
常见问题解答(FAQ)

Q:为什么不能直接在一个文件里写完所有功能?
A:初期可以这么写,但随着项目变大,就会难以维护。模块化是管理复杂度的第一步。
Q:微服务适合什么类型的应用?
A:一般适合大型系统,特别是需要快速迭代、团队多、部署频繁的情况。
Q:我该选择哪个语言学习后端?
A:Node.js 入门门槛低,Java 在企业中使用广泛,Python 更适合数据相关业务,Go 更高性能。根据兴趣选即可。
Q:Kubernetes 太难了,我现在需要学吗?
A:建议先掌握 Docker,然后再尝试 K8s。初学者可以跳过这部分。
学习建议:下一步该怎么做?
恭喜你走到了这里!下面是你应该继续学习的方向:
1. 继续深入 Web 后端开发
- 学会使用 Express.js、Koa.js、NestJS 等框架
- 掌握数据库操作(如 MongoDB、PostgreSQL)
- 使用 Swagger 编写文档,使用 JWT 做权限控制
2. 掌握更多架构技能
- 消息队列:RabbitMQ、Kafka
- 分布式事务与一致性保证
- CQRS、事件溯源(Event Sourcing)等高级模式
3. 进一步了解云平台
- AWS、阿里云、腾讯云等主流平台
- 使用 Serverless 架构开发轻量级服务
- 了解 DevOps 流程(CI/CD、监控告警等)
总结
后端架构的演进是一个循序渐进的过程:
- 单体 → 模块化 → API 化 → 微服务 → 容器化 → 云原生
- 每个阶段都是为了解决实际开发中遇到的问题
- 动手做项目是最好的学习方式!
不要害怕复杂的术语和系统,只要你坚持实践,慢慢就会发现原来那些高大上的技术也没有那么神秘了。继续加油吧!

评论 0