从单体到云原生:后端架构是怎么一步步变“聪明”的?

♂陈静
2026-01-22 10:33
阅读 2146

大家好,我是一个干了5年后端开发的老兵。最近带新人面试时,总被问:“后端架构到底怎么演进的?单体、微服务、云原生有啥区别?”说实话,我当初学的时候也一头雾水——书上一堆术语,代码却跑不起来。所以今天,我想用最接地气的方式,带你从零搞懂后端架构的进化史,还会用 Python 写点小例子,让你真正“看得见、摸得着”。

这篇文章不讲玄学,只讲你能用上的东西。说不定下次面试官问你“你们系统为啥不用单体架构了”,你就能答得头头是道!


一、后端架构是啥?为什么它会“进化”?

简单说,后端架构就是你程序的“骨架”。就像盖房子,一开始搭个茅草屋(单体),后来人多了,改成三层小楼(微服务),最后变成智能大厦(云原生)。

为啥要变?因为业务在长!用户从100人变成100万,请求从每天100次变成每秒1万次。老架构扛不住,就得升级。

我当初做的第一个项目,就是一个 Flask 单体应用,所有功能塞在一个文件里。上线三天,服务器就崩了两次……


二、环境准备:只需三样东西

别担心,我们不需要复杂工具。只要装好以下三样:

  1. Python 3.8+(推荐用 pyenv 管理版本)
  2. pip(Python 包管理器,通常随 Python 自带)
  3. 一个文本编辑器(VS Code、PyCharm 或记事本都行)

验证安装:

python --version
pip --version

如果看到版本号,说明环境 OK!


三、架构演进四步走:从“一锅炖”到“智能调度”

第一步:单体架构(Monolithic)

特点:所有功能(用户、订单、支付)写在一个代码库里,部署成一个进程。

优点:简单、开发快、调试方便
缺点:改一行代码,整个系统都要重启;流量大了,只能整台机器扩容

Python 示例app.py):

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/user/<id>')
def get_user(id):
    return jsonify({"id": id, "name": "Alice"})

@app.route('/order/<id>')
def get_order(id):
    return jsonify({"order_id": id, "total": 99.9})

if __name__ == '__main__':
    app.run(port=5000)

运行:

pip install flask
python app.py

访问 http://localhost:5000/user/1,就能看到用户数据。

适合场景:MVP(最小可行产品)、内部工具、小团队快速验证想法


第二步:分层架构(Layered Architecture)

单体太乱?那就拆成逻辑层:表现层(API)、业务层(逻辑)、数据层(数据库)。

虽然还是一个进程,但代码结构清晰了。

目录结构

my_app/
├── api/          # 路由和接口
├── service/      # 业务逻辑
├── model/        # 数据模型
└── app.py        # 启动入口

好处:修改订单逻辑,不用动用户模块;测试更容易

🚫 新手误区:以为分层就是微服务!其实它还是单体,只是代码组织更好。


第三步:微服务架构(Microservices)

当系统越来越复杂,单体成了“巨无霸”,改一处怕崩全站。

微服务的核心思想一个服务只做一件事,比如:

  • 用户服务(User Service)
  • 订单服务(Order Service)
  • 支付服务(Payment Service)

每个服务独立开发、独立部署、独立数据库。

Python 多服务示例

