微服务架构设计实战:从单体到分布式(新手友好教程)
开篇:什么是微服务?它是用来做什么的?

你有没有用过像淘宝、京东这样的网站?这些平台背后其实是很多个小程序在协同工作。比如:用户注册是一个程序,下单是一个程序,支付又是一个程序……
把这些小程序拆开来开发、部署,就是我们今天要学的——微服务架构(Microservices Architecture)。
为什么不用一个大程序呢?
想象你要做一个大拼图,如果所有拼图片都在一起,别人想修改一块都会影响整体。而如果你把拼图分成几块,各自独立完成,修改起来就容易多了。
这就是微服务的最大优势:灵活、易维护、易扩展。
环境准备:搭建你的学习环境

我们要用的是 Java + Spring Boot 来做微服务,因为这是目前最主流的技术栈之一。
步骤一:安装 Java 开发工具包(JDK)
- 下载地址:https://adoptium.net/zh-CN/temurin/releases/
- 推荐版本:JDK 17 或 21
- 安装完成后,在命令行输入:
java -version
确保输出中有类似 Java version "17" 这样的信息。
步骤二:安装 IntelliJ IDEA 社区版
- 免费下载地址:https://www.jetbrains.com/idea/download/
- 安装后打开,设置好 JDK 路径即可开始编写代码。
步骤三:安装 Maven 和配置
- Maven 是用来管理项目的依赖库。
- 下载地址:https://maven.apache.org/download.cgi
- 设置环境变量
MAVEN_HOME,并在系统路径中加入%MAVEN_HOME%\bin
验证安装:
mvn -v
看到 Maven 版本号就说明成功了。
核心概念:小白也能懂的专业术语
1. 单体应用 vs 微服务
| 单体应用 | 微服务 |
|---|---|
| 所有功能在一个项目里 | 拆成多个小项目 |
| 改一处可能全崩 | 某个服务坏了不影响其他 |
| 部署快但难扩展 | 可以单独部署每一个服务 |
2. RESTful API(接口通信方式)
就像两个人打电话沟通一样,每个服务之间是通过 HTTP 请求交换数据。比如:
GET /users/1
表示“我要查看 id 是 1 的用户”。
3. 注册中心(Eureka)
相当于通讯录。每个服务启动时都要去这里登记:“我叫 user-service,我可以处理用户请求”。
4. 网关(Gateway)
就像总入口。外部请求先到网关,再由网关分派到对应的服务上。
5. 配置中心(Spring Cloud Config)
统一管理所有服务的配置文件,比如数据库账号密码,避免重复写。
实战项目:从0开始搭建两个微服务和一个网关

目标:
我们将搭建两个服务:
user-service:负责用户管理order-service:负责订单管理
还有:gateway-service:访问的唯一入口
第一步:创建父项目(Maven 多模块项目)
- 在 IDEA 中创建一个名为
microservice-demo的 Maven 项目。 - 不需要选择模板,只保留空的
pom.xml文件。 - 在这个父项目下,新建三个子模块:
- user-service
- order-service
- gateway-service
第二步:添加 Spring Boot 依赖
父项目的 pom.xml 添加如下内容:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>microservice-demo</artifactId>
<version>1.0.0</version>
<modules>
<module>user-service</module>
<module>order-service</module>
<module>gateway-service</module>
</modules>
<packaging>pom</packaging>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第三步:创建 user-service
1. 添加依赖 user-service/pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2. 创建启动类 UserServiceApplication.java
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
3. 创建 UserController
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable Long id) {
return "User with ID: " + id;
}
}
4. 在 application.yml 设置端口
server:
port: 8081
现在你可以运行 UserServiceApplication,然后访问:
👉 http://localhost:8081/users/1
你应该看到输出:
User with ID: 1
第四步:创建 order-service(步骤类似)
同样添加 spring-boot-starter-web 依赖
创建控制器 OrderController:
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
public String getOrder(@PathVariable Long id) {
return "Order with ID: " + id;
}
}
application.yml 中设置不同端口:
server:
port: 8082
测试访问:
👉 http://localhost:8082/orders/100
结果:
Order with ID: 100
第五步:创建网关 gateway-service
1. 添加网关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2. 配置网关路由
application.yml
server:
port: 9090
spring:
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- id: order-service
uri: http://localhost:8082
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
这样配置的意思是:
- 访问
/api/users/123-> 被转发到 user-service 的/users/123 - 访问
/api/orders/456-> 被转发到 order-service 的/orders/456
3. 启动并测试
运行 gateway-service,然后访问:
👉 http://localhost:9090/api/users/123
返回:
User with ID: 1
👉 http://localhost:9090/api/orders/456
返回:
Order with ID: 456
🎉 至此,两个服务 + 一个网关已经可以运行!
常见问题解答(FAQ)
Q1:出现 "Port already in use" 怎么办?
A:请确认别的服务没有占用相同的端口。比如 user-service 占用了 8081,就不能让另一个服务也用它。
Q2:访问网关报错 404,怎么回事?
A:请检查网关的路由配置是否正确,尤其是路径匹配部分,比如是不是写了 /api/users/**。
Q3:怎么调用另一个服务?它们不能互相通信吗?
A:当然可以!后续你可以使用 RestTemplate 或 Feign 客户端实现服务间通信。
Q4:每次改完代码都要重启服务吗?
A:可以使用 DevTools 插件实现自动热重载,减少手动重启的烦恼。
Q5:微服务太多怎么管理配置?
A:可以用配置中心 Spring Cloud Config 或 Nacos 等。
学习建议:下一步该学什么?
恭喜你完成了第一个微服务项目 🎉
接下来你可以继续深入以下几个方向:
方向一:加入注册中心 Eureka(服务发现)
- 每个服务启动后都注册自己到 Eureka
- 网关不再硬编码地址,而是根据服务名自动查找
方向二:配置中心 Spring Cloud Config
- 把所有配置抽取出去统一管理
- 修改一次全局生效,不需逐个修改
方向三:增加负载均衡 Ribbon 或 LoadBalancer
- 当一个服务启动多个实例时,自动分配请求
方向四:服务熔断 Hystrix(容错机制)
- 如果某个服务挂了,不影响整个系统
方向五:消息队列 Kafka/RabbitMQ
- 实现异步通信,提高系统效率
总结
在这篇教程中,你学会了:
- 什么是微服务及其优势
- 如何搭建基础开发环境
- 拆分两个简单服务和配置网关
- 解决常见问题的方法
- 下一步该往哪学
微服务不是一天能学会的,但它也不像想象中那么难。只要一步步来,你就一定能掌握!
如果你觉得这篇文章对你有帮助,请点赞、收藏,并分享给还在困惑的小白朋友 💪
📌 文章结束,总字数:约2293字

评论 0