微服务架构设计实战:从单体到分布式
开篇:什么是微服务?它能做什么?

在学习“微服务”之前,我们先想一个问题:
你用过淘宝、抖音或者京东这样的大网站吧?你知道它们的代码结构是什么样的吗?
这些大型应用,不是一个人写的。也不是一个团队在一个项目里完成的。而是很多个小系统组合在一起工作的成果。这,就是所谓的 微服务架构(Microservices Architecture)。
简单来说,微服务就是把一个巨大的系统,拆分成多个小的服务(Service),每个服务只负责一项任务,比如用户注册是一个服务,商品展示是一个服务,订单处理又是另一个服务。
这样做的好处是:
- 每个团队只需要维护自己负责的那个服务
- 系统更容易扩展和维护
- 即使某一个小服务出问题,也不至于让整个系统崩溃
这篇文章,我会带着你一步步从零开始,了解微服务的概念,并通过一个简单项目来实践它的搭建过程。哪怕你是编程新手也没关系,我会像教小学生一样慢慢讲。
环境准备:你需要装好哪些工具?

🛠️ 工具清单(推荐版本)
| 工具名 | 推荐版本 | 说明 |
|---|---|---|
| Java | JDK 17+ | 后端开发语言 |
| Maven | 3.8.x | Java项目的构建工具 |
| Spring Boot | 2.7.x 或 3.x | 快速搭建Java Web服务 |
| IntelliJ IDEA | 社区版/Ultimate | 写Java程序最常用的IDE |
| Postman | 最新版 | 测试API接口的小工具 |
| Docker | 可选 | 容器化部署工具 |
💡 如果你用的是Mac或Windows,推荐安装 IntelliJ IDEA Community Edition 免费版本即可。
🔧 安装步骤简述(详细步骤略)
1. 安装JDK
你可以去官网下载 OpenJDK:Adoptium
然后配置环境变量 JAVA_HOME 和 PATH
2. 安装Maven
解压后配置环境变量即可使用命令行执行 mvn -v 查看版本
3. 安装Spring Boot
其实不需要单独安装,只需要新建一个项目时引入Spring Boot Starter依赖就行
4. 安装Postman
直接去官网下载安装包,一键安装,打开就能用
5. 安装Docker(可选)
初学者暂时可以不装,但后面我们会用它来做服务容器化部署
核心概念:让你不再怕术语!


我们来看几个微服务中非常重要的名词:
1. 📦 服务(Service)
就像一家公司有不同的部门一样,一个软件系统也可以被拆分成多个服务。每个服务都做一件事,比如:
- 用户服务(User Service):处理用户注册、登录等
- 商品服务(Product Service):展示商品信息
- 订单服务(Order Service):下单、支付、发货等流程
🌟 所以说:“微服务 = 一堆小程序合起来做成一个大系统”
2. 🔁 服务通信(Inter-service Communication)
既然有多个服务,它们之间怎么说话呢?比如说,下单的时候要验证用户是否存在,这就需要订单服务调用用户服务了。
常用方式有两种:
- REST API(最常见)
- gRPC(高性能,进阶才学)
我们今天会用 REST API 来实现服务之间的沟通
3. 🧭 服务发现(Service Discovery)
想象一下你新加入了一个公司,你要怎么找到各个部门在哪?
在微服务中也是一样,每个服务运行在哪台服务器上(IP地址和端口)不一定固定,所以我们需要一种机制来记录谁在哪里 —— 这就是 服务发现。
我们今天会用 Eureka Server 来实现这个功能
4. ⚙️ 配置中心(Configuration Center)
有些数据不能写死在代码里,比如数据库连接、第三方密钥等。我们需要一个集中管理配置的地方,这就是 配置中心。
我们今天会使用 Spring Cloud Config Server
5. ⚡ 负载均衡(Load Balancer)
如果某个服务有很多实例在运行,请求怎么分配给它们?我们要平均分配,避免某一台忙死,其他闲着 —— 这就是负载均衡。
我们会使用 Ribbon + RestTemplate 来实现
✅ 总结列表:核心概念速览
| 名词 | 解释 |
|---|---|
| 服务 | 拆分成的小程序 |
| 服务通信 | 不同服务之间交流 |
| 服务发现 | 知道服务跑在哪台机器上 |
| 配置中心 | 管理全局参数 |
| 负载均衡 | 请求合理分配到不同服务器上 |
实战项目:手把手带你做一个简单的电商微服务系统

