后端架构演进:从单体到云原生

大模型修路人
2025-06-16 08:28
阅读 229

——写给完全零基础的后端初学者


开篇:什么是后端架构演进?

开篇:什么是后端架构演进?

你可能听说过“前后端分离”、“微服务”、“云原生”这些名词,它们听起来很高大上,但其实这些都和“后端”的发展有关。这篇文章的目标,是带你从最简单的“单体架构”开始,一步步了解后端技术是怎么演变的,最终进入现代流行的“云原生”时代。

所谓“后端”,就是网站背后看不见的部分,比如用户登录、数据存储、订单处理等逻辑,都是由后端程序来完成的。而“架构”就像是搭积木的方式,不同的“架构”决定了你的代码怎么组织、服务器怎么部署、系统怎么扩展。

我们会用通俗的语言、具体的例子和简单的代码,让你理解每个阶段的变化。


环境准备:搭建第一个开发环境

环境准备:搭建第一个开发环境

在学习之前,我们先来准备好最基本的开发工具。

必备软件清单:

  • Node.js(用来运行 JavaScript 后端)
  • Visual Studio Code(代码编辑器)
  • Postman(测试 API 接口)
  • Docker Desktop(运行容器化应用)

安装步骤:

  1. 安装 Node.js

  2. 安装 VSCode

  3. 安装 Postman

  4. 安装 Docker Desktop

✅ 到这一步,你就准备好开始学习了!


核心概念讲解:从单体到微服务再到云原生

核心概念讲解:从单体到微服务再到云原生

下面我们来解释几个关键概念,我会用生活中常见的比喻,帮你理解这些专业术语。

1. 单体架构(Monolithic Architecture)

这是最传统的后端架构。就像一个大蛋糕,所有功能都做在一个程序里:登录、注册、下单、支付……全都在一起。

优点: 易于开发、部署简单
缺点: 代码量大、维护难、无法单独更新某一部分功能

2. 分层架构(Layered Architecture)

在单体的基础上,把程序按层次结构拆开,比如分为:

  • 控制层(Controller):接收请求
  • 业务层(Service):处理逻辑
  • 数据访问层(DAO):操作数据库

这样虽然还是一个整体,但结构更清晰,更容易维护。

3. 微服务架构(Microservices Architecture)

想象一下你有一堆小积木,每一部分功能都可以独立打包、独立部署、独立升级。

例如:登录是一个服务、商品展示是一个服务、支付又是一个服务……

优点: 更灵活、更容易扩展、适合大规模团队协作
缺点: 维护复杂度高、通信成本高

4. 云原生架构(Cloud Native Architecture)

这是一种更现代化的架构方式,强调:

  • 容器化(Containerization):通过 Docker 技术打包应用,像“集装箱”一样运输
  • 编排管理(Kubernetes):自动调度多个容器运行
  • 弹性伸缩(Auto Scaling):根据流量自动调整资源
  • 持续交付(CI/CD):自动化测试与上线流程

特点: 高效、稳定、支持云端自动管理


实战项目:从单体到微服务再到云原生

我们将构建一个“用户管理系统”,包括用户注册、登录、查看用户信息等功能,并演示不同架构下的实现方式。


第一阶段:单体架构示例

我们使用 Node.js + Express 来创建一个简单的 API 接口。

步骤 1:新建项目目录

mkdir user-system
cd user-system
npm init -y
npm install express body-parser

