微服务架构设计实战:从单体到分布式
开篇:微服务是什么,能解决什么问题?

在开始学习微服务之前,我们先来看一个简单的比喻:
你正在经营一家餐厅。起初你一个人负责点餐、烹饪、收款、打扫……这就是单体应用(Monolithic Application)。随着生意越来越好,一个人忙不过来,你就请了厨师专门做菜、服务员负责接待、收银员处理付款……这就像将一个大系统拆分成多个小系统,各自专注一件事,互相配合,就叫微服务架构(Microservices Architecture)。
那么什么是微服务呢?
微服务是一种软件开发架构风格。它把一个大型应用程序拆分成多个小型、独立的服务模块。每个模块都可以独立开发、部署、运行,并通过网络(通常是HTTP或者消息队列)相互通信。
为什么用微服务?
- 灵活部署:不同服务可以使用不同的技术栈。
- 可扩展性强:哪个功能压力大,就单独扩容那个服务。
- 故障隔离好:某个服务出错不会影响整个系统。
- 团队协作更高效:多人同时开发互不影响。
现在我们就一步步来学习怎么从零搭建自己的第一个微服务项目吧!
环境准备:安装你需要的开发工具

在开始前,我们要准备好以下基础环境:
工具清单
- Java JDK 8 或以上
- Maven 3.x
- Spring Boot(框架支持微服务)
- Postman(测试接口用)
- Docker(后续部署要用)
- IDE:IntelliJ IDEA 或 VSCode
如果你是Windows用户,建议使用IntelliJ IDEA社区版,免费且非常强大。
安装步骤简要说明:
1. Java JDK
前往 Oracle官网 或 OpenJDK 下载最新版本,安装后执行命令检查是否成功:
java -version
javac -version
2. Maven
解压后配置环境变量(MAVEN_HOME 和 PATH),然后验证:
mvn -v
3. IntelliJ IDEA(IDE)
去 JetBrains官网 下载安装包,按提示安装即可。
4. Postman
下载地址:https://www.postman.com/downloads/
安装完成后直接打开就可以用。
5. Docker
Windows 用户推荐安装 Docker Desktop,Mac/Linux用户也有对应版本。安装完成后执行:
docker --version
如果你不确定某一步如何操作,可以在网上搜索“你的操作系统 + 安装XXX”即可找到详细教程。
核心概念讲解:什么是微服务的核心思想?

