微服务架构设计实战:从单体到分布式(适合零基础初学者)
开篇:微服务是做什么的?

你有没有遇到过这样的问题?比如开发一个电商网站,把商品管理、用户登录、订单处理都写在一个项目里,刚开始还挺顺利。但随着功能越来越多,代码越来越复杂,修改一个地方可能会牵动整个系统,甚至一不小心就导致整个网站崩溃。
这就是我们常说的单体架构(Monolithic Architecture),简单说就是“把所有功能都放在一个项目里”。
而今天我们讲的微服务架构,就是一种解决这些问题的方法。它把原本“一个大项目”拆分成多个小项目,每个小项目只做一件事,并且可以独立运行和部署。它们通过网络来交流、配合工作。
举个例子:
- 商品服务:专门负责商品的增删改查
- 订单服务:只处理订单相关的逻辑
- 用户服务:负责用户注册、登录等功能
这样做的好处很明显:
- 每个服务都很简单,容易维护
- 一个服务出问题,不会影响全部功能
- 不同的服务可以用不同的技术来做
接下来我们就一步步从环境搭建开始,教你如何使用微服务构建一个小项目。
环境准备:搭建你的开发环境

我们要用的技术栈是 Java + Spring Boot + Maven(适合初学者)。当然你也可以选择其他语言,但我们以 Java 为例更通用。
第一步:安装 Java 开发工具包(JDK)
推荐版本:JDK 17 或 JDK 21
验证是否安装成功:
打开终端或命令行输入:
java -version如果看到类似如下输出,说明安装成功:
java version "17.0.8" 2023-07-18 LTS
第二步:安装 IntelliJ IDEA(推荐 IDE)
IntelliJ 是一个非常适合 Java 开发的编辑器,社区版免费。
- 官网下载地址:https://www.jetbrains.com/idea/download/
- 安装后打开,创建新项目时选择 “Maven” 类型项目
第三步:安装 Spring Initializr 插件(可选)
这个插件可以帮助我们快速生成 Spring Boot 项目结构。
- 打开 IDEA,点击
Settings→Plugins - 搜索 “Spring Initializr” → 安装插件
核心概念讲解(通俗易懂)
在正式写代码前,我们先来了解几个关键术语。
1. 服务(Service)
就是一个小程序,负责某一个特定功能。例如:“用户服务”,就是专门处理用户的注册、登录等。
2. API(接口)
两个服务之间是如何沟通的呢?靠的是 API。你可以理解为服务提供的“联系方式”。比如用户服务可以通过 /api/user/login 来让别人调用登录接口。
3. RESTful API
这是目前最常见的前后端交互方式。它的核心思想是,用 URL 来表达资源,例如:
- 获取用户列表:GET /users
- 创建用户:POST /users
- 删除用户:DELETE /users/123
这些请求方式(GET、POST、PUT、DELETE)是我们与服务通信的关键。
4. 分布式系统
微服务本质上是一个分布式系统,也就是很多服务分布在不同的机器或者容器中,彼此之间通过网络通信完成工作。
小提醒:分布式系统的一大难点就是网络不稳定、调用失败等问题。
实战项目:实现一个最简单的电商平台微服务
我们将从头开始,构建三个微服务:
- 用户服务(User Service)
- 商品服务(Product Service)
- 订单服务(Order Service)
我们将使用 Spring Boot 来构建它们,并用 HTTP 调用来模拟服务之间的交互。
第一步:创建 User Service(用户服务)
1. 使用 Spring Initializr 创建项目
填写信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(如 3.x)
- Group: com.example
- Artifact: userservice
- Dependencies: Spring Web, Spring Data JPA, H2 Database (用于测试)
然后点击 Generate 下载项目解压。
2. 启动应用
使用 IDEA 打开项目,运行 main() 方法,启动成功后访问:
http://localhost:8080
如果看到欢迎页面,说明服务已经跑起来了。
3. 编写第一个接口:获取用户信息
我们在 UserController.java 中添加如下代码:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public String getUserById(@PathVariable Long id) {
return "用户ID:" + id + ",姓名:张三";
}
}

