后端架构演进:从单体到云原生 —— 零基础入门教程

栈里有风
2025-06-22 04:02
阅读 346

开篇:什么是后端架构?我们为什么要了解它的演变?

开篇:什么是后端架构?我们为什么要了解它的演变?

在软件开发的世界里,"后端"通常指的是服务器端的代码。你可以把它理解成一个“大脑”,它负责处理用户请求、操作数据,并把结果返回给前端界面(比如网页或App)。而后端架构,就是这个“大脑”是如何组织、运作的。

随着互联网的发展,应用的规模越来越大,用户越来越多,传统的开发方式开始暴露出各种问题:系统变慢了、出错时不好排查、升级新功能要停机……为了应对这些问题,后端架构也经历了不断的演变。

本篇文章将带你从最简单的单体架构出发,一步步了解如何演化成更高级的微服务架构云原生架构。我们将用非常简单的方式来解释这些概念,并且每一个部分都会配合具体的代码示例来帮助你理解。

准备好了吗?那我们正式开始吧!


环境准备:为你的学习之旅搭建好舞台

环境准备:为你的学习之旅搭建好舞台

在动手写代码之前,你需要先准备好开发环境。我们主要需要用到以下几种工具:

1. 安装编程语言环境

我们会使用 Node.js + Express 来作为演示语言和框架,因为它们对初学者很友好,语法也比较直观。

📌 小提示:如果你会 Java 或 Python,也可以选择 Spring Boot 或 Django 来练习,但本文统一以 Node.js 为例。

安装步骤:

  1. 下载安装 Node.js → 访问官网 https://nodejs.org 下载并安装 LTS 版本。
  2. 打开终端(Mac)或命令行工具(Windows),运行下面命令确认安装是否成功:
node -v   # 查看 Node.js 版本
npm -v    # 查看 npm(Node 包管理器)版本

2. 安装 MongoDB(数据库)

我们将使用 MongoDB 作为数据存储工具,因为它上手简单,适合初学者。

  • Windows 用户可以下载 MongoDB Community Edition。
  • Mac 用户可以使用 Homebrew 安装:
brew tap mongodb/brew && brew install mongodb-community@6.0

安装完成后启动 MongoDB:

mongod

3. 安装 Postman(API 测试工具)

Postman 是一个用来测试 API 接口的工具,非常实用,可以让我们不用前端就能调试接口逻辑。

👉 下载地址

完成以上三步之后,我们的环境就准备完毕啦!


核心概念讲解:用大白话解释专业术语

核心概念讲解:用大白话解释专业术语

接下来我们要讲几个关键概念。别担心,我会用最通俗的语言来解释。

1. 单体架构(Monolithic)

这是最传统的一种架构方式。所有的功能都写在一个项目中,打个比方:就像你在一家餐馆里当服务员、厨师、经理一个人干所有事。

优点:

  • 部署简单
  • 初期开发快

缺点:

  • 项目越大越难维护
  • 修改一部分可能影响整个系统

示例项目:创建一个用户注册接口(使用 Node.js)

新建一个文件夹 my-app,然后在里面创建两个文件:

package.json(依赖配置文件)

{
  "name": "monolith-demo",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.17.2",
    "mongoose": "^6.7.1"
  }
}

系统架构设计图-1

server.js(主程序文件)

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

// 创建 Express 应用
const app = express();
app.use(express.json());

// 连接本地 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/userDB');

// 定义用户模型
const User = mongoose.model('User', new mongoose.Schema({ name: String, email: String }));

// 注册接口
app.post('/register', async (req, res) => {
  const user = new User(req.body);
  await user.save();
  res.status(201).send(user);
});

// 启动服务
app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

执行命令启动服务:

npm install
node server.js

然后你可以用 Postman 发送 POST 请求到 http://localhost:3000/register,输入 JSON 如下:

{
  "name": "小张",
  "email": "xiaozhang@example.com"
}

恭喜你完成了第一个后端接口!


2. 分层架构(Layered Architecture)

这其实是对单体架构的一个改进版。我们把一个庞大的项目拆分成多个层次,比如:控制器层(路由)、服务层(业务逻辑)、数据访问层(数据库操作)

