后端架构演进:从单体到云原生 —— 面向零基础的图文教程

开发者小宇宙
2025-06-23 02:28
阅读 323

🌟 开篇:我们为什么需要了解后端架构?

🌟 开篇:我们为什么需要了解后端架构?

想象一下你正在写一个简单的网站,比如“记账本”。最初你一个人写代码、用数据库、前后端都在一起,这在技术上叫做单体应用。它很适合入门学习,但当用户越来越多、功能越来越复杂时,你会发现它越来越慢、越来越难维护。

于是,我们就有了新的架构方式:微服务容器化部署云原生

目标:本教程将带你一步步从最初的单体应用开始,经历微服务拆分、使用Docker打包、再部署到Kubernetes集群中。全程有简单明了的图解和代码实例。


🔧 环境准备(Windows/macOS/Linux通用)

🔧 环境准备(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)

我们使用 kubectlYAML 配置文件来部署服务。

创建 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名称>

🚀 学习建议(下一步该学什么?)

恭喜你完成了整个项目的实战!接下来,你可以沿着以下方向继续深入:

👨‍💻 技术进阶路线图

  1. API网关(如Nginx / Kong / Zuul)——统一处理请求路由
  2. 服务发现 & 注册(如Consul / Etcd)——实现更智能的服务通信
  3. 配置中心(如Spring Cloud Config)——集中管理不同环境的配置
  4. 监控报警(Prometheus + Grafana)——实时观察服务健康状态
  5. CI/CD(Jenkins / GitLab CI)——自动化构建和部署流水线
  6. Serverless 架构(AWS Lambda / Google Cloud Functions)——无需关心服务器的极致伸缩

📘 总结一句话

从一个单一的大程序,到灵活的小服务,再到自动化、弹性的云平台,这就是现代后端的进化之路。”

别怕术语多,只要肯动手实践,你就一定能掌握!


🔚 如果你喜欢这个风格,请留言告诉我你感兴趣的技术主题,我可以为你定制专属学习路径 😊

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