Spring Cloud从零开始:微服务入门指南
开篇:什么是Spring Cloud?它用来做什么?

如果你是一个刚开始学习后端开发的新手,你可能听说过“微服务”这个词,也可能对“Spring Boot”有所了解。那Spring Cloud是什么呢?
简单来说:
Spring Cloud 是一套用于构建分布式系统的工具集。
你可以把它想象成一个“工具箱”,专门帮你更方便地管理多个小型的服务(也就是微服务),让这些服务之间能够互相发现、通信、容错、负载均衡等等。
它的典型用途包括:
- 多个独立服务之间的注册与发现
- 实现负载均衡
- 服务之间的配置共享
- 网关统一请求入口
- 分布式链路追踪等等
这篇文章将带你在没有任何基础的前提下,一步步理解并使用Spring Cloud的基本功能,并完成一个小项目来加深印象。
环境准备:搭建你的开发环境

在正式开始之前,我们需要准备好以下环境:
所需软件清单:
| 软件/工具 | 版本要求(推荐) |
|---|---|
| Java JDK | 1.8 或以上 |
| Maven | 最新版本 |
| IntelliJ IDEA | 推荐社区版或Ultimate版 |
| Spring Boot | 2.7.x 或更高 |
| Spring Cloud | 2021.x.x |
步骤一:安装JDK和Maven
下载并安装JDK 1.8或更高版本
Oracle官网配置Java环境变量
下载Maven
地址: https://maven.apache.org/download.cgi解压Maven并设置
MAVEN_HOME系统变量,同时加入PATH环境变量验证是否成功:命令行输入以下命令
java -version mvn -v
步骤二:安装IDEA(IntelliJ IDEA)
- 下载安装包(建议使用IDEA Community免费版即可)
- 安装并打开
- 安装好插件:
- Lombok
- Spring Boot
现在,我们的开发环境就准备好了!
核心概念:用最通俗的语言解释关键术语

为了更好的理解Spring Cloud,我们先来认识几个核心的概念:
1. 微服务是什么?
传统单体应用就像一栋房子,所有功能都在一个程序中。而微服务是把这栋房子拆分成多个小房间,每个房间单独工作但又能协作。
比如:
- 用户服务
- 订单服务
- 支付服务
它们各自运行,通过网络相互调用。
2. Eureka Server:服务注册与发现中心
想象你有一张公司通讯录,每个人都知道彼此的名字和电话。Eureka 就像这张通讯录。
- 服务启动时会自动注册到Eureka
- 其他服务可以通过名字找到对方的位置
这样就不需要记住IP地址了,非常灵活。
3. Feign Client:简化远程调用的客户端
Feign的作用就是让你写代码像调用本地方法一样去调用其他服务的方法。
例如:
@FeignClient("order-service")
interface OrderServiceClient {
@GetMapping("/orders/{id}")
String getOrderById(@PathVariable String id);
}
看起来是不是很熟悉?这就是本地接口的感觉,但它实际上在调用别的服务!
4. Ribbon:客户端负载均衡器
当你有多个“订单服务”的时候,怎么知道该访问哪一个呢?Ribbon能自动帮你在多个实例之间做负载均衡(轮询等)。
5. Gateway(网关):请求的统一入口
Gateway就像是前台接待员,所有请求都先经过它。它可以做鉴权、路由、限流等功能。
实战项目:一步一步创建第一个Spring Cloud项目
我们将创建一个简单的微服务场景,包含以下几个组件:
- 用户服务(user-service)
- 订单服务(order-service)
- 注册中心Eureka Server
- 网关gateway-service
第一步:新建父工程(parent project)
使用Maven创建一个空项目,pom.xml内容如下:
<!-- pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springcloud-demo</artifactId>
<version>1.0.0</version>
<modules>
<module>eureka-server</module>
<module>order-service</module>
<module>user-service</module>
<module>gateway-service</module>
</modules>
<packaging>pom</packaging>
</project>
第二步:搭建Eureka注册中心
创建模块 eureka-server
1. 添加依赖(pom.xml):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2. 启动类添加注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3. 配置文件application.yml:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动后访问:http://localhost:8761 查看注册中心界面。
第三步:创建两个微服务(user-service & order-service)
以 user-service 为例,步骤如下:
1. 添加依赖:
<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>
2. 启动类添加:
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
3. application.yml配置:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
同样方式创建 order-service,端口改为8082,名称为order-service
第四步:Feign服务间调用
我们要实现 user-service 调用 order-service
在 user-service 中添加 Feign 客户端
@FeignClient(name = "order-service")
public interface OrderServiceClient {
@GetMapping("/orders/{id}")
String getOrderByUserId(@PathVariable("id") String id);
}
控制器中调用:
@RestController
@RequestMapping("/users")
public class UserController {
private final OrderServiceClient orderServiceClient;
public UserController(OrderServiceClient orderServiceClient) {
this.orderServiceClient = orderServiceClient;
}
@GetMapping("/{userId}/orders")
public String getUserOrder(@PathVariable String userId) {
return orderServiceClient.getOrderByUserId(userId);
}
}
第五步:加上Ribbon负载均衡
Spring Cloud默认整合了Ribbon,只需确保Feign开启:
在 user-service 的配置类加上:
@Configuration
@EnableFeignClients
public class FeignConfig {
}
第六步:添加网关 gateway-service
1. 添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. 启动类启用网关:
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
3. application.yml配置:
server:
port: 8090
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
现在你已经完成了整个项目的搭建!你可以尝试访问:
- 注册中心:http://localhost:8761
- 用户服务订单查询(通过网关):
GET http://localhost:8090/api/users/1/orders
常见问题解答
Q1:为什么我的服务没有注册到Eureka?
- 检查端口是否冲突
- 确认
@EnableEurekaClient是否被正确启用 - 确保
application.yml中的 Eureka 地址正确无误
Q2:Feign调用时报错找不到服务?
- 检查服务名拼写是否一致
- 检查是否开启了
@EnableFeignClients - 确保服务已经注册成功后再进行调用
Q3:为什么访问网关的时候报404?
- 网关路径是否配置正确
- 是否使用了StripPrefix导致前缀失效
- 是否开启了网关服务和对应的服务模块
学习建议:下一步可以学什么?
恭喜你完成了Spring Cloud的入门之旅!接下来你可以继续深入学习这些方向:
- Spring Cloud Config:统一管理多服务的配置信息
- Spring Cloud Sleuth + Zipkin:分布式请求链路追踪
- Spring Cloud Alibaba:集成Nacos、Sentinel等国产优秀组件
- Docker + Kubernetes:容器化部署微服务集群
- 服务熔断与降级(Hystrix)
随着你的经验增加,你会发现自己不仅可以轻松应对企业级架构设计,还具备了搭建大型后端系统的能力!
希望这篇教程对你有所帮助,愿你在Spring Cloud的世界里一路高歌猛进!如果有什么问题,欢迎留言交流 😊

评论 0