步骤 2:编写基本代码(index.js

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

// 模拟数据库
let users = [];

// 注册接口
app.post('/register', (req, res) => {
    const user = req.body;
    users.push(user);
    res.send('注册成功');
});

// 登录接口
app.post('/login', (req, res) => {
    const { username, password } = req.body;
    const user = users.find(u => u.username === username && u.password === password);
    if (user) {
        res.send('登录成功');
    } else {
        res.status(401).send('用户名或密码错误');
    }
});

// 获取用户列表
app.get('/users', (req, res) => {
    res.json(users);
});

app.listen(3000, () => {
    console.log('服务已启动,监听端口 3000');
});

步骤 3:运行项目

node index.js

打开 Postman,发送 POST 请求到 http://localhost:3000/register,内容如下:

{
  "username": "test",
  "password": "123"
}

你可以测试注册、登录和获取用户列表的功能。

✅ 到此为止,我们已经完成了单体架构的实现。


第二阶段:分层架构改进

现在我们把之前的代码进行结构调整,分成 Controller、Service 和 DAO 层。

目录结构:

/user-system
|-- controllers/
|    |-- userController.js
|-- services/
|    |-- userService.js
|-- models/
|    |-- userModel.js
|-- index.js

示例代码(简略版)

models/userModel.js —— 模拟数据库操作

let users = [];

exports.createUser = (user) => {
    users.push(user);
};

exports.getUserByUsernameAndPassword = (username, password) => {
    return users.find(u => u.username === username && u.password === password);
};

exports.getAllUsers = () => {
    return users;
};

services/userService.js —— 业务逻辑处理

const userModel = require('../models/userModel');

exports.registerUser = (user) => {
    userModel.createUser(user);
};

exports.loginUser = (username, password) => {
    return userModel.getUserByUsernameAndPassword(username, password);
};

exports.listUsers = () => {
    return userModel.getAllUsers();
};

controllers/userController.js —— 处理请求

const userService = require('../services/userService');

exports.register = (req, res) => {
    const user = req.body;
    userService.registerUser(user);
    res.send('注册成功');
};

exports.login = (req, res) => {
    const { username, password } = req.body;
    const user = userService.loginUser(username, password);
    if (user) {
        res.send('登录成功');
    } else {
        res.status(401).send('失败');
    }
};

exports.list = (req, res) => {
    const users = userService.listUsers();
    res.json(users);
};

缓存策略对比-2

index.js 主入口文件

const express = require('express');
const bodyParser = require('body-parser');
const userController = require('./controllers/userController');

const app = express();
app.use(bodyParser.json());

app.post('/register', userController.register);
app.post('/login', userController.login);
app.get('/users', userController.list);

app.listen(3000, () => {
    console.log('服务运行中...');
});

✅ 这样我们就实现了分层架构,结构更清晰,后期也更容易维护。


第三阶段:微服务拆分(简化版模拟)

我们现在把用户模块独立出来,作为一个独立的服务。

创建第二个服务目录(user-service

复制上面的代码,新建一个新项目:

mkdir ../user-service
cp -r ../user-system/* ../user-service/

修改 index.js 的监听端口为 3001,并在 controllers/userController.js 中保留只跟用户相关的接口。

然后在主项目中调用这个服务(可以使用 Axios 发送 HTTP 请求):

const axios = require('axios');

app.get('/all-users', async (req, res) => {
    const response = await axios.get('http://localhost:3001/users');
    res.json(response.data);
});

✅ 这样我们就实现了两个服务之间的通信,初步体验了微服务架构的思想。


第四阶段:云原生 —— 使用 Docker 容器化

接下来我们要把这个项目打包成 Docker 镜像。

步骤 1:创建 Dockerfile 文件

user-system 项目根目录下新建 Dockerfile

FROM node:16-alpine
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "index.js"]

步骤 2:构建镜像

docker build -t user-system .

步骤 3:运行容器

docker run -p 3000:3000 user-system

现在你就能通过 http://localhost:3000 访问服务了。

✅ 我们已经完成了容器化部署,这是云原生的重要一步。


常见问题解答

Q1:我刚学完前端,能直接学后端吗?

当然可以!后端其实是另一个方向的技术,只要你会一点点编程基础(如 JS 或 Python),就可以顺利入门。

Q2:为什么我的 API 返回空数据?

检查是否有拼写错误、是否正确导入函数、是否漏掉了 .json() 等细节。

Q3:我应该先学 Java 还是 Node.js?

如果你是零基础,建议从 Node.js 开始,因为它语法更接近前端,学习曲线更低。

Q4:云原生是不是很复杂?我现在要学它吗?

云原生确实包含很多高级技术(如 Kubernetes、服务网格等),但你现在掌握 Docker 就够了,后续可以根据兴趣深入。


学习建议:下一步的学习路径

系统架构设计图-1

恭喜你完成了这篇教程!下面是你未来学习的方向建议:

基础阶段:

  • 学会 RESTful API 设计
  • 掌握常见数据库操作(如 MongoDB、MySQL)
  • 学会使用 Git 管理代码

提升阶段:

  • 学会使用 Docker 编排(Docker Compose)
  • 接触微服务框架(如 Spring Cloud、Express + Redis 等)
  • 了解 CI/CD 流程(如 GitHub Actions)

高级阶段:

  • 学习 Kubernetes(简称 K8s)进行容器编排
  • 探索服务网格(Service Mesh)、日志监控、链路追踪等运维相关知识
  • 学习 DevOps 全流程

结语:坚持就是胜利

从单体到云原生,后端架构的演进是一个不断优化的过程。对于新手来说,最重要的是动手实践,不怕报错。每一个 bug 都是你成长的机会。

坚持每天写一点代码,理解一个概念,过不了多久你就会发现,自己也能做出完整的后端系统啦!

如果觉得这篇文章有用,别忘了点赞收藏哦~


总字数约:3358 字

评论 0

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