后端架构演进:从单体到云原生 —— 面向零基础初学者的实践教程

云原生散人
2025-06-23 13:24
阅读 475

开篇:后端架构究竟是什么?为什么它在变化?

开篇:后端架构究竟是什么?为什么它在变化?

想象一下你是一家小餐馆的老板,一开始你一个人负责所有的事情——洗菜、炒菜、收银、打扫。这就像我们所说的 单体架构(Monolithic Architecture),整个系统像一个“整体”,所有的功能都写在一个程序里。

但随着生意越来越好,你发现这样效率低、问题多。于是你开始请人分工合作,有人专门做菜、有人负责前台、有人负责财务——这就类似 微服务架构(Microservices)。

再后来,你搬到一个更现代化的商圈,有了自动点餐系统、云端库存管理、无人配送机器人,这就像我们今天要讲的 云原生架构(Cloud-Native Architecture)。

这篇教程会带你从最简单的“单体”开始,逐步了解后端架构的发展历程,并通过代码示例带你在本地搭建并运行一个小项目。即使你是完全零基础的新手,也能轻松理解!


环境准备:搭建开发环境(Windows / macOS / Linux通用)

环境准备:搭建开发环境(Windows / macOS / Linux通用)

步骤一:安装基本工具

  1. Node.js + npm

  2. Docker Desktop

  3. Postman(接口测试用)

  4. VS Code(编辑器推荐)

✅ 小贴士:如果你使用的是 Mac 或 Linux,这些软件也可以直接通过命令行安装。例如:

# Ubuntu 安装 Node.js
sudo apt install nodejs npm

# 安装 Docker
sudo apt install docker.io

核心概念:一步步讲解关键术语(零基础也能听懂)

核心概念:一步步讲解关键术语(零基础也能听懂)

为了不让你被专业术语吓跑,我们用生活中的例子来解释这些概念:

术语 生活中的比喻 定义
单体架构 一个人开餐厅,自己做全部事情 所有功能集中在一个项目中
微服务架构 多人协作,各司其职 每个功能是一个独立服务,可单独部署和维护
容器化(如 Docker) 把厨房做成标准化集装箱 将应用及其依赖打包为独立单元
云原生 使用智能设备、自动化流程经营餐厅 利用云平台提供的弹性伸缩、自动部署等能力

实战项目:从“单体”到“云原生”的完整演变过程

我们将创建一个非常简单的 API:获取用户信息的服务,然后逐步将其从单体架构改造成微服务架构,并最终部署到容器环境中。

第一步:创建一个单体后端项目(Express + Node.js)

创建项目目录结构:

mkdir monolith-app
cd monolith-app
npm init -y
npm install express

编写主文件 server.js

const express = require('express');
const app = express();
const PORT = 3000;

// 单个路由处理用户数据
app.get('/users/:id', (req, res) => {
    const userId = req.params.id;
    res.json({ id: userId, name: '用户' + userId });
});

app.listen(PORT, () => {
    console.log(`单体服务运行在 http://localhost:${PORT}`);
});

运行服务:

node server.js

打开 Postman 测试接口:

  • 请求地址:http://localhost:3000/users/1
  • 预期返回:
    { "id": "1", "name": "用户1" }
    

第二步:拆分成两个微服务(User Service + Order Service)

假设我们的系统要加上订单功能,我们就把它们拆成两个服务。

目录结构:

microservices/
├── user-service/
│   └── server.js
└── order-service/
    └── server.js

user-service/server.js:

const express = require('express');
const app = express();

app.get('/users/:id', (req, res) => {
    res.json({ id: req.params.id, name: '用户' + req.params.id });
});

app.listen(3001, () => {
    console.log('User 服务运行在 http://localhost:3001');
});

order-service/server.js:

const express = require('express');
const app = express();

app.get('/orders', (req, res) => {
    res.json([{ id: 1, product: '咖啡杯' }]);
});