这种结构让代码更容易阅读和维护。

示例:将上面例子改成三层架构

我们调整一下目录结构:

my-app/
├── controllers/
│   └── userController.js
├── services/
│   └── userService.js
├── models/
│   └── userModel.js
├── routes/
│   └── userRoutes.js
└── server.js

models/userModel.js(定义数据结构)

const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({ name: String, email: String });
module.exports = mongoose.model('User', userSchema);

services/userService.js(处理业务逻辑)

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

exports.createUser = async (data) => {
  return await new User(data).save();
};

controllers/userController.js(接收 HTTP 请求)

const { createUser } = require('../services/userService');

exports.registerUser = async (req, res) => {
  try {
    const user = await createUser(req.body);
    res.status(201).send(user);
  } catch (err) {
    res.status(500).send(err);
  }
};

routes/userRoutes.js(绑定路由)

const express = require('express');
const router = express.Router();
const { registerUser } = require('../controllers/userController');

router.post('/register', registerUser);
module.exports = router;

server.js(主入口)

const express = require('express');
const mongoose = require('mongoose');
const userRoutes = require('./routes/userRoutes');

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

mongoose.connect('mongodb://localhost:27017/userDB');

app.use('/api', userRoutes);

app.listen(3000, () => {
  console.log('Server is running...');
});

这种方式看起来稍微复杂一点,但能让你更好地组织代码,便于以后拓展。


3. 微服务架构(Microservices)

当我们遇到非常大的系统时,把整个应用做成一个整体已经不够用了。于是我们开始把功能拆分到不同的“小应用”中,这就是所谓的“微服务”。

比如:我们可以把“用户模块”、“支付模块”、“订单模块”分别做成独立的服务,它们各自运行、互不干扰。

这样做的好处包括:

  • 某个服务崩溃不会拖垮整个系统
  • 每个团队可专注于自己的模块
  • 更容易扩展和部署

不过也有难点,比如:

  • 服务之间如何通信?
  • 如何保证多个服务的一致性?

示例:模拟两个微服务的调用

假设我们有两个服务:

  • user-service 提供 /users 接口
  • order-service 调用 user-service 获取用户信息
user-service/server.js(用户服务)
const express = require('express');
app = express();
app.use(express.json());
app.get('/users/:id', (req, res) => {
  res.send({ id: req.params.id, name: '用户A' });
});
app.listen(3001, () => console.log('用户服务运行于3001'));
order-service/server.js(订单服务,调用用户服务)
const express = require('express');
const axios = require('axios'); // 用于发送 HTTP 请求

app = express();

app.get('/orders/:userId', async (req, res) => {
  const userId = req.params.userId;
  try {
    const response = await axios.get(`http://localhost:3001/users/${userId}`);
    res.send({
      orderId: 'ORD123',
      user: response.data,
      amount: 100
    });
  } catch (error) {
    res.status(500).send("获取用户失败");
  }
});

app.listen(3002, () => console.log('订单服务运行于3002'));

这两个服务就可以跑在不同的进程甚至服务器上,互不干扰,又能合作完成任务。


4. 云原生架构(Cloud Native)

前面说到微服务解决了系统的灵活性问题,但部署多个服务仍然麻烦:需要手动启服务、监控状态、扩容缩容……

这时候就有了“云原生”的理念。它利用现代云计算平台(如 Kubernetes、Docker)来自动生成、管理和调度这些微服务。

其核心思想是:

  • 容器化(Docker):将每个微服务打包成镜像,随时随地部署
  • 编排调度(Kubernetes):自动分配资源,自动重启故障服务
  • 服务发现与负载均衡
  • 自动化运维

虽然这一块对新手来说略复杂,但我们可以通过实践来感受一下。

实践:使用 Docker 给刚才的服务打包运行

  1. 安装 Docker → https://www.docker.com/products/docker-desktop

  2. 在 user-service 目录下新建 Dockerfile

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

构建并运行该服务:

docker build -t user-service .
docker run -p 3001:3001 user-service

