后端架构演进:从单体到云原生(零基础入门)

Promise追梦人
2025-06-24 15:44
阅读 572

开篇:什么是后端架构演进?为什么要学它?

开篇:什么是后端架构演进?为什么要学它?

你可能听说过“单体应用”、“微服务”、“容器化”、“Kubernetes”这些词,但它们到底是什么意思呢?

简单来说,后端架构演进就是指我们如何组织和部署一个网站或应用的服务器端代码。最初人们用一种叫做“单体架构”的方式写程序,后来为了应对更大的流量、更快的开发速度和更高的稳定性,逐渐发展出了微服务、容器化以及云原生等新的架构方式。

本教程将带你从零开始,一步步了解:

  • 单体架构是什么
  • 微服务架构的优势
  • 容器化与Docker的使用
  • 什么是云原生与Kubernetes

并且我们会通过一个简单的项目,一步步展示如何将一个原始的单体程序逐步升级为现代的云原生架构。


环境准备:你需要哪些工具?

环境准备:你需要哪些工具?

在开始之前,我们需要准备好一些基本的开发环境工具。以下是必须安装的内容:

必须安装的软件:

  1. Node.js(用来运行JavaScript后端)
  2. npm(随Node.js一起安装,用于管理依赖)
  3. Docker Desktop(容器化工具)
  4. VSCode(推荐的代码编辑器)

✅ 建议:Windows用户安装Docker时需要开启WSL2支持,可参考官方安装指南。


核心概念讲解:从最简单的说起

核心概念讲解:从最简单的说起

一、单体架构(Monolith)

这是最早期的网站开发方式。所有的代码都放在一个项目里,前端请求发给一个服务器,这个服务器处理所有事情 —— 数据库操作、业务逻辑、返回数据,都集中在一起。

示例:一个简单的Node.js单体应用

// app.js
const express = require('express');
const app = express();
const port = 3000;

app.get('/hello', (req, res) => {
    res.send('Hello from a monolithic app!');
});

app.listen(port, () => {
    console.log(`App is running on http://localhost:${port}`);
});
启动方法:
npm install express
node app.js

访问:http://localhost:3000/hello,看到输出就成功了!

单体架构优缺点:

优点 缺点
结构简单,适合小项目 所有功能耦合,修改一处影响全局
开发部署方便 随着功能增加,维护成本高

二、微服务架构(Microservices)

微服务是将一个大系统拆分成多个小系统,每个小系统可以独立运行、独立部署、独立扩展。

举个例子:

  • 用户服务:处理注册、登录、资料管理
  • 商品服务:处理商品信息展示和库存
  • 订单服务:处理下单、支付等功能

每个服务可以自己选择技术栈、数据库,互不影响。

创建两个简单的微服务:

创建一个文件夹 microservices-demo/,里面有两个子项目:

microservices-demo/
├── user-service/
│   └── app.js
└── product-service/
    └── app.js
user-service/app.js
const express = require('express');
const app = express();

app.get('/user', (req, res) => {
    res.json({ name: 'Alice' });
});

app.listen(4000, () => {
    console.log('User service is running at http://localhost:4000');
});
product-service/app.js
const express = require('express');
const app = express();

app.get('/product', (req, res) => {
    res.json({ name: 'iPhone', price: 999 });
});

app.listen(5000, () => {
    console.log('Product service is running at http://localhost:5000');
});

分别在两个终端窗口中运行:

node user-service/app.js
node product-service/app.js

然后你可以分别访问:

这就是两个微服务独立运行的例子!


三、容器化与Docker

容器化是一种让应用程序可以在任何环境中运行一致的技术。Docker 是最常见的容器化平台。

将你的微服务打包成Docker镜像:

以 user-service 为例,新建 Dockerfile

# 使用官方Node.js镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 app.js 文件
COPY package*.json ./
RUN npm install

COPY . .

# 暴露端口
EXPOSE 4000

# 启动命令
CMD ["node", "app.js"]

接着构建并启动容器:

cd user-service/
docker build -t user-service .
docker run -p 4000:4000 user-service

现在你的服务已经跑在一个容器里了!


四、云原生与Kubernetes

