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

Flex布局猫
2025-06-18 03:52
阅读 509

一、开篇:什么是后端架构?为什么要关注它的演进?

一、开篇:什么是后端架构?为什么要关注它的演进?

你有没有想过,当你用手机或电脑访问一个网站(比如淘宝、微博)时,背后是怎么工作的呢?
虽然你看不到这些过程,但有一个很重要的部分在默默运行——后端服务

简单来说,后端就是处理用户请求的地方。例如:

  • 用户注册 → 后端保存用户名和密码
  • 搜索商品 → 后端查找数据库并返回结果
  • 发送聊天消息 → 后端接收、转发并存储消息

而“后端架构”指的就是这个系统的结构方式。它决定了系统是否高效、稳定、能否支持大量用户同时在线,以及是否容易维护和升级。

过去我们常用的是单体架构,现在更流行微服务+云原生架构,它们各有优缺点。

本篇文章就带你一步一步了解这些架构的发展历程,并动手写一个简单的项目来体验这种变化。


二、环境准备:搭建你的第一个开发环境

二、环境准备:搭建你的第一个开发环境

为了更好地理解内容,我们需要准备以下工具:

所需工具列表:

工具名称 功能说明
Node.js 运行JavaScript程序(用于构建后端API)
NPM / Yarn 包管理器,用来安装Node模块
VSCode 编辑代码的强大免费编辑器
Postman 测试接口的可视化工具
Docker 创建容器(模拟微服务部署的基础)

安装步骤简述:

  1. 安装 Node.js 和 NPM

    • 前往 nodejs.org
    • 下载 LTS 版本(适合初学者)
    • 安装完成后,在命令行中输入以下命令验证是否成功:
      node -v
      npm -v
      
      如果输出版本号,表示安装成功!
  2. 安装 VSCode

  3. 安装 Postman

  4. 安装 Docker

    • Windows/Mac 用户推荐安装 Docker Desktop
    • Linux 用户可以使用 apt install docker.io 或其他包管理器安装

小提示:如果遇到网络问题,可以用国内镜像源安装 Node.js 和 Docker,如 npmmirror.com 和阿里云 Docker Hub 镜像。


三、核心概念详解:让你不再害怕专业术语

三、核心概念详解:让你不再害怕专业术语

1. 单体架构(Monolithic Architecture)

简介

就像是一口锅里做一道菜,所有的功能都在同一个应用里完成。例如:

  • 用户登录
  • 商品展示
  • 购物车功能
  • 订单下单

这些都写在一个项目里。早期的大型网站基本都是这么做的。

优点

  • 开发简单,部署方便
  • 不需要复杂的分布式系统知识

缺点

  • 当项目变大,代码臃肿、难以维护
  • 修改一个小功能可能要重新部署整个系统
  • 无法实现灵活扩展(比如突然某个功能特别热)

示例代码

我们先用 Node.js 写一个最简单的单体服务:

// 文件名:app.js
const http = require('http');

const server = http.createServer((req, res) => {
    if (req.url === '/hello') {
        res.end("Hello from Monolith!");
    } else {
        res.end("Page not found");
    }
});

server.listen(3000, () => {
    console.log("Server running on port 3000");
});

在终端运行:

node app.js

然后打开浏览器访问 http://localhost:3000/hello 就能看到输出了。

🎉 成功运行了一个最简单的后端服务!


2. 微服务架构(Microservices)

简介

把原来的“一口锅”拆分成多个小锅,每个锅只负责一种功能。比如:

  • 一个锅专门处理用户信息(用户服务)
  • 一个锅处理订单(订单服务)
  • 一个锅处理商品展示(商品服务)

这样的好处是:可以单独更新/重启某一部分,不影响其他功能

优点

  • 高度解耦,易于维护
  • 可独立部署、升级某一个服务
  • 更好地利用资源(某些功能需求量大可多部署几份)

缺点

  • 技术复杂度高
  • 需要解决服务通信、数据一致性等问题
  • 对团队协作要求更高

示例代码

我们写两个微服务:用户服务(user-service)、订单服务(order-service)

user-service.js:
const http = require('http');
const PORT = 3001;

const server = http.createServer((req, res) => {
    res.end("User Service: User data here");
});

server.listen(PORT, () => {
    console.log(`User service listening at ${PORT}`);
});
order-service.js:
const http = require('http');
const PORT = 3002;

const server = http.createServer((req, res) => {
    res.end("Order Service: Order info here");
});

server.listen(PORT, () => {
    console.log(`Order service listening at ${PORT}`);
});

分别启动两个服务:

node user-service.js
node order-service.js

现在你可以通过两个不同的端口访问这两个服务啦!是不是有点“微服务”的意思了?


3. 云原生架构(Cloud Native)

简介

这是微服务的进一步发展,强调在云计算环境下工作的方式,包括:

  • 使用 容器化技术(如 Docker)
  • 采用 Kubernetes 来管理容器
  • 支持自动扩展、持续集成/部署(CI/CD)

一句话:让系统更适合云端部署与自动管理

