从零搭建你的第一个微服务:Spring Cloud实战入门
大家好,我是工作五年的后端开发工程师。最近带了不少实习生,发现很多同学在学 Spring Cloud 时一头雾水——概念太多、文档太散、Demo 太复杂。我当初学的时候,也踩过无数坑,所以今天写这篇教程,用一个真实小项目带你一步步搞懂微服务的核心逻辑,不讲虚的,只写能跑起来的代码。
如果你正在准备求职,微服务几乎是中高级 Java 岗的必考项。面试官常问:“你们系统怎么拆服务的?”“注册中心挂了怎么办?”——这些问题的答案,就藏在这篇实战里。
一、微服务到底是什么?为什么用它?
简单说:把一个大应用拆成多个小服务,各自独立开发、部署、运行。
比如你做一个电商系统:
- 用户服务(管登录、注册)
- 商品服务(管商品信息)
- 订单服务(管下单)
每个服务都是一个独立的 Spring Boot 应用,通过网络互相调用。好处很明显:
- 某个服务崩了,不影响其他功能
- 团队可以并行开发不同服务
- 技术栈可以灵活选择(甚至用 Go 写某个服务!)
💡 小知识:Spring Boot 是构建单个服务的基础框架,而 Spring Cloud 是让多个 Spring Boot 服务协同工作的“粘合剂”。
二、环境准备:5分钟搭好开发环境
你需要安装以下工具(版本建议):
| 工具 | 推荐版本 | 作用 |
|---|---|---|
| JDK | 17 或 21 | Java 运行环境 |
| Maven | 3.8+ | 项目依赖管理 |
| IDEA | 最新版 | 开发 IDE |
| Nacos | 2.3+ | 服务注册与发现中心 |
步骤:
- 下载 Nacos,解压后进入
bin目录 - Windows 执行
startup.cmd -m standalone,Mac/Linux 执行sh startup.sh -m standalone - 浏览器访问
http://localhost:8848/nacos,账号密码都是nacos
✅ 避坑提示:别用最新快照版!新手用稳定版(如 2.3.0)能少踩 80% 的坑。
三、核心概念:3个关键词搞定微服务通信
1. 服务注册与发现(Service Registry)
每个服务启动时,会把自己的 IP 和端口告诉 Nacos。其他服务想调用它,就去 Nacos 问:“用户服务在哪?”
2. 服务调用(Feign)
不用写 http://ip:port/api 这种硬编码!用 Feign 像调本地方法一样调远程服务。
3. 配置中心(可选,本次略)
统一管理所有服务的配置文件,改配置不用重启服务。
四、实战:动手写两个微服务
我们将创建:
user-service:提供用户信息order-service:调用 user-service 获取用户数据
第一步:创建 user-service(Spring Boot 项目)
pom.xml 关键依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0</version>
</dependency>
</dependencies>
application.yml:
server:
port: 8081
spring:
application:
name: user-service # 服务名,必须唯一!
cloud:
nacos:
discovery:
server-addr: localhost:8848
UserController.java:
@RestController
public class UserController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
return "User-" + id;
}
}
启动后,打开 Nacos 控制台,你会看到 user-service 已注册!
第二步:创建 order-service(调用 user-service)
pom.xml 添加 Feign 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
application.yml:
server:
port: 8082
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
启用 Feign(主类加注解):
@SpringBootApplication
@EnableFeignClients // 开启 Feign 客户端
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
定义 Feign 接口:
@FeignClient(name = "user-service") // 对应 user-service 的 spring.application.name
public interface UserClient {
@GetMapping("/user/{id}")
String getUser(@PathVariable("id") Long id);
}
OrderController 调用:
@RestController
public class OrderController {
@Autowired
private UserClient userClient;
@GetMapping("/order/{userId}")
public String createOrder(@PathVariable Long userId) {
String user = userClient.getUser(userId);
return "Created order for " + user;
}
}
启动 order-service,访问 http://localhost:8082/order/123,你会看到:
Created order for User-123
🎉 成功!两个服务通过 Nacos 自动发现并通信!
五、新手常见问题 & 解决方案
❓ 问题1:启动报错 “No qualifying bean of type 'UserClient'”
✅ 原因:没加 @EnableFeignClients
✅ 解决:检查主启动类是否添加该注解
❓ 问题2:调用时报 404 或连接拒绝
✅ 原因:user-service 没启动,或 Nacos 没连上 ✅ 解决:
- 确保 Nacos 先启动
- 检查两个服务的
spring.cloud.nacos.discovery.server-addr是否一致 - 查看 Nacos 控制台是否有两个服务注册
❓ 问题3:能不能混用其他语言?比如用 Go 写订单服务?
✅ 完全可以! 微服务本质是 HTTP/REST 通信。只要 Go 服务也注册到 Nacos(可用 nacos-sdk-go),Java 服务就能通过服务名调用它。这也是微服务的优势之一!
六、求职 & 面试题挑战
掌握以上内容,你已经能应对不少初级面试题:
| 面试题 | 回答要点 |
|---|---|
| Spring Boot 和 Spring Cloud 有什么区别? | Boot 是单体应用框架,Cloud 是微服务治理工具集 |
| 服务注册中心的作用是什么? | 实现服务自动发现,避免硬编码 IP |
| Feign 的底层原理? | 基于 Ribbon 负载均衡 + 动态代理生成 HTTP 请求 |
🔥 进阶建议:面试官如果问“高可用怎么做?”,你可以答:“Nacos 集群部署 + 服务多实例 + Feign 超时重试”,这分就稳了。
七、下一步学习建议
- 加监控:集成 Spring Boot Admin 或 Prometheus
- 加网关:用 Spring Cloud Gateway 统一入口
- 加熔断:Hystrix 或 Sentinel 防止雪崩
- 读源码:看 Feign 和 Nacos Client 的实现逻辑
📌 我的经验:不要一开始就学全套!先搞懂“注册-发现-调用”这条主线,再逐步扩展。我见过太多人卡在配置中心或链路追踪上,结果连最基本的调用都没跑通。
微服务不是银弹,但它是现代后端开发的必备技能。你不需要一次学会所有,只要今天比昨天多跑通一行代码,就是进步。希望这篇教程能帮你迈出第一步。有问题欢迎留言,我会一一回复!
加油,未来的架构师!

评论 0