同样地,你可以为 order-service 做同样的事情。

你会发现,现在只需一行命令就能启动完整服务,无需担心环境依赖,非常适合大规模部署。


实战项目:一步步实现一个多服务架构的电商应用雏形

实战项目:一步步实现一个多服务架构的电商应用雏形

项目目标

我们将实现一个小型电商网站的基础后端功能:

  • 用户注册/登录
  • 商品展示
  • 下单流程(模拟)

分为三个服务:

  • auth-service(认证)
  • product-service(商品)
  • order-service(订单)

步骤一:创建各个服务的目录结构

建议你按照下面结构搭建文件夹:

ecommerce/
├── auth-service/
├── product-service/
└── order-service/

每一个里面都按之前的结构编写 controller, service, model, route 和 server.js 文件。

我们仅展示其中一个的结构(如 order-service),其他类似:

order-service/server.js

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

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

app.get('/orders', async (req, res) => {
  // 调用 product-service
  const prodResponse = await axios.get('http://localhost:3002/products/1');
  res.send({
    products: prodResponse.data
  });
});

app.listen(3003, () => {
  console.log('Order Service running on port 3003');
});

步骤二:分别用 Docker 构建运行服务

为每个服务创建 Dockerfile,并分别用不同端口运行。

例如:

docker run -d -p 3001:3001 auth-service
docker run -d -p 3002:3002 product-service
docker run -d -p 3003:3003 order-service

现在你就有了一个完整的多服务架构应用!


常见问题解答:新手最常遇到的问题都在这儿

Q1:为什么我的代码运行不起来?

  • 确保 Node.js 已正确安装;
  • 检查包是否已通过 npm install 安装;
  • 看控制台输出是否有错误日志;
  • 如果有数据库相关问题,请确认 MongoDB 是否正在运行。

Q2:服务之间如何通信?

  • 最常用的是 HTTP 请求(可以用 axios、fetch、或者 RESTful API);
  • 对性能要求高的情况可能会用 gRPC 或者消息队列(RabbitMQ、Kafka);

Q3:微服务越多是不是越好?

  • 不一定!每个服务都会有部署和运维成本;
  • 初创项目建议采用单体+分层架构,等业务增长后再逐步拆分。

Q4:我需要掌握哪些技能才能做云原生?

  • 至少掌握一种语言(如 Node.js、Python、Java);
  • 熟悉 Git 和 Linux;
  • 学习 Docker 的使用;
  • 再深入可以学习 Kubernetes 和 CI/CD 自动化流程。

学习建议:下一步你可以学什么?

完成了今天的学习,相信你已经有了清晰的认知:

✅ 你已经学会如何构建一个基本的后端接口
✅ 你理解了从单一项目到微服务再到云原生的演进路线
✅ 你也学会了如何用 Docker 来打包部署项目

那下一步你可以怎么继续提升呢?

学习路线建议:

阶段 推荐内容
入门阶段 ✅ Node.js/Express 基础
✅ 数据库操作(MongoDB/MySQL)
✅ RESTful API 设计
中级阶段 ✅ 使用 JWT 实现登录鉴权
✅ 编写 CRUD 接口
✅ 使用 Docker
高级阶段 ✅ 微服务通信原理
✅ Kubernetes 使用
✅ 日志监控 & 异常追踪(如 ELK 技术栈)

如果你喜欢挑战,可以尝试自己构建一个完整的项目,比如:

  • 博客系统
  • 在线商城后台
  • 群聊 IM 系统

结语

负载均衡配置-2

后端架构的演变,其实反映了互联网系统越来越庞大、复杂的过程。从最初的单体架构,到现在的云原生,每一步都是为了解决实际生产中的问题。

希望这篇教程能带给你清晰的方向感。记住一句话:

“不要怕不懂概念,只要你肯动手写代码,一切都不是难题。”

未来你会成长为真正的“架构师”。加油!


📌 想继续深入学习?欢迎关注我后续推出的系列课程:《Node.js 全栈实战》、《Kubernetes 从零到部署》、《微服务设计与落地》等,一起进步!

评论 0

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