Spring Cloud从零开始:微服务入门指南
大家好,我是你们的学长,一名211高校计算机专业的研二学生。平时喜欢写技术博客,帮助刚入行的同学们少走弯路。今天这篇教程,就是想带完全零基础的朋友,从零搭建一个Spring Cloud微服务项目。
我当初学微服务的时候,被各种名词(Eureka、Ribbon、Feign、Gateway……)搞得头晕眼花,文档又晦涩难懂,面试时一问“微服务之间怎么通信”,我就支支吾吾答不上来。所以,我希望用最通俗的语言、最清晰的步骤、最贴近实际开发的例子,带你真正理解Spring Cloud的核心思想,并能动手写出自己的第一个微服务应用。
一、什么是Spring Cloud?它能做什么?
简单说:Spring Cloud 是一套基于 Spring Boot 的微服务开发工具集。
为什么需要微服务?
想象你做一个电商网站:
- 单体架构:所有功能(用户、商品、订单、支付)都写在一个项目里。
- 问题:代码越来越臃肿,改一个小功能要重新部署整个系统,团队协作困难。
而微服务架构把大系统拆成多个小服务:
- 用户服务(user-service)
- 商品服务(product-service)
- 订单服务(order-service)
每个服务独立开发、部署、扩展。但随之而来的问题是:
- 服务之间怎么发现彼此?
- 怎么调用对方的接口?
- 出错了怎么办?
- 网关怎么统一管理?
Spring Cloud 就是为了解决这些问题而生的!
二、环境准备(手把手教你搭建)
✅ 建议:先确保以下工具已安装
| 工具 | 版本建议 | 安装方式 |
|---|---|---|
| JDK | 17(推荐)或 8/11 | 官网下载安装 |
| Maven | 3.6+ | 官网下载配置环境变量 |
| IDE | IntelliJ IDEA(社区版即可) | 官网下载 |
| Git | 最新版 | 官网下载 |
步骤 1:创建 GitHub 仓库(可选但推荐)
# 在 GitHub 上新建一个仓库,比如叫 spring-cloud-demo
git clone https://github.com/你的用户名/spring-cloud-demo.git
cd spring-cloud-demo
💡 为什么要用 GitHub?
- 代码备份
- 后续可集成 CI/CD
- 面试题常问:“你有 GitHub 项目吗?”
步骤 2:创建父工程(Maven 聚合项目)
在 IDEA 中新建一个 Maven 项目,命名为 spring-cloud-demo,不勾选 archetype。
修改 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- Spring Boot 和 Spring Cloud 版本管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/>
</parent>
<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>
<modules>
<!-- 后续子模块会在这里注册 -->
</modules>
</project>
⚠️ 注意:Spring Boot 3.x 只支持 Java 17+,如果你用的是 Java 8,请降级到 Spring Boot 2.7 + Spring Cloud 2021.0.5
三、核心概念(用大白话解释)
1. 服务注册与发现(Service Registry & Discovery)
- 问题:服务A怎么知道服务B的IP和端口?
- 解决方案:引入一个“中介”——注册中心(如 Eureka、Nacos)
- 流程:
- 服务启动时,向注册中心“登记”自己(IP+端口+服务名)
- 其他服务想调用它,就去注册中心“查电话号码”
2. 服务调用(Service-to-Service Communication)
- 传统方式:硬编码 IP(
http://192.168.1.10:8080/user/1)→ 不灵活 - Spring Cloud 方式:通过服务名调用(
http://user-service/user/1) - 底层由 Ribbon(负载均衡) + RestTemplate / OpenFeign(声明式调用) 实现
3. API 网关(API Gateway)
- 所有外部请求先经过网关
- 网关负责:路由、鉴权、限流、日志
- 常用组件:Spring Cloud Gateway
四、实战项目:构建两个微服务 + 注册中心
我们将创建三个模块:
eureka-server:注册中心user-service:用户服务order-service:订单服务(会调用 user-service)
步骤 1:创建 eureka-server
在父工程下新建 Module → Maven → eureka-server
pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.yml:
server:
port: 8761
eureka:
client:
register-with-eureka: false # 自己就是注册中心,不用注册自己
fetch-registry: false # 不需要拉取服务列表
server:
enable-self-preservation: false # 关闭自我保护(开发环境)
主启动类:
@SpringBootApplication
@EnableEurekaServer // 开启 Eureka Server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
步骤 2:创建 user-service
新建 Module → user-service
pom.xml:
<dependencies>
<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>
</dependencies>
application.yml:
server:
port: 8081
spring:
application:
name: user-service # 服务名称!非常重要
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 指向注册中心
控制器:
@RestController
public class UserController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
return "User ID: " + id + ", Name: Alice";
}
}
主启动类加 @EnableDiscoveryClient(可省略,新版自动启用):
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
步骤 3:创建 order-service(调用 user-service)
新建 Module → order-service
pom.xml 同 user-service(加上 web + eureka-client)
application.yml:
server:
port: 8082
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
关键:使用 RestTemplate 调用其他服务
先配置 RestTemplate Bean:
@Configuration
public class RestConfig {
@Bean
@LoadBalanced // 开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
控制器:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{userId}")
public String createOrder(@PathVariable Long userId) {
// 重点:这里用的是服务名 user-service,不是 IP!
String user = restTemplate.getForObject(
"http://user-service/user/" + userId,
String.class
);
return "Created order for: " + user;
}
}
主启动类同上。
步骤 4:运行验证
- 启动
eureka-server→ 访问http://localhost:8761 - 启动
user-service - 启动
order-service
刷新 Eureka 页面,你会看到两个服务已注册:
Application AMIs Availability Zones
USER-SERVICE 1 (1)
ORDER-SERVICE 1 (1)
测试调用:
curl http://localhost:8082/order/123
# 返回:Created order for: User ID: 123, Name: Alice
✅ 成功!微服务间通过服务名通信,无需关心 IP。
五、新手常见问题 & 解决方案
❓ 问题1:启动报错 “Connection refused” 连接注册中心失败
- 原因:eureka-server 没启动,或
defaultZone地址写错 - 解决:检查端口、URL 是否匹配,确保注册中心先启动
❓ 问题2:order-service 调用 user-service 报 UnknownHostException
- 原因:RestTemplate 没加
@LoadBalanced注解 - 解决:确认
RestTemplateBean 上有@LoadBalanced
❓ 问题3:服务启动了但在 Eureka 看不到
- 原因:
spring.application.name未配置,或网络隔离 - 解决:检查 yml 配置,确保服务能访问 8761 端口
❓ 问题4:Java 版本不兼容
- 现象:Spring Boot 3.x + Java 8 → 启动失败
- 解决:统一升级到 Java 17,或降级 Spring Boot 到 2.7
六、学习建议 & 面试题挑战
下一步学什么?
- 服务通信升级:用 OpenFeign 替代 RestTemplate(更简洁)
- 配置中心:引入 Spring Cloud Config 或 Nacos 管理配置
- 熔断降级:学习 Resilience4j(Hystrix 已停更)
- API 网关:用 Spring Cloud Gateway 统一入口
- 链路追踪:集成 Sleuth + Zipkin
面试题挑战(你能答对几个?)
Q:微服务架构有哪些优缺点?
- A:优点:独立部署、技术异构、弹性伸缩;缺点:运维复杂、分布式事务难、网络延迟
Q:Eureka 的自我保护机制是什么?
- A:当大量服务心跳丢失时,Eureka 会进入保护模式,保留现有注册信息,防止误删健康服务
Q:@LoadBalanced 注解原理是什么?
- A:它会给 RestTemplate 添加一个拦截器,将服务名解析为具体 IP(通过 Ribbon 负载均衡)
Q:如何保证微服务之间的通信安全?
- A:可用 HTTPS、JWT 鉴权、OAuth2,或服务网格(如 Istio)
📌 建议:把今天的 demo 上传到 GitHub,写个 README,这就是你简历上的“微服务项目”!
结语
恭喜你!你已经完成了 Spring Cloud 微服务的第一步。虽然只是简单的服务注册与调用,但这正是微服务架构的基石。
记住:微服务不是银弹,单体应用在小项目中依然高效。但在大型系统中,微服务能极大提升开发效率和系统稳定性。
我当初就是从这样一个小 demo 开始,一步步深入源码、调试问题、优化性能,最终在实习面试中靠这个项目拿下 offer。希望这篇教程也能成为你的起点。
GitHub 仓库地址(示例):
https://github.com/yourname/spring-cloud-demo
有问题欢迎在评论区留言,我会尽力解答。下期我们讲 OpenFeign + Nacos 配置中心实战,记得关注!
—— 一位爱写博客的 CS 研究生

评论 0