微服务架构设计实战:从单体到分布式(零基础入门)
开篇:什么是微服务?它用来做什么?

在你开始学习编程时,可能已经写过一些“单体应用”:所有的功能都写在一个项目里,比如用户管理、订单处理、支付等功能都在一个程序中完成。
但随着应用越来越大,维护和扩展会变得非常困难。这时候,我们就可以使用一种叫 微服务架构 的方式来组织我们的代码。
微服务的本质是把原本一个大系统,拆分成多个小系统,每个小系统独立运行,各自负责一部分功能,并通过网络通信协调工作。
想象一下,你正在开一家餐厅。起初你自己一个人做菜、点餐、收银。但随着客人越来越多,你请了厨师专门做菜、服务员点餐、会计负责财务——这就是“微服务”的思想。
环境准备:开始前要安装什么?

为了便于操作和理解,我们将使用以下技术栈:
- 编程语言:Java(Spring Boot)
- 构建工具:Maven
- 接口测试:Postman 或 curl
- 数据库:MySQL
1. 安装 Java(JDK 17)
前往官网下载并安装 Oracle JDK 17
或者使用 OpenJDK(推荐):Adoptium
安装完成后,执行命令验证是否成功:
java -version
2. 安装 Maven
访问 Maven 官网 下载后配置环境变量。验证:
mvn -v
3. 安装数据库 MySQL(可选,用于演示)
可以使用本地安装,也可以用 Docker 快速部署一个 MySQL 容器。
如果你用的是 Mac:
brew install mysql
Windows 用户可参考 MySQL Installer
4. 下载开发工具(IDE)
推荐使用 IntelliJ IDEA(社区版免费)或者 VS Code + Java 插件。
核心概念:微服务的关键术语解释

学习微服务,我们要了解几个核心概念:
1. 服务拆分(Service Splitting)
就像前面说的“开餐厅”,微服务的核心就是把一个大型系统拆成多个小的服务模块。例如:
| 功能 | 对应服务 |
|---|---|
| 用户注册登录 | user-service |
| 商品信息展示 | product-service |
| 支付订单流程 | order-service |
2. API 接口交互(RESTful)
每个服务之间不是直接调用代码,而是通过 HTTP 协议互相通信,通常使用 RESTful 风格的接口。
示例请求:
GET /users/1
表示访问 user-service 获取 ID 为 1 的用户信息。
3. 注册中心(Eureka)
微服务数量变多后,如何找到每个服务?这就需要一个“通讯录”一样的服务,叫做注册中心,常用的是 Eureka 或 Consul。
4. 网关(Gateway)
当外部请求访问多个服务时,可以通过一个统一的入口进行路由和权限控制,这个角色由 Gateway 担任。
实战项目:从单体到微服务的第一步

我们来做一个简单的电商系统,包含两个服务:
- 用户服务:提供用户信息查询
- 商品服务:提供商品信息查询
所有代码都使用 Spring Boot 编写,适合初学者。
第一步:创建父工程(Project)
先创建一个 Maven 工程作为父工程,结构如下:
ecommerce/
├── user-service/
├── product-service/
└── pom.xml
父项目的 pom.xml 内容如下(只列出关键依赖):
<modules>
<module>user-service</module>
<module>product-service</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
第二步:编写用户服务(User Service)
进入 user-service 目录,创建主类:
// UserApplication.java
@RestController
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
@GetMapping("/users/{id}")
public String getUser(@PathVariable String id) {
return "用户ID:" + id;
}
}
再添加配置文件 application.yml:
server:
port: 8081
spring:
application:
name: user-service
运行该服务后,访问:
http://localhost:8081/users/100
你应该看到返回内容:“用户ID:100”
第三步:编写商品服务(Product Service)
与用户服务类似:
// ProductApplication.java
@RestController
@SpringBootApplication
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
@GetMapping("/products/{id}")
public String getProduct(@PathVariable String id) {
return "商品ID:" + id;
}
}
配置文件:
server:
port: 8082
spring:
application:
name: product-service
运行后访问:
http://localhost:8082/products/200
你会看到 “商品ID:200”
到目前为止,我们有两个服务分别运行在不同端口上。
常见问题解答
Q1:为什么我运行服务的时候报错说找不到类?
A:检查你的 pom.xml 是否引入了 Spring Boot Starter Web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Q2:我不能同时运行两个服务,端口冲突怎么办?
A:修改 application.yml 中的 server.port,给两个服务分配不同的端口。
Q3:服务多了怎么知道它们在哪里运行?
A:这时就需要一个注册中心(如 Eureka),我们会在后续文章中详细讲解。
学习建议:下一步学什么?
完成了第一个微服务项目后,你已经迈出了重要一步!接下来你可以继续深入以下几个方向:
✅ 初级进阶路线图:
- 服务注册与发现:学习 Eureka、Consul、Nacos 的使用
- API 网关:尝试使用 Spring Cloud Gateway 统一路由
- 负载均衡:Ribbon + Feign 实现服务间调用
- 配置中心:Spring Cloud Config 动态加载配置
- 日志聚合:ELK 技术组合统一查看日志
- 分布式事务:初步了解 Seata 或 Saga 模式
总结
本教程带你从零开始认识微服务,并亲手搭建了两个简单的微服务。虽然它们还很简陋,但是你已经掌握了构建分布式系统的最基本技能!
记住一句话:微服务不是一蹴而就的技术,而是一种思维方式。只要持续练习,不断拆解问题,你就能够真正掌握它。
如果你想获得完整源码或想了解更多微服务实战案例,请继续关注后续系列课程《微服务进阶实战》。

评论 0