现在我们来做一个最小可运行的电商微服务系统。
项目目标:
创建三个服务:
- 用户服务(user-service)
- 商品服务(product-service)
- 订单服务(order-service)
最终效果:下单时会调用用户服务和商品服务来获取信息
Step 1:搭建父项目并引入公共依赖
我们可以新建一个空的 Spring Boot 项目作为“父项目”,用来统一管理依赖版本。
<!-- pom.xml -->
<modules>
<module>user-service</module>
<module>product-service</module>
<module>order-service</module>
<module>eureka-server</module>
</modules>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2021.0.6</spring-cloud.version>
</properties>
然后我们在子模块中分别创建四个独立的服务模块。
Step 2:搭建 Eureka Server(服务注册与发现)
Eureka 是 Netflix 提供的一个服务发现组件,用于帮助各服务相互找到彼此。
添加依赖:
<!-- eureka-server/pom.xml -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后启用 Eureka Server:
@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:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动后访问:http://localhost:8761 就可以看到 Eureka 的界面
Step 3:创建 User Service(用户服务)
添加依赖:
<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>
主类加上注解:
@EnableEurekaClient
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
配置 application.yml:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
添加一个简单的 Controller:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
return "User ID: " + id;
}
}
启动后刷新 Eureka 页面,会看到 user-service 上线了 ✅
Step 4:创建 Product Service(商品服务)
跟 User Service 类似,这里就跳过重复部分。
Controller 示例:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/{id}")
public String getProduct(@PathVariable Long id) {
return "Product ID: " + id;
}
}
端口设为 8082,application.name 设为 product-service
Step 5:创建 Order Service(订单服务)
重点来了!这个服务要调用前面两个服务的数据。
添加 RestTemplate 和 LoadBalancer:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
配置 RestTemplate Bean:
@Configuration
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
OrderController 示例:
@RestController
@RequestMapping("/orders")
public class OrderController {
private final RestTemplate restTemplate;
public OrderController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/detail")
public String getOrderDetail() {
String user = restTemplate.getForObject("http://user-service/users/1", String.class);
String product = restTemplate.getForObject("http://product-service/products/101", String.class);

return "Order Detail:\n" + user + "\n" + product;
}
}
配置 application.yml:
server:
port: 8083
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
现在启动全部服务,在浏览器访问:
👉 http://localhost:8083/orders/detail
你应该能看到如下内容:
Order Detail:
User ID: 1
Product ID: 101
🎉 成功啦!微服务之间的调用就这样实现了!
常见问题解答(FAQ)
❓Q1:为什么我访问不了 Eureka?
- 检查是否加了
@EnableEurekaServer - 看有没有冲突端口(默认8761)
- 查看日志是否有报错
❓Q2:RestTemplate 报错 UnknownHostException?
- 检查服务名称是否正确(如 user-service)
- 确保该服务已经成功注册到 Eureka
- 检查是否加了
@LoadBalanced注解
❓Q3:能不能不用 Spring Boot / Eureka?
当然可以!只是我们这篇文章是为了带入门。真实企业中还有更高级的方案如:
- Consul 替代 Eureka
- Feign Client 替代 RestTemplate
- Spring Cloud Gateway 替代 Zuul 做网关
学习建议:下一步该学什么?
你现在掌握了基础微服务架构的核心原理和搭建方式,接下来可以逐步深入以下方向:
✅ 第一阶段(进阶技能):
- 学会使用 Feign 做服务调用
- 引入网关(API Gateway)控制所有流量入口
- 使用 Nacos / Config Server 管理全局配置
- 加入限流熔断机制(Sentinel / Hystrix)
✅ 第二阶段(生产级):
- 使用 Docker 容器化部署微服务
- 引入 Kubernetes 做集群管理
- 加入链路追踪(Sleuth + Zipkin)
- 学习消息队列(Kafka / RocketMQ)进行异步通信
结尾总结
在这篇文章中,我们一起完成了从零到一的微服务架构实战之旅。
我们学会了:
- 什么是微服务
- 如何搭建环境
- 拆分多个服务模块
- 实现服务之间的通信
- 使用服务发现技术
- 解决常见问题的方法
虽然这只是微服务世界的冰山一角,但它足以让你迈出第一步!
别怕复杂,每一个专业架构师,都是从 Hello World 开始的。加油,未来的后端工程师!🚀
如果你觉得这篇教程对你有帮助,请点赞、收藏、转发,让更多小伙伴少走弯路 ❤️

评论 0