用户服务(user_service.py

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/user/<id>')
def get_user(id):
    return jsonify({"id": id, "name": "Alice"})

if __name__ == '__main__':
    app.run(port=5001)

订单服务(order_service.py

from flask import Flask, jsonify
import requests

app = Flask(__name__)

@app.route('/order/<id>')
def get_order(id):
    # 调用用户服务
    user_resp = requests.get(f"http://localhost:5001/user/1")
    user = user_resp.json()
    return jsonify({
        "order_id": id,
        "user": user,
        "total": 99.9
    })

if __name__ == '__main__':
    app.run(port=5002)

分别运行两个服务:

python user_service.py   # 端口 5001
python order_service.py  # 端口 5002

访问 http://localhost:5002/order/1001,就能拿到包含用户信息的订单。

⚠️ 挑战来了:服务多了,怎么管理?网络超时怎么办?日志分散在哪?这时候就需要云原生来救场。


第四步:云原生架构(Cloud Native)

云原生不是技术,而是一套理念,核心是:让应用天生适合在云上跑

它包含四大支柱:

技术 作用 常见工具
容器化 打包应用和依赖,一次构建到处运行 Docker
服务编排 自动启停、扩缩容、故障恢复 Kubernetes (K8s)
服务网格 管理服务间通信(重试、限流、监控) Istio, Linkerd
DevOps 自动化测试、构建、部署 GitHub Actions, Jenkins

用 Docker 容器化我们的服务

创建 Dockerfile.user

FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install flask requests
CMD ["python", "user_service.py"]

构建并运行:

docker build -f Dockerfile.user -t user-service .
docker run -p 5001:5001 user-service

同样方式打包订单服务。现在,你的服务可以部署到任何支持 Docker 的云平台(AWS、阿里云、腾讯云等)。

💡 云原生优势

  • 流量突增?自动扩容10个订单服务实例
  • 某个服务挂了?K8s 自动重启
  • 发布新版本?滚动更新,用户无感知

四、实战:用 Flask 模拟一个“伪微服务”系统

我们来做一个极简版电商后端,包含两个服务:

  1. 用户服务:提供用户信息
  2. 商品服务:提供商品信息,并调用用户服务做权限校验(简化版)

步骤 1:创建项目结构

cloud-native-demo/
├── user-service/
│   ├── app.py
│   └── Dockerfile
├── product-service/
│   ├── app.py
│   └── Dockerfile
└── docker-compose.yml  # 一键启动两个服务

步骤 2:写 user-service/app.py

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/user/<user_id>')
def get_user(user_id):
    return jsonify({"id": user_id, "name": "Bob", "role": "customer"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

步骤 3:写 product-service/app.py

from flask import Flask, jsonify
import requests

app = Flask(__name__)

@app.route('/product/<pid>')
def get_product(pid):
    # 模拟调用用户服务(实际中应通过服务发现)
    try:
        user = requests.get("http://user-service:5001/user/123", timeout=2).json()
        if user["role"] == "customer":
            return jsonify({"id": pid, "name": "Laptop", "price": 5999})
        else:
            return jsonify({"error": "Unauthorized"}), 403
    except Exception as e:
        return jsonify({"error": "User service unavailable"}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5002)

步骤 4:写 docker-compose.yml

version: '3'
services:
  user-service:
    build:
      context: ./user-service
    ports:
      - "5001:5001"
    networks:
      - app-net

  product-service:
    build:
      context: ./product-service
    ports:
      - "5002:5002"
    depends_on:
      - user-service
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

步骤 5:一键启动

cd cloud-native-demo
docker-compose up --build

访问 http://localhost:5002/product/101,就能看到商品信息!

🎉 你刚刚亲手搭建了一个“类云原生”系统!虽然没用 K8s,但已经体验了服务拆分、容器化、网络通信。


五、新手常问的5个问题

Q1:我是不是一开始就要用微服务?

绝对不要! 微服务带来的是复杂度。如果你只有3个接口、2个开发者,用单体更高效。先跑起来,再优化。

Q2:Python 适合做微服务吗?

完全适合!虽然 Java 在企业级微服务更常见,但 Python + FastAPI/Flask + Docker 也能轻松应对中小规模场景。很多 AI 后端、数据服务都是 Python 微服务。

Q3:云原生必须用 Kubernetes 吗?

不一定。小项目用 Docker Compose 就够了。K8s 学习曲线陡峭,建议先掌握容器化,再逐步接触 K8s。

Q4:面试官问“你们系统架构”,该怎么答?

按演进思路回答:

“我们最初是单体架构,随着用户增长,将核心模块拆分为用户、订单等微服务,用 Docker 容器化,通过 Nginx 做负载均衡,日志统一收集到 ELK。”

Q5:怎么学习云原生?

路线建议:

  1. 先学 Docker(会写 Dockerfile)
  2. 再学 Docker Compose(多服务编排)
  3. 然后玩 Minikube(本地 K8s)
  4. 最后看 Helm、Istio 等高级工具

六、下一步学习建议

  • 动手实践:把你的个人博客从单体改成两个服务(文章服务 + 评论服务)
  • 深入阅读:《凤凰项目》(小说形式讲 DevOps)、《云原生模式》
  • 刷面试题:重点准备:
    • 单体 vs 微服务优缺点
    • 服务间通信方式(REST vs gRPC)
    • 如何保证微服务高可用
    • Docker 和虚拟机的区别

我当年就是靠自己搭了个“玩具级”微服务系统,才在面试中脱颖而出。记住:架构不是设计出来的,是演进出来的。


希望这篇教程能帮你拨开迷雾。后端架构看似高深,其实本质就是“如何让程序更好地协作”。从单体出发,一步步走到云原生,你也在成长为一名真正的工程师。

有问题欢迎留言,我们一起探讨!

评论 0

最热最新
暂无评论
♂陈静Lv.1
0
影响力
0
文章
0
粉丝