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

全栈打工仔
2025-12-18 04:48
阅读 274

大家好,我是你们的学长,一名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)
  • 流程
    1. 服务启动时,向注册中心“登记”自己(IP+端口+服务名)
    2. 其他服务想调用它,就去注册中心“查电话号码”

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:运行验证

  1. 启动 eureka-server → 访问 http://localhost:8761
  2. 启动 user-service
  3. 启动 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 注解
  • 解决:确认 RestTemplate Bean 上有 @LoadBalanced

❓ 问题3:服务启动了但在 Eureka 看不到

  • 原因spring.application.name 未配置,或网络隔离
  • 解决:检查 yml 配置,确保服务能访问 8761 端口

❓ 问题4:Java 版本不兼容

  • 现象:Spring Boot 3.x + Java 8 → 启动失败
  • 解决:统一升级到 Java 17,或降级 Spring Boot 到 2.7

六、学习建议 & 面试题挑战

下一步学什么?

  1. 服务通信升级:用 OpenFeign 替代 RestTemplate(更简洁)
  2. 配置中心:引入 Spring Cloud ConfigNacos 管理配置
  3. 熔断降级:学习 Resilience4j(Hystrix 已停更)
  4. API 网关:用 Spring Cloud Gateway 统一入口
  5. 链路追踪:集成 Sleuth + Zipkin

面试题挑战(你能答对几个?)

  1. Q:微服务架构有哪些优缺点?

    • A:优点:独立部署、技术异构、弹性伸缩;缺点:运维复杂、分布式事务难、网络延迟
  2. Q:Eureka 的自我保护机制是什么?

    • A:当大量服务心跳丢失时,Eureka 会进入保护模式,保留现有注册信息,防止误删健康服务
  3. Q:@LoadBalanced 注解原理是什么?

    • A:它会给 RestTemplate 添加一个拦截器,将服务名解析为具体 IP(通过 Ribbon 负载均衡)
  4. 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

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