app.listen(3002, () => {
    console.log('Order 服务运行在 http://localhost:3002');
});

分别运行这两个服务:

# 分别进入两个目录并运行
node user-service/server.js
node order-service/server.js

用 Postman 分别访问:

  • http://localhost:3001/users/5
  • http://localhost:3002/orders

第三步:用 Docker 容器化你的服务

现在我们要把上面的两个服务打包成 Docker 容器,这样就可以在任何地方部署了。

编写 Dockerfile(以 user-service 为例)

创建文件:user-service/Dockerfile

FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
CMD ["node", "server.js"]

构建镜像:

docker build -t user-service ./user-service

运行容器:

docker run -d -p 3001:3001 user-service

同理,给 order-service 也添加对应的 Dockerfile 并构建。


第四步:部署多个服务到 Docker Compose 中

我们现在用 Docker Compose 一键启动所有服务。

创建文件:docker-compose.yml

version: '3'
services:
  user-service:
    build: ./user-service
    ports:
      - "3001:3001"

  order-service:
    build: ./order-service
    ports:
      - "3002:3002"

运行:

docker-compose up

你现在可以同时访问两个服务的 API 了!


第五步:升级为云原生架构(使用 Kubernetes 的模拟)

Kubernetes 是用于管理容器化应用的强大工具。本节我们不实际部署 K8s,而是用 Docker Desktop 提供的 Kubernetes 功能进行模拟练习。

在 VS Code 中创建以下部署文件:k8s/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: 3001
---
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - protocol: TCP
      port: 3001
      targetPort: 3001

同样为 order-service 创建对应文件。

应用配置:

确保 Kubernetes 已启用后,在终端执行:

kubectl apply -f k8s/user-deployment.yaml
kubectl apply -f k8s/order-deployment.yaml

用浏览器访问服务 IP(需配合 Ingress,这里略过细节)即可访问你的云原生服务!


常见问题解答

Q1:为什么要把一个系统拆成很多个小服务?

A:便于团队协作、提升系统的稳定性和扩展性,比如用户服务出错不会影响订单服务。

Q2:是不是每个微服务都要用不同的语言写?

A:不是必须的,可以根据团队技术栈选择,但最好保持统一以便维护。

Q3:Docker 跟虚拟机有什么区别?

A:Docker 是轻量级容器,共享操作系统内核;虚拟机是完整的操作系统拷贝,资源占用更大。

Q4:我学完这个教程,能直接找工作吗?

A:本教程适合入门打基础,正式工作还需要深入学习 DevOps、数据库优化、消息队列等内容。


学习建议:下一步该学什么?

恭喜你完成了本次实战!接下来你可以考虑以下几个方向继续深入:

  1. 进阶路线推荐

    • 数据库设计与操作(MySQL / MongoDB)
    • 使用 Redis 缓存
    • 异步通信(RabbitMQ / Kafka)
    • 认证授权(JWT / OAuth)
    • 自动化部署(CI/CD 流程)
  2. 推荐学习资料

    • 《Spring Boot 企业级开发》(Java 方向)
    • 《Node.js 开发实战》
    • Docker 官方文档:https://docs.docker.com
  3. 动手项目建议

    • 仿京东商城后端(商品 + 用户 + 订单)
    • 博客系统后台(文章管理 + 评论 + 登录)
    • 微信小程序后台接口开发

总结

从单体到云原生,我们经历了系统的不断进化。这篇文章从最基础的单体架构讲起,带着你一起搭建了一个完整的后端项目,并逐步演化成云原生架构。

希望你能通过这篇文章,建立起对后端架构的整体理解,并激发你继续深入学习的兴趣。

记住一句话:不要害怕复杂,先完成再完美。


附注:所有代码示例可在 GitHub 上找到(此处可插入你自己建立的仓库链接或引导读者搜索相关模板)。

祝你学习顺利,成为一名优秀的后端开发者!🚀

评论 0

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