Spring Cloud从零开始:微服务入门指南

预发守门员
2026-02-05 15:07
阅读 290

大家好,我是掘金上经常写后端教程的全栈工程师。最近有不少刚学完 Java 基础的同学问我:“微服务到底是什么?Spring Cloud 怎么上手?”我当初学的时候也是一头雾水——文档太专业,概念太抽象,代码一跑就报错。所以今天,我就用最简单、最实践的方式,带你从零搭建一个 Spring Cloud 微服务项目。

无论你是刚学完《Java 编程思想》的新手,还是正在用 Gemini(Google 的 AI 工具)辅助学习编程的探索者,这篇文章都能帮你稳稳迈出微服务的第一步。


什么是微服务?为什么需要 Spring Cloud?

在传统单体应用中,所有功能都打包在一个大项目里。比如一个电商系统,用户、商品、订单、支付全在一个 jar 包里运行。这就像把所有鸡蛋放在一个篮子里——开发简单,但一旦用户量激增,整个系统就得一起扩容,维护成本高,上线风险大。

微服务就是把大系统拆成多个小服务:

  • 用户服务(负责注册登录)
  • 商品服务(负责商品信息)
  • 订单服务(负责下单)

每个服务独立开发、部署、扩展,互不影响。

但问题来了:这么多服务怎么互相发现?怎么调用?怎么保证高可用?这就是 Spring Cloud 的用武之地。它是一套基于 Spring Boot 的微服务工具集,帮我们解决服务注册、配置管理、负载均衡、熔断等难题。

💡 简单说:Spring Boot 是造车的,Spring Cloud 是让车队协同行驶的交通系统。


开发环境准备:5 分钟搞定

在动手前,先确保你的电脑装好以下工具:

工具 版本建议 用途
JDK 17 或 21(推荐) Java 运行环境
Maven 3.8+ 项目依赖管理
IDE IntelliJ IDEA(社区版即可) 代码编写
Git 最新 版本控制(可选)

第一步:安装 JDK

如果你还没装 JDK,推荐使用 Adoptium 下载 OpenJDK 17。安装后,在终端输入:

java -version

看到类似输出即表示成功:

openjdk version "17.0.10" 2024-01-16

第二步:创建 Spring Boot 项目

访问 Spring Initializr,按以下配置生成项目:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.x(最新稳定版)
  • Group: com.example
  • Artifact: user-service
  • Dependencies:
    • Spring Web
    • Eureka Discovery Client(用于服务注册)

点击“Generate”,下载 ZIP 并解压到你的工作目录。

📌 小贴士:我当初第一次用 Initializr 时,忘了加 Eureka 依赖,结果服务注册不了,折腾了两小时。记住:微服务项目必须包含服务发现组件!


核心概念:用生活例子讲清楚

1. 服务注册与发现(Eureka)

想象你去参加一个大型展会,有 100 个展位。主办方提供一个“展位地图”(Eureka Server),每个参展商(服务)先在地图上登记自己的位置(IP + 端口)。参观者(其他服务)只需查地图,就能找到目标展位。

  • Eureka Server:服务注册中心(地图)
  • Eureka Client:各个微服务(参展商)

2. 服务调用(RestTemplate + LoadBalancer)

当用户服务需要调用商品服务时,不能写死 IP(比如 http://192.168.1.10:8081),因为商品服务可能部署多台。Spring Cloud 提供 LoadBalancer,自动从注册中心获取可用实例并轮询调用。

3. 配置中心(Config Server,本文暂不涉及)

所有服务的配置(如数据库地址)集中管理,避免每个服务单独改配置文件。


实战项目:搭建两个微服务

我们将构建:

  • eureka-server:服务注册中心
  • user-service:用户服务(向 Eureka 注册)
  • product-service:商品服务(向 Eureka 注册,并被 user-service 调用)

第一步:创建 Eureka Server

新建一个 Spring Boot 项目,命名为 eureka-server,只添加 Eureka Server 依赖。

pom.xml 中确认有:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

在主启动类上加注解:

@SpringBootApplication
@EnableEurekaServer // 启用 Eureka 服务端
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

配置 application.yml

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false  # 不向自己注册
    fetch-registry: false       # 不拉取注册表
  instance:
    hostname: localhost

启动项目,访问 http://localhost:8761,你会看到 Eureka 的管理界面(虽然现在空空如也)。

第二步:创建 User Service

回到之前用 Initializr 创建的 user-service 项目。

application.yml 中配置:

server:
  port: 8080

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 String id) {
        return "User " + id + " from USER-SERVICE";
    }
}