接下来我们用简单易懂的方式解释几个核心概念。
1. 单体 vs 微服务
| 对比项 | 单体架构 | 微服务架构 |
|---|---|---|
| 开发方式 | 所有代码在一个项目中 | 拆成多个小服务,分别开发 |
| 部署方式 | 整个应用打包一起部署 | 每个小服务单独部署 |
| 技术栈选择 | 全部必须一致 | 每个服务可以选择不同语言或框架 |
| 维护难度 | 越大越难维护 | 各个服务之间松耦合,维护更方便 |
2. 服务间通信方式
服务之间是靠“打招呼”交流的,主要有两种方式:
同步通信(HTTP API)
比如 A 服务调用 B 服务时会等待结果返回。异步通信(MQ、Kafka等)
A 服务发送请求后不等结果,B 服务处理完再通知。
我们这篇文章主要使用同步通信,便于理解。
3. 微服务常见组件(术语介绍)
| 组件名称 | 功能描述 |
|---|---|
| 注册中心 Eureka | 让所有服务知道彼此在哪,相当于通讯录 |
| 网关 Gateway | 接收外部请求,并根据路径转发给正确的服务,相当于前台小姐 |
| 配置中心 Config Server | 所有服务共享的配置信息集中管理,统一修改 |
| 负载均衡 Ribbon | 当一个服务有多台机器时,决定哪一台来处理请求 |
| 分布式链路追踪 Sleuth | 监控一次请求经过哪些服务,帮助排查问题 |
新手不需要一下子掌握这么多,我们会在实战中逐步引入这些组件。
实战项目:一步一步创建你的第一个微服务项目
我们将做一个“图书管理系统”的最简版本,有两个微服务:
- book-service:提供书籍信息查询
- user-service:提供用户借阅信息查询
目标:让两个服务能互相调用数据。
步骤一:创建 Spring Boot 项目
使用 Spring Initializr 创建两个项目:
- book-service:
- Dependencies: Spring Web, Eureka Client
- user-service:
- Dependencies: Spring Web, Eureka Client, OpenFeign
下载并导入IDE。
步骤二:添加注册中心 Eureka Server
新建一个 Spring Boot 项目:
- Name: eureka-server
- Dependencies: Eureka Server
在 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/
启动类加上注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
步骤三:让两个服务注册进 Eureka
以 book-service 为例,在 application.yml 添加:
spring:
application:
name: book-service
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
启动后访问 http://localhost:8761 查看服务是否注册成功。
同样配置 user-service 的 application.yml,端口改为 8082。
步骤四:实现服务间调用(Feign)
现在我们要在 user-service 里调用 book-service 获取书籍信息。
在 user-service 中添加 Feign 客户端接口:
@FeignClient(name = "book-service")
public interface BookServiceClient {
@GetMapping("/books/{id}")
String getBookById(@PathVariable("id") Long id);
}
Controller 中使用它:
@RestController
@RequestMapping("/users")
public class UserController {
private final BookServiceClient bookServiceClient;
public UserController(BookServiceClient bookServiceClient) {
this.bookServiceClient = bookServiceClient;
}
@GetMapping("/book/{id}")
public String getBookFromUser(@PathVariable Long id) {
return "User wants to borrow book: " + bookServiceClient.getBookById(id);
}
}
确保两个服务和注册中心都已启动。
访问:http://localhost:8082/users/book/1,你应该能看到如下输出:
User wants to borrow book: {"id":1,"title":"深入理解微服务","author":"张三"}
🎉恭喜!你已经完成了第一个微服务之间的调用!
常见问题解答:新手常问的问题都在这里
问题一:我启动服务时报错,显示连接不到 Eureka Server 是怎么回事?
答: 可能是你还没启动 Eureka Server。微服务项目依赖注册中心,必须先启动 Eureka 再启动其他服务。
问题二:Feign 请求报错,说找不到服务怎么办?
答: 确保服务名称正确、Eureka 正确注册、并且两个服务处于同一个 Eureka 集群中(defaultZone 设置一致)。
问题三:我想用别的编程语言写某个服务,行吗?
答: 当然可以!微服务的一大优势就是允许不同服务使用不同的语言和技术栈,只要它们都能通过 HTTP 或者消息中间件通信。
问题四:我的服务部署后无法访问?
答: 检查端口是否冲突,是否有防火墙限制,Docker 容器有没有正确暴露端口(例如:-p 8080:8080)。
问题五:微服务是不是一定比单体更好?
答: 并不是。对于小项目、初期快速迭代时,单体架构更简单。只有当业务复杂度增加、需要高并发和灵活部署时,微服务才是更好的选择。
学习建议:下一步该学什么?
学完了这篇入门实战之后,你可以继续学习以下内容:
进阶路线图(适合初学者)
- 服务网关 Spring Cloud Gateway
- 统一路由,权限控制
- 配置中心 Spring Cloud Config
- 多环境配置管理
- 熔断器 Hystrix / Resilience4j
- 服务失败降级,防止雪崩效应
- 日志聚合 ELK(Elasticsearch + Logstash + Kibana)
- 统一日志收集与可视化
- 容器化部署 Docker + Kubernetes
- 自动发布、弹性扩缩容
- 消息队列 Kafka/RabbitMQ
- 实现异步通信、事件驱动架构
- API 文档 Swagger / SpringDoc
- 自动生成接口文档,提高协作效率
你可以按照这个顺序逐步提升技能,每一步都结合实际项目练习效果最好。
总结
本教程带你从零搭建了一个包含两个服务的微服务项目,了解了其基本原理和核心概念。希望你对微服务有了初步认识,并具备了动手实践的能力。
记住一句话:“不懂没关系,动手试试就知道了。”
持续实践,你会越来越熟练!
如果你喜欢这样的教学风格,欢迎继续关注更多《从零到实战》系列文章 👇
最后送你一句话:学习不是为了懂得一切,而是让自己面对未知时,依然有勇气前行。

评论 0