微服务架构设计实战:从单体到分布式
一、开篇:什么是微服务?为什么要学它?

你可能听说过“微服务”这个词,但不一定清楚它是做什么的。简单来说,微服务是一种软件开发方法,它的核心思想是:把一个大应用拆成多个小应用,每个小应用都独立运行、部署和扩展。
我们拿吃饭来打个比方:
传统做法(单体架构):一家餐馆只做一道菜——大盘鸡拌面炒饭!虽然方便管理,但一旦出错(比如米饭糊了),整个菜品就废了。
微服务架构:这家店现在变成一个小食堂,分成炒饭组、炒面组、炖菜组……各自负责自己的任务,就算某一个小组出问题,其他部分还能照常运作。
微服务的优势:
- 每个模块独立,更灵活
- 容易维护和部署
- 易于团队协作(各干各的)
- 可以根据不同需求横向扩展某个功能(比如用户登录太慢,可以专门多部署几个登录服务)
所以,当你开发一个越来越大的项目时,微服务就是帮你解决复杂度的利器。
二、环境准备:搭建属于你的微服务实验田

在开始写代码之前,我们需要先准备好开发工具。以下是初学者需要安装的基本环境:
1. 编程语言:Java + Spring Boot(推荐)
Java 是企业级应用最常用的语言之一,Spring Boot 是构建微服务的黄金组合!
安装步骤:
- 下载并安装 JDK 17+
- 安装 IntelliJ IDEA(社区版免费)
- 创建一个 Spring Boot 新项目(用Spring Initializr生成初始项目)
2. 微服务通信必备:REST API + JSON
- REST 是一种常见的前后端交互方式
- 我们会使用
Spring Web模块创建 HTTP 接口
3. 数据库:H2 Database(轻量级,适合学习)
- 不需要额外安装,直接依赖即可
- 内存中运行,重启数据会丢失,适合测试用
4. 注册中心 & 网关:Spring Cloud Netflix Eureka + Gateway
- Eureka:服务注册与发现
- Gateway:统一入口,路由请求到各个服务
✨添加 Maven 依赖示例(pom.xml):
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- H2 Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
⚠️注意:别忘了在主类上加注解启用 Eureka 和 Gateway!
三、核心概念:这些术语听上去很酷,其实很简单!


刚开始学微服务的同学最容易被一堆专业术语搞得一头雾水。下面我用最简单的方式解释几个最重要的概念:
1. 单体 vs 微服务
| 单体架构 | 微服务架构 |
|---|---|
| 所有代码在一个项目中 | 拆成多个小项目 |
| 部署一起更新 | 各自独立部署 |
| 出错影响整条链路 | 故障隔离,风险小 |
2. 服务注册与发现(Eureka)
想象一下你在一个公司里上班,新同事进来了,你咋知道他坐哪呢?肯定是去前台问:“XXX在哪?”
在微服务中,这个“前台”就是 Eureka Server。每个微服务启动后都会去注册自己,其他服务通过名字找到它。
3. API 网关(Gateway)
所有请求先经过网关,由它决定发给谁处理。有点像公司的保安:你找哪个部门?他说完电话帮你转接。
例如:
/user/** → User Service/product/** → Product Service
4. 负载均衡(Load Balancing)
如果一个服务启动多个实例,网关或调用者要决定请求发给哪一个,这就是负载均衡。常见策略有轮询(round robin)、随机等。
5. 服务间通信(Feign / RestTemplate)
微服务之间如何互相调用?可以用 Feign 或 RestTemplate 发送 HTTP 请求,就像浏览器访问网页那样。
四、实战项目:手把手带你搭起第一个微服务系统


我们将用 Spring Boot + Spring Cloud 来搭建一个基础的微服务系统,包括:
- 用户服务(User Service)
- 产品服务(Product Service)
- 注册中心(Eureka Server)
- 网关服务(API Gateway)
第一步:创建 Eureka Server
1. 初始化一个 Spring Boot 项目
- 项目名:eureka-server
- 添加依赖:Eureka Server
2. 在 application.yml 中配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3. 在主类加上注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动后访问:http://localhost:8761 查看服务注册情况。
第二步:创建 User Service
1. 创建 Spring Boot 项目
- 名字:user-service
- 依赖:Web, Eureka Client
2. 配置 application.yml
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3. 创建一个简单的 Controller
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable String id) {
return "User ID: " + id;
}
}
启动之后,在 Eureka 页面中可以看到 “user-service” 已注册。
第三步:创建 Product Service(结构相同)
application.yml:
server:
port: 8082
spring:
application:
name: product-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
ProductController.java:
@RestController
@RequestMapping("/product")
public class ProductController {
@GetMapping("/{id}")
public String getProduct(@PathVariable String id) {
return "Product ID: " + id;
}
}
第四步:配置网关(Gateway)
1. 创建 gateway-service
- 依赖:Gateway + Eureka Client
2. application.yml:
server:
port: 8000
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-route
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=1
- id: product-route
uri: lb://product-service
predicates:
- Path=/product/**
filters:
- StripPrefix=1
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
lb://表示负载均衡方式访问对应服务
测试访问:
五、常见问题答疑区(FAQ)
Q1:启动服务时报错说找不到 Eureka?
- 答:请确保 Eureka Server 已启动,并检查端口是否为 8761
Q2:调用服务时报 404?
- 答:确认服务名称是否正确(
spring.application.name),网关路径是否有误
Q3:为什么要用网关?
- 答:避免客户端直接对接很多服务,提高统一性和安全性,后续还可以做权限校验、限流等功能
Q4:如何查看已注册的服务?
- 答:访问 Eureka 控制台:http://localhost:8761/
六、学习建议:下一步该学啥?
恭喜你完成了第一个微服务项目的搭建!这是走向大型系统的第一步。接下来你可以继续深入以下几个方向:
学习路线建议:
| 阶段 | 学习内容 | 工具/框架 |
|---|---|---|
| 进阶阶段 | 服务容错(降级、熔断) | Hystrix |
| 实战增强 | 分布式事务 | Seata、Saga 模式 |
| 性能优化 | 限流、负载均衡 | Sentinel、Ribbon |
| 安全保障 | 统一认证授权 | Spring Security + OAuth2 |
| 日志追踪 | 分布式链路追踪 | Sleuth + Zipkin |
| 部署上线 | 容器化部署 | Docker + Kubernetes |
结语:迈出第一步,就是成功的一半!
学习微服务不是一蹴而就的过程,但只要你跟着一步步实践,就能慢慢掌握这个强大而实用的技术体系。
记住一句话:“微服务的核心,不在于技术本身,而在于如何合理划分业务边界。”
祝你在编程路上越走越远!如果你喜欢这种风格的教程,欢迎持续关注~

评论 0