启动 user-service,刷新 Eureka 页面,你会看到 USER-SERVICE 出现在 Instances 列表中!

第三步:创建 Product Service

同样方式创建 product-service,端口设为 8081,服务名设为 product-service

控制器:

@RestController
public class ProductController {
    
    @GetMapping("/product/{id}")
    public String getProduct(@PathVariable String id) {
        return "Product " + id + " from PRODUCT-SERVICE";
    }
}

启动后,Eureka 页面应显示两个服务。

第四步:让 User Service 调用 Product Service

现在,我们要在 user-service 中调用 product-service

首先,在 user-servicepom.xml 中添加:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

然后,配置 RestTemplate 支持负载均衡:

@Configuration
public class RestTemplateConfig {
    
    @Bean
    @LoadBalanced // 关键!启用服务发现
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

UserController 中注入并调用:

@RestController
public class UserController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/user/{id}/with-product")
    public String getUserWithProduct(@PathVariable String id) {
        // 使用服务名 product-service,而不是 IP
        String product = restTemplate.getForObject(
            "http://product-service/product/123", 
            String.class
        );
        return "User " + id + " + " + product;
    }
}

启动所有服务,访问:

http://localhost:8080/user/456/with-product

你应该看到:

User 456 + Product 123 from PRODUCT-SERVICE

✅ 恭喜!你已经完成了第一个微服务调用!


新手常见问题解答

Q1:启动时报错 “No instances available for product-service”

原因product-service 没有成功注册到 Eureka,或者 user-service 没有加上 @LoadBalanced

解决

  • 检查 product-service 是否启动成功
  • 检查 application.ymleureka.client.service-url.defaultZone 是否正确
  • 确认 RestTemplate 上有 @LoadBalanced 注解

Q2:为什么用服务名而不是 IP?

因为微服务是动态的。IP 可能变,端口可能变,但服务名是固定的。Spring Cloud 会自动从 Eureka 获取当前可用实例列表。

Q3:Spring Cloud 和 Spring Boot 什么关系?

  • Spring Boot:简化单个应用的开发(内嵌 Tomcat、自动配置等)
  • Spring Cloud:基于 Spring Boot,提供微服务治理能力(服务发现、配置中心等)

📚 学习建议:先掌握 Spring Boot(推荐书籍《Spring Boot 实战》),再学 Spring Cloud。

Q4:Gemini 能帮我学 Spring Cloud 吗?

当然可以!你可以用 Gemini(或类似 AI 工具):

  • 解释某个注解的作用
  • 生成 YAML 配置模板
  • 调试错误日志 但不要完全依赖——理解原理比复制代码更重要。

学习路径建议:下一步该学什么?

你已经迈出了微服务的第一步!接下来,我建议按这个顺序深入:

  1. 掌握核心组件

    • Config Server(统一配置)
    • Gateway(API 网关)
    • OpenFeign(声明式服务调用,比 RestTemplate 更简洁)
  2. 学习容错机制

    • Resilience4j 或 Sentinel(替代已停更的 Hystrix)
    • 熔断、降级、限流的实际场景
  3. 部署与监控

    • Docker 容器化
    • Prometheus + Grafana 监控
    • Zipkin 链路追踪
  4. 进阶书籍推荐

    • 《Spring Microservices in Action》(英文,但代码清晰)
    • 《微服务架构设计模式》(理论扎实)

⚠️ 避坑指南:不要一开始就追求“高可用”“分布式事务”!先用最简单的架构跑通流程,再逐步优化。


结语

微服务不是银弹,但它是现代后端开发的必备技能。我当初也是从“Hello World”级别的服务注册开始,一步步踩坑、调试、重构,才真正理解了它的价值。

希望这篇教程能帮你少走弯路。记住:每个复杂的系统,都是从一个简单的服务调用开始的。

如果你觉得有帮助,欢迎在掘金关注我,我会持续更新更多“手把手”实战教程。也欢迎在评论区留言你的问题——我当年卡住的地方,也许正是你现在遇到的!

Happy Coding!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