关键技术关键词

  • Docker:容器打包工具
  • Kubernetes(k8s):容器编排平台
  • CI/CD:自动化部署流水线
  • API网关(Gateway):统一入口
  • 日志监控:观测系统状态

示例:用 Docker 启动服务

给刚刚写的用户服务添加 Dockerfile:

FROM node:16
WORKDIR /usr/src/app
COPY user-service.js .
EXPOSE 3001
CMD ["node", "user-service.js"]

构建镜像:

docker build -t user-service .

运行容器:

docker run -p 3001:3001 user-service

现在你已经用 Docker 把你的服务打包成一个“盒子”,无论在哪台机器上都可以运行它!


四、实战项目:从单体到微服务再到容器化部署

我们通过一个完整的例子,逐步展示如何将一个功能从单体迁移到微服务,并最终容器化部署。

目标功能:用户注册 + 获取用户信息

Step 1:单体实现

创建文件 single-app.js

const http = require('http');

const users = [];

const server = http.createServer((req, res) => {
    const url = req.url;
    if (url === '/register' && req.method === 'POST') {
        let body = '';
        req.on('data', chunk => body += chunk.toString());
        req.on('end', () => {
            const { username, email } = JSON.parse(body);
            users.push({ username, email });
            res.end("Registered successfully");
        });
    } else if (url === '/users') {
        res.end(JSON.stringify(users));
    } else {
        res.end("Page Not Found");
    }
});

server.listen(3000, () => {
    console.log("Single App Running...");
});

测试方法:

  • 使用 Postman 发起 POST 请求 /register,参数为 JSON:
    {
      "username": "tom",
      "email": "tom@example.com"
    }
    
  • 再访问 GET /users 查看注册用户列表

✅ 到这一步为止,你已经掌握了一个完整的单体服务的功能实现。


Step 2:拆分为微服务

我们将用户相关的逻辑拆出来成为一个服务。

新建目录 user-service,结构如下:

user-service/
├── index.js
└── Dockerfile

index.js

const http = require('http');

const users = [];

const server = http.createServer((req, res) => {
    if (req.url === '/register' && req.method === 'POST') {
        let body = '';
        req.on('data', chunk => body += chunk.toString());
        req.on('end', () => {
            const { username, email } = JSON.parse(body);
            users.push({ username, email });
            res.end("Registered successfully");
        });
    } else if (req.url === '/users') {
        res.end(JSON.stringify(users));
    } else {
        res.end("Not found");
    }
});

server.listen(3001, () => {
    console.log("User microservice running");
});

启动服务:

cd user-service
node index.js

此时你可以像之前一样用 Postman 访问 /register/users 接口。


Step 3:容器化部署

接着上面的目录结构加上 Dockerfile:

FROM node:16
WORKDIR /app
COPY . .
EXPOSE 3001
CMD ["node", "index.js"]

构建与运行:

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

至此,我们成功把一个单一的功能,拆成了独立的服务,并用 Docker 容器进行部署。

🎉 微服务 + 容器化的入门就完成了!


五、常见问题解答(FAQ)

Q1:为什么不用一开始就用微服务?

A:微服务确实有很多优势,但它也带来更高的复杂性。对于初期功能少、团队小的项目,建议先用单体开发,等业务增长后再拆分

Q2:我能不能不学 Docker?

A:当然可以,但 Docker 是目前主流的部署方式。学会它可以提高你项目的部署效率和稳定性,特别是在企业环境中非常有用。

Q3:微服务之间怎么互相调用?

A:可以使用 HTTP REST 接口、gRPC、或者消息队列(如 RabbitMQ、Kafka)。后面我们会详细讲。

Q4:学习路线太长怎么办?什么时候能做出完整项目?

A:不要贪多。先从单体开始,跑通所有流程;再一步步拆出服务;最后加入容器化和部署方案。每一步都有明确目标即可。


六、学习建议:下一步该怎么走?

恭喜你完成本次《从单体到云原生》的学习旅程!

接下来建议继续深入的方向包括:

学习路径建议:

  1. ✅ 熟悉 RESTful API 的规范写法(GET、POST、PUT、DELETE)
  2. 🔁 学习 Express/Koa 框架简化 Web 服务开发
  3. 🗄️ 学习如何使用 MySQL / MongoDB 存储数据
  4. 📦 深入 Docker 技术(卷、网络、镜像优化)
  5. 🧬 学习 Kubernetes 基础(Pod、Deployment、Service)
  6. 🌐 接触服务发现 & 负载均衡(如 Consul、Nginx)
  7. 🛠️ 实践 CI/CD 流程(GitHub Actions / Jenkins)
  8. 💡 探索日志集中管理(ELK 栈)和链路追踪(OpenTelemetry)

结语

从单体架构到云原生,是我们走向现代后端工程的重要一步。即使你是零基础的新手,只要一步步跟着写、跟着练,也能快速上手。

下期我们还将继续带大家深入每一个技术细节,比如“如何用 Express 搭建真正的用户管理系统”、“Kubernetes 如何管理多个服务”。

如果你觉得这篇文章有帮助,请收藏、分享,也欢迎留言提问哦!我们一起进步 👨‍💻👩‍💻


字数统计:约 2805 字

评论 0

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