后端架构演进:从单体到云原生(新手友好教程)
开篇:后端架构是做什么的?

在我们日常使用的很多应用背后,比如淘宝、微信、抖音,都有一个看不见但非常重要的一部分 —— 后端服务。简单来说,后端负责:
- 处理用户请求(例如:登录、下单)
- 和数据库打交道(存数据、查数据)
- 与其他系统协作(比如和支付宝接口打通)
而后端架构演进,说白了就是:随着用户变多、业务复杂,我们的后端怎么一步步“升级”来适应这些变化。
这篇文章会带你从最简单的“单体项目”开始,一直到现代流行的“云原生架构”,通过一步一步动手写代码,让你理解后端是如何演变的!
环境准备:让电脑准备好编程环境

需要安装哪些工具?
我们用 Java + Spring Boot 来讲解(Java 是主流后端语言之一,Spring Boot 是简化开发的框架),所以请先安装以下工具:
1. JDK 17(Java 开发套件)
下载地址:https://adoptium.net/zh-CN/temurin/releases/?version=17
安装完成后,在终端输入:
java -version
如果输出类似:
openjdk version "17.0.1" 2021-10-19
说明安装成功!
2. IDE(推荐 IntelliJ IDEA)
免费社区版即可,下载链接:https://www.jetbrains.com/idea/download/
安装之后,启动它,后面我们会用它写代码。
3. Maven(依赖管理工具)
IntelliJ 通常自带 Maven,如果你用的是其他编辑器,可以从官网下载并配置:https://maven.apache.org/
验证命令:
mvn -v
4. Docker(用于部署微服务和云原生部分)
安装指南(适用于 Windows/macOS/Linux): https://docs.docker.com/get-docker/
验证命令:
docker --version
如果看到版本号,说明已安装。
核心概念:一步步了解这些关键词到底是什么意思

什么是单体架构?
想象你刚开始学做菜,所有事情都一个人干:买菜、洗菜、切菜、炒菜、上菜。这就是 单体架构,所有功能都在一个程序里完成。
优点:结构简单,适合小项目或新手快速上手
缺点:不易扩展、难维护、出错影响整个系统
什么是微服务架构?
当你做大厨团队,每个人只管一块(有人专门炒菜、有人配菜、有人打包外卖),效率更高。
微服务 就是把后端拆成多个独立的小程序,每个小程序负责一部分功能。例如:
- 用户服务(处理注册/登录)
- 订单服务(处理下单)
- 支付服务(处理支付)
优点:易扩展、可独立部署、稳定性更高
缺点:学习曲线高、部署麻烦、通信成本增加
什么是云原生?
“云原生”就像开连锁餐厅,你的店可以自动复制分店(自动扩缩容)、出了问题能自己重启、还能一键更新。
核心思想:
- 容器化(Docker)
- 编排(Kubernetes)
- 持续集成/持续交付(CI/CD)
- 分布式设计
优点:灵活、高效、自动化强
缺点:门槛较高、需要一定运维知识
实战项目:从小到大搭建一个小餐馆后台系统