访问链接测试:
http://localhost:8080/api/users/1
你会看到返回:
用户ID:1,姓名:张三
第二步:创建 Product Service(商品服务)
重复上面步骤创建另一个服务,命名为 productservice,也添加相同的依赖。
编写控制器 ProductController.java:
@RestController
@RequestMapping("/api/products")
public class ProductController {
@GetMapping("/{id}")
public String getProductById(@PathVariable Long id) {
return "商品ID:" + id + ",名称:苹果手机";
}
}
访问测试:
http://localhost:8081/api/products/101
你会看到返回:
商品ID:101,名称:苹果手机
注意:商品服务默认运行在8081端口(可在application.properties中修改server.port)
第三步:创建 Order Service(订单服务)
同样新建第三个 Spring Boot 项目:orderservice
现在我们要让订单服务能调用用户服务和商品服务的数据。
添加 Feign Client 支持
Feign 是一个帮助服务间相互调用的组件,我们需要添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
同时,在主类加上注解启用 Feign:
@SpringBootApplication
@EnableFeignClients
public class OrderserviceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderserviceApplication.class, args);
}
}
编写调用客户端
创建 UserServiceClient.java:
@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserServiceClient {
@GetMapping("/api/users/{id}")
String getUserById(@PathVariable("id") Long id);
}
创建 ProductServiceClient.java:
@FeignClient(name = "product-service", url = "http://localhost:8081")
public interface ProductServiceClient {
@GetMapping("/api/products/{id}")
String getProductById(@PathVariable("id") Long id);
}
编写订单接口
@RestController
@RequestMapping("/api/orders")
public class OrderController {
@Autowired
private UserServiceClient userServiceClient;
@Autowired
private ProductServiceClient productServiceClient;
@GetMapping("/{userId}/products/{productId}")
public String getOrderDetail(
@PathVariable Long userId,
@PathVariable Long productId) {
String user = userServiceClient.getUserById(userId);
String product = productServiceClient.getProductById(productId);
return "订单详情:" + "\n" + user + "\n" + product;
}
}
访问测试:
http://localhost:8082/api/orders/1/products/101
你将会看到结果:
订单详情:
用户ID:1,姓名:张三
商品ID:101,名称:苹果手机
这就是最基本的微服务之间的调用了!
常见问题解答(FAQ)
Q1:为什么我的服务不能互相访问?
A:确保你的服务都已经启动,并且 IP 地址和端口号正确。如果是本地开发,一般是 localhost 加上对应的端口,如 localhost:8080。
Q2:微服务之间怎么传递参数?
A:一般通过 HTTP 请求的方式传递,常见的有 GET 参数、POST JSON 数据等。还可以使用 Token、Header 等方式进行身份验证。
Q3:微服务一定要部署在不同服务器上吗?
A:不是必须的,初期可以在同一个机器的不同端口运行各个服务。等你熟悉了之后,再考虑部署在多台机器或 Docker 容器中。
Q4:没有数据库,怎么存数据?
A:本教程为了简化教学,暂时没使用数据库,后期会介绍使用 MySQL、Redis 等存储方式。
学习建议:下一步该怎么学?
恭喜你完成了第一个微服务实战!下面是一些建议,帮助你继续深入学习:
✅ 第一步:学会使用 Eureka 注册中心
我们刚才手动写死了服务地址(url),这种方式不方便扩展。Eureka 是服务发现组件,可以让服务自己“注册”自己,其他服务可以自动找到它们。
✅ 第二步:使用 Zuul 或 Gateway 实现 API 网关
API 网关是微服务系统的入口,统一接收请求并路由到正确的服务去处理。
✅ 第三步:引入配置中心 Spring Cloud Config
微服务多了以后,每个服务都有自己的配置文件,非常难管理。配置中心可以集中管理和分发配置。
✅ 第四步:使用 Docker 容器化部署
将每个服务打成 Docker 镜像,方便部署到服务器上,还能更好地实现隔离和自动化运维。
✅ 第五步:学习日志监控和服务追踪
使用 Sleuth + Zipkin 实现微服务调用链追踪,使用 ELK(Elasticsearch + Logstash + Kibana)进行日志分析。
总结
这篇文章从零开始,带你了解了什么是微服务,如何搭建环境,动手实现了三个服务之间的基本调用,并解决了新手常问的问题。
微服务并不是一开始就要用的东西,它适用于“功能多、并发高、团队大”的项目。但提前了解它,会让你在未来的工作中更有竞争力。
只要你掌握了本次的内容,就可以继续挑战更复杂的微服务进阶任务了!
如果你觉得这篇教程对你有帮助,别忘了点赞分享给更多正在入门的朋友,我们一起成长,共同进步!🚀

评论 0