云原生是指一套设计和开发应用程序的方法,让它能充分发挥云计算的优势,比如自动扩容、自动恢复、负载均衡等等。

Kubernetes是一个用于自动化部署、扩展和管理容器化应用的平台。

由于Kubernetes较复杂,我们这里只做简单介绍。

简单运行两个服务在Kubernetes中(本地测试):

如果你已安装 Docker Desktop 并启用了 Kubernetes,可以尝试以下步骤。

创建一个 YAML 文件 user-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user
  template:
    metadata:
      labels:
        app: user
    spec:
      containers:
      - name: user
        image: user-service
        ports:
        - containerPort: 4000
---
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  type: NodePort
  selector:
    app: user
  ports:
    - protocol: TCP
      port: 4000
      targetPort: 4000

然后执行:

kubectl apply -f user-deployment.yaml

这样就可以在Kubernetes中启动你的服务了!

⚠️ 提示:Kubernetes学习难度较高,建议先掌握Docker之后再深入。


实战项目:搭建一个多服务架构的天气查询系统

目标:

我们来实现一个天气查询的小系统,包含三个部分:

  1. 城市信息服务
  2. 天气信息服务
  3. 网关服务

第一步:创建城市服务

// city-service/app.js
const express = require('express');
const app = express();

app.get('/city', (req, res) => {
    res.json({ city: "Beijing", population: 2154 });
});

app.listen(3001, () => {
    console.log("City service is running at port 3001");
});

第二步:创建天气服务

// weather-service/app.js
const express = require('express');
const axios = require('axios'); // 模拟真实调用
const app = express();

app.get('/weather', async (req, res) => {
    try {
        const response = await axios.get('http://localhost:3001/city');
        res.json({
            city: response.data.city,
            temperature: 22,
            condition: 'Sunny'
        });
    } catch (error) {
        res.status(500).json({ error: 'Cannot get weather info' });
    }
});

app.listen(3002, () => {
    console.log("Weather service is running at port 3002");
});

第三步:创建网关服务

// gateway-service/app.js
const express = require('express');
const axios = require('axios');
const app = express();

app.get('/', async (req, res) => {
    try {
        const result = await axios.get('http://localhost:3002/weather');
        res.json(result.data);
    } catch (err) {
        res.status(500).send('Error fetching data');
    }
});

app.listen(3000, () => {
    console.log("Gateway service is running at port 3000");
});

现在启动这三个服务:

node city-service/app.js
node weather-service/app.js
node gateway-service/app.js

访问:http://localhost:3000 —— 可以看到完整的天气信息!

这就是一个完整的多服务架构演示。


常见问题解答(FAQ)

Q1:我启动服务时报错,提示找不到模块怎么办?

可能是没有安装依赖,请确保在对应服务目录下运行:

npm install express axios

Q2:访问Docker中的服务总是404?

检查容器是否正确暴露了端口,比如 -p 4000:4000,或者查看日志:

docker logs [容器名]

Q3:为什么Kubernetes不能运行我的镜像?

确保镜像已经推送到私有仓库或打标签为 localhost 类型,也可以通过以下命令确认:

kubectl get pods
kubectl describe pod [pod-name]

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

恭喜你完成了这次后端架构演进的初探!接下来建议你继续深入学习以下几个方向:

  1. API 网关(如 Kong/Nginx)
  2. 配置中心(如 Spring Cloud Config、Consul)
  3. 服务发现与注册(如 Eureka、etcd)
  4. 分布式事务与消息队列(如 Kafka、RabbitMQ)
  5. 监控系统(如 Prometheus + Grafana)
  6. 持续集成与部署(CI/CD,如 Jenkins、GitHub Actions)

📌 推荐阅读书籍:

  • 《Spring微服务实战》
  • 《Kubernetes权威指南》
  • 《云原生应用架构设计》

总结

本教程从最简单的单体应用出发,带大家一步步过渡到了微服务、容器化和云原生的基本实践。希望你能理解:

  • 单体架构适合小项目
  • 微服务提升灵活性和可维护性
  • 容器化帮助统一部署环境
  • Kubernetes适用于大规模系统管理和自动化运维

记住一句话:不要追求复杂,而是理解需求再选择合适的架构。祝你在后端开发的路上越走越远!

评论 0

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