我们将实现一个小项目:一个简单的“餐馆点餐系统”,包含:
- 用户注册/登录(UserService)
- 下单功能(OrderService)
- 菜品管理(MenuService)
接下来,我们按阶段来实现这个系统。
第一阶段:单体架构实现(Single Monolith)
目标:用一个 Java 项目实现全部功能
步骤1:创建 Spring Boot 项目
你可以使用 Spring Initializr 创建项目: https://start.spring.io/
选择如下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 2.7.x or 3.0.x
- Dependencies:
- Spring Web
- Spring Data JPA
- H2 Database (测试用)
下载压缩包,解压并导入 IntelliJ IDEA。
步骤2:创建实体类与 Repository
User.java:
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
private String email;
// Getter and Setter
}
UserRepository.java:
public interface UserRepository extends JpaRepository<User, Long> {}
步骤3:创建 Controller 提供接口
UserController.java:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping
public List<User> getAll() {
return userRepository.findAll();
}
@PostMapping
public User create(@RequestBody User user) {
return userRepository.save(user);
}
}
步骤4:运行项目
点击 IntelliJ 中的 Run 按钮,打开浏览器访问:
http://localhost:8080/users
你应该看到一个空数组 []
发送 POST 请求:
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"name":"张三", "email":"zhangsan@example.com"}'
返回结果示例:
{"id":1,"name":"张三","email":"zhangsan@example.com"}
这样我们就完成了一个简单的用户服务模块!
提示:同理添加 OrderController, MenuController 即可完成整个单体项目。
第二阶段:微服务架构改造
目标:将用户、订单、菜单拆分为不同的服务
为什么拆分?
当项目大了,改一点代码就要重新发布整个项目,风险很大;拆开后,哪个服务出问题就修哪个。
技术选型
- 使用 Spring Boot + Spring Cloud
- 使用 Eureka 作为服务注册中心
步骤1:创建 Eureka Server(服务注册中心)
生成一个新的 Spring Boot 项目,并加入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动类加上注解:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application.yml:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
运行后访问:http://localhost:8761 查看注册中心状态
步骤2:拆分 UserService 成一个单独的服务
新建项目,加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
主类加上:
@EnableDiscoveryClient
然后照着前面的方法编写 Controller、Entity、Repository。
运行后再次访问 Eureka 页面,你会看到 user-service 已注册成功!
步骤3:创建 OrderService 并调用 UserService
同样方式创建新项目,名为 order-service,并连接 Eureka。
在 OrderService 中想要拿到用户信息时,可以用 RestTemplate 调用 UserService 接口:
@Autowired
RestTemplate restTemplate;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {
return restTemplate.getForObject("http://user-service/users/" + id, User.class);
}
这样两个服务就建立了联系!
第三阶段:部署到容器中(进入云原生)
现在我们已经拆分成了多个服务,接下来我们要学会用 Docker 把它们打包运行起来。
步骤1:为每个服务添加 Dockerfile
以 user-service 为例:
FROM eclipse-temurin:17-jdk-focal
WORKDIR /app
COPY target/user-service.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
构建镜像:
docker build -t user-service .
运行容器:
docker run -p 8081:8081 user-service
你会发现服务正常运行!🎉
步骤2:使用 Docker Compose 同时运行多个服务
创建 docker-compose.yml 文件:
version: '3'
services:
eureka-server:
image: eureka-server
ports:
- "8761:8761"
user-service:
image: user-service
ports:
- "8081:8081"
order-service:
image: order-service
ports:
- "8082:8080"
执行命令一键启动所有服务:
docker compose up
你现在拥有了一个完整的微服务+注册中心的云原生部署!
常见问题解答(FAQ)
Q1:我的 Spring Boot 项目运行报错,说是找不到方法怎么办?
A:检查是否忘记加 @Component, @RestController 或者没有正确注入 Bean。
Q2:微服务之间互相调用性能会不会很差?
A:确实会有网络延迟,可以通过缓存、消息队列等机制优化。云原生体系中也提供了服务网格(如 Istio)来帮助提升性能。
Q3:我不会写 Dockerfile,能不能自动生成?
A:可以使用 Spring Boot 插件帮你自动生成镜像。也可以尝试 Google Jib,更加方便。
Q4:我刚入门,该先学单体还是直接学微服务?
A:建议从单体开始,先搞懂基础再考虑拆分。微服务对新手来说挑战太大,容易走弯路。
Q5:学习这些技术需要多久?有没有捷径?
A:掌握基本套路大约需要 2~3个月实践时间。捷径是跟着教程动手,不抄源码,自己敲出来。另外多参与开源项目,进步更快。
学习建议:下一步怎么走?
学会了从单体到云原生的基础后,你可以沿着以下几个方向继续深入学习:
✅ 技术栈延展:
- 学习 Spring Cloud Alibaba(阿里推出的微服务解决方案)
- 学习 Kubernetes(简称 K8s,现代部署必备)
- 学习 RabbitMQ、Redis(分布式中的常用组件)
✅ 架构思维提升:
- 学习领域驱动设计(DDD)
- 学习 CQRS、Event Sourcing 设计模式
- 理解 CAP 理论与分布式事务
✅ 自动化能力增强:
- 学习 Jenkins/GitLab CI(实现自动化构建)
- 学习 Terraform(基础设施即代码)
- 学习 Prometheus + Grafana(监控系统)
结语:后端不是终点,而是旅程的开始
从今天起,你不再是一个只会写 Hello World 的程序员了。你已经掌握了搭建后端系统的基本能力,并明白了后端是如何随着需求逐步演化的。
坚持每天写代码、每周搭小项目,不久之后你就可以做出自己的电商平台、社交平台甚至云服务平台。记住:
不要怕看不懂,只要不停敲代码,你就离高手越来越近!
📌 如果你喜欢这篇教程,请点赞支持一下作者,我会持续更新更多零基础友好的后端教程 🚀
需要完整项目源码?欢迎留言告诉我!

评论 0