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

杰出之战士
2025-12-12 16:33
阅读 536

大家好,我是一个从前端培训班转行做后端开发的工程师。虽然现在主要搞Java后端,但我知道很多和我一样从零开始的朋友,在面对“Spring Cloud”、“微服务”这些词时,心里多少有点发怵。

我当初学的时候,光是看那些官方文档就头大:什么Eureka、Ribbon、Feign、Hystrix……每个词都像天书。更别说还要配一堆YAML文件、启动好几个服务。很多人(包括我)第一反应就是:“这玩意儿能不能跑起来?”

所以今天,我就以一个“过来人”的身份,写这篇《Spring Cloud从零开始:微服务入门指南》,不讲高深理论,只讲问题怎么解决代码怎么写服务怎么跑起来。哪怕你连Maven都没用过,只要跟着一步步来,也能搭出一个能跑的微服务系统。


一、Spring Cloud 到底是干什么的?

简单说:Spring Cloud 是一套工具,用来帮你把一个大项目拆成多个小服务,并让它们能互相通信、自动发现、容错、配置统一管理。

想象一下你开了一家餐厅:

  • 原来:一个人既当厨师、又当服务员、还管收银(单体应用)
  • 现在:厨师只管炒菜,服务员只管点单,收银员只管结账(微服务)

但问题来了:服务员怎么知道哪个厨师空闲?收银员怎么知道菜单价格变了?——这就需要一套“协调机制”。

Spring Cloud 就是这套机制的“工具箱”。

📚 推荐书籍:如果你喜欢系统学习,《Spring微服务实战》这本书非常适合新手,代码清晰、讲解细致。我自己就是靠它入门的。


二、环境准备:5分钟搭好开发环境

你需要安装以下工具:

工具 作用 版本建议
JDK 8 或 17 Java运行环境 推荐 JDK 17(长期支持)
Maven 项目依赖管理 3.6+
IntelliJ IDEA 开发IDE 社区版免费
Spring Boot CLI(可选) 快速生成项目 非必需

💡 开发心得:别纠结版本!Spring Cloud 和 Spring Boot 有严格的版本对应关系。新手直接用 Spring Boot 3.2 + Spring Cloud 2023.0.0(代号“Train”)即可,这是目前最稳定的组合。

第一步:创建父工程(Maven聚合项目)

我们先建一个总项目,下面放多个子模块(每个子模块就是一个微服务)。

# 在你的工作目录下
mkdir spring-cloud-demo
cd spring-cloud-demo

然后在 IDEA 中:

  1. New → Project → Empty Project
  2. 右键项目 → New → Module → Maven → 不选模板
  3. GroupId: com.example,ArtifactId: spring-cloud-demo
  4. 删除 src 文件夹(父工程不需要代码)

编辑 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>

    <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 Cloud 默认用 Eureka(现在更多用 Nacos,但 Eureka 更简单,适合入门)。


四、实战项目:搭建一个“用户查询”微服务系统

我们要做两个服务:

  1. user-service:提供用户信息(服务提供者)
  2. order-service:调用用户服务获取用户姓名(服务消费者)

还有一个基础设施: 3. eureka-server:服务注册中心

步骤1:创建 eureka-server(注册中心)

在 IDEA 中右键父工程 → New → Module → Spring Initializr

  • Project SDK: 选你的 JDK
  • Language: Java
  • Spring Boot: 3.2.0
  • Group: com.example
  • Artifact: eureka-server
  • Dependencies: 搜索并勾选 Eureka Server

等待项目生成后,编辑 EurekaServerApplication.java

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@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       # 不需要从别的注册中心拉取数据
  server:
    wait-time-in-ms-when-sync-empty: 0

✅ 启动这个服务,访问 http://localhost:8761,你会看到 Eureka 的管理界面(虽然现在一个服务都没有)。

步骤2:创建 user-service(服务提供者)

同样用 Spring Initializr 创建新模块:

  • Artifact: user-service
  • Dependencies: Eureka Client, Spring Web

主类加注解:

@SpringBootApplication
@EnableEurekaClient // 注册到Eureka
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

application.yml

server:
  port: 8081

spring:
  application:
    name: user-service  # 服务名称,其他服务通过这个名字调用你

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # 指向注册中心地址

创建一个简单的 Controller:

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public Map<String, Object> getUser(@PathVariable Long id) {
        // 模拟数据库查询
        Map<String, Object> user = new HashMap<>();
        user.put("id", id);
        user.put("name", "张三");
        user.put("email", "zhangsan@example.com");
        return user;
    }
}

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

步骤3:创建 order-service(服务消费者)

再建一个模块:

  • Artifact: order-service
  • Dependencies: Eureka Client, Spring Web

主类:

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }

    // 注册一个RestTemplate,用于远程调用
    @Bean
    @LoadBalanced // 开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

application.yml

server:
  port: 8082

spring:
  application:
    name: order-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

Controller 调用 user-service:

@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/{userId}")
    public String createOrder(@PathVariable Long userId) {
        // 通过服务名调用,而不是IP+端口!
        String url = "http://user-service/user/" + userId;
        Map user = restTemplate.getForObject(url, Map.class);
        String name = (String) user.get("name");
        return "为用户 [" + name + "] 创建订单成功!";
    }
}

✅ 启动 order-service,访问 http://localhost:8082/order/123,你会看到:

为用户 [张三] 创建订单成功!

🎉 恭喜!你已经完成了第一个 Spring Cloud 微服务系统!


五、常见问题 & 避坑指南

❓1. 为什么我的服务没注册到 Eureka?

  • 检查 application.yml 里的 eureka.client.service-url.defaultZone 是否指向正确的注册中心地址(注意结尾要有 /eureka/
  • 确保注册中心先启动
  • 查看控制台有没有报错(比如网络不通)

❓2. RestTemplate 调用时报 “UnknownHostException: user-service”

  • 忘记加 @LoadBalanced 注解!这个注解让 Spring Cloud 能把 user-service 解析成实际 IP 地址
  • 确保 user-service 已经成功注册到 Eureka

❓3. 能不能用 Go 写微服务?

当然可以!微服务的核心是协议互通,不是语言绑定。

  • Spring Cloud 服务通常用 HTTP + JSON 通信
  • 你可以用 Go 写一个服务,注册到 Eureka(需要第三方库,如 eureka-go-client
  • 但对新手来说,建议先用 Java 把整套流程跑通,理解原理后再尝试多语言混用

🌐 综合建议:微服务架构下,团队可以选择不同技术栈,但必须统一通信协议(比如 REST、gRPC)、日志格式、监控指标等。不要为了“炫技”而混用语言,增加运维复杂度。


六、下一步学习路径建议

你现在已经掌握了微服务最基础的能力:服务注册 + 远程调用。接下来可以按顺序学习:

  1. 服务配置中心(Spring Cloud Config / Nacos Config)
    → 解决“每个服务都要改配置文件”的问题

  2. 服务网关(Spring Cloud Gateway)
    → 所有请求先经过网关,实现路由、鉴权、限流

  3. 熔断与降级(Resilience4j)
    → 当 user-service 挂了,order-service 不要跟着崩

  4. 链路追踪(Sleuth + Zipkin)
    → 一次请求经过哪些服务?耗时多少?

📚 书籍推荐进阶


最后的话

我当初学 Spring Cloud 时,最大的误区就是“想一口吃成胖子”。其实微服务不是魔法,它只是把单体应用拆开,再用工具把它们重新“粘”起来。

记住:先跑起来,再优化。

你现在手上的这个小 demo,虽然简单,但它包含了微服务最核心的思想。只要理解了“注册-发现-调用”这个流程,后面学任何组件都会事半功倍。

如果你是从培训班出来的,或者完全零基础,别怕犯错。我见过太多同学因为第一步没跑通就放弃了。但只要你坚持把这三个服务跑起来,你就已经超过80%的初学者了。

加油!有问题欢迎留言讨论。

评论 0

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