后端架构演进:从单体到云原生 —— 面向零基础的图文教程
🌟 开篇:我们为什么需要了解后端架构?

想象一下你正在写一个简单的网站,比如“记账本”。最初你一个人写代码、用数据库、前后端都在一起,这在技术上叫做单体应用。它很适合入门学习,但当用户越来越多、功能越来越复杂时,你会发现它越来越慢、越来越难维护。
于是,我们就有了新的架构方式:微服务、容器化部署、云原生。
目标:本教程将带你一步步从最初的单体应用开始,经历微服务拆分、使用Docker打包、再部署到Kubernetes集群中。全程有简单明了的图解和代码实例。
🔧 环境准备(Windows/macOS/Linux通用)

1. 安装必要的工具包
我们使用的是Node.js + Express(作为后端框架),Docker 和 Minikube(本地Kubernetes环境)。
| 工具 | 功能 | 官网 |
|---|---|---|
| Node.js | 运行JavaScript后端程序 | https://nodejs.org |
| npm / yarn | 包管理器 | 自带安装 |
| Docker Desktop | 容器运行环境 | https://www.docker.com/products/docker-desktop |
| kubectl | Kubernetes客户端 | 自动安装在Docker中 |
| Minikube | 本地K8s环境模拟器 | https://minikube.sigs.k8s.io/docs/start/ |
✅ 推荐版本
- Node.js v18.x 或 v20.x
- Docker Desktop 最新稳定版
📚 核心概念通俗讲解(不背术语也能懂)
✅ 单体应用(Monolith)
类比:一锅炖菜,所有食材放在一起煮
- 全部功能在一个项目里
- 所有数据放在一个数据库
- 修改任意部分都要重新部署整个应用
优点:
- 简单易上手
- 不需要复杂的配置
缺点:
- 膨胀后难以维护
- 性能瓶颈高
- 扩展困难
✅ 微服务(Microservices)
类比:每道菜分开做,最后摆成一道大餐
把原来的大应用拆分成多个小服务:
| 模块 | 职责 |
|---|---|
| 用户服务 | 注册、登录 |
| 订单服务 | 下单、退款 |
| 支付服务 | 支付接口、交易记录 |
这些服务可以独立开发、测试、部署、扩展。
✅ Docker容器(Containerization)
类比:给每个微服务打包成“快递箱”,箱子内自带一切依赖
- 避免“在我电脑上能跑”的问题
- 更容易移植、部署
✅ Kubernetes(简称 K8s)
类比:快递仓库管理员,帮你安排谁先发货、谁出故障要换人等
- 自动部署、扩缩容
- 健康检查
- 失败重启
- 服务发现与负载均衡
💡 实战项目:从单体到微服务再到云原生
我们将构建一个最简单的记账系统,包括两个模块:
- 用户管理(注册、登录)
- 账单管理(创建、查看账单)
我们一步一步来:
第一步:搭建一个单体服务(Express + MongoDB)
1. 初始化项目
mkdir accounting-app
cd accounting-app
npm init -y
npm install express mongoose body-parser
2. 创建服务器入口文件 index.js
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
// 用户模型
const User = mongoose.model('User', new mongoose.Schema({ name: String, balance: Number }));
// 创建用户
app.post('/users', async (req, res) => {
const user = new User(req.body);
await user.save();
res.send(user);
});
// 获取账单(假设这里只是个示例)
app.get('/bills', (req, res) => {
res.json([{ id: 1, description: '吃饭' }]);
});
// 连接数据库
mongoose.connect('mongodb://localhost:27017/accounting', { useNewUrlParser: true, useUnifiedTopology: true });
app.listen(3000, () => {
console.log('单体服务启动于 http://localhost:3000');
});
3. 运行服务
node index.js
你可以通过 Postman 发送 POST 请求到 /users 来添加一个用户。
第二步:拆分成两个微服务(用户服务 + 账单服务)
我们分别创建两个服务目录:
microservices/
├── user-service/
└── bill-service/
user-service/index.js
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const User = mongoose.model('User', new mongoose.Schema({ name: String, balance: Number }));
app.post('/users', async (req, res) => {
const user = new User(req.body);
await user.save();
res.send(user);
});
mongoose.connect('mongodb://localhost:27017/users', { useNewUrlParser: true, useUnifiedTopology: true });
app.listen(4000, () => {
console.log('用户服务启动于 http://localhost:4000');
});
bill-service/index.js
const express = require('express');
const app = express();
app.get('/bills', (req, res) => {
res.json([{ id: 1, description: '吃饭' }]);
});
app.listen(5000, () => {
console.log('账单服务启动于 http://localhost:5000');
});
分别运行这两个服务:
cd user-service && node index.js
cd ../bill-service && node index.js
第三步:打包为 Docker 镜像
创建 Dockerfile(以用户服务为例)
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD ["node", "index.js"]
构建镜像并运行容器
docker build -t user-service .
docker run -d -p 4000:4000 user-service
同样为账单服务打包:
docker build -t bill-service -f Dockerfile.bill .
docker run -d -p 5000:5000 bill-service
现在你已经拥有两个可独立运行的微服务容器!
第四步:部署到 Kubernetes(Minikube)
我们使用 kubectl 和 YAML 配置文件来部署服务。
创建 Kubernetes Deployment 文件 user-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
replicas: 2
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: user-service
ports:
- containerPort: 4000
应用这个部署:
kubectl apply -f user-deployment.yaml
kubectl get pods
你会看到类似输出:
NAME READY STATUS
user-service-6498f8699-gwz8h 1/1 Running
user-service-6498f8699-mxvkt 1/1 Running
同理创建账单服务的 bill-deployment.yaml 并部署。
第五步:体验云原生能力(自动扩缩容)
设置自动扩缩容(HPA)
kubectl autoscale deployment user-service --cpu-percent=50 --min=2 --max=5
意思是:如果CPU使用超过50%,就自动增加副本数量,最多不超过5个。
这就是 K8s 的弹性调度能力。
❓ 常见问题解答(FAQ)
| 问题 | 解答 |
|---|---|
| Docker提示“no such file or directory” | 检查Dockerfile路径是否正确,确保在对应目录下执行命令 |
| MongoDB连接失败 | 确保你已安装MongoDB,并启动了服务 |
| Kubernetes无法获取Pod状态 | 可能是Minikube未启动,请运行 minikube start |
| “kubectl is not found”怎么办? | Docker Desktop 安装完成后会自带kubectl;若未找到,请单独安装或检查PATH环境变量 |
| 如何查看容器日志? | 使用命令:docker logs <容器ID> 或 kubectl logs <pod名称> |
🚀 学习建议(下一步该学什么?)
恭喜你完成了整个项目的实战!接下来,你可以沿着以下方向继续深入:
👨💻 技术进阶路线图
- API网关(如Nginx / Kong / Zuul)——统一处理请求路由
- 服务发现 & 注册(如Consul / Etcd)——实现更智能的服务通信
- 配置中心(如Spring Cloud Config)——集中管理不同环境的配置
- 监控报警(Prometheus + Grafana)——实时观察服务健康状态
- CI/CD(Jenkins / GitLab CI)——自动化构建和部署流水线
- Serverless 架构(AWS Lambda / Google Cloud Functions)——无需关心服务器的极致伸缩
📘 总结一句话
“从一个单一的大程序,到灵活的小服务,再到自动化、弹性的云平台,这就是现代后端的进化之路。”
别怕术语多,只要肯动手实践,你就一定能掌握!
🔚 如果你喜欢这个风格,请留言告诉我你感兴趣的技术主题,我可以为你定制专属学习路径 😊

评论 0