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

代码里的小宇宙
2025-06-17 00:47
阅读 300

开篇:Spring Cloud 是什么?它有什么用?

开篇:Spring Cloud 是什么?它有什么用?

想象一下,你正在开发一个大型的电商平台,这个平台需要处理用户的注册、商品浏览、下单支付以及物流管理等多个功能。如果把这些功能全部放在一个程序里,你会发现它越来越臃肿,维护困难,部署复杂,甚至一个小问题都可能导致整个系统崩溃。有没有更好的办法呢?

这时候,微服务架构就派上用场了。它的核心思想是:把一个大系统拆分成多个小而独立的服务,每个服务专注于完成一个特定的功能,并通过网络互相通信协作。这就像一家公司,不同部门各司其职,协同运作。

Spring Cloud,就是帮助我们构建和管理这些微服务的一套工具集。它是基于 Spring Boot 的,专门为微服务设计了很多实用组件,比如:

  • 服务发现(让服务之间找到彼此)
  • 负载均衡(合理分配请求压力)
  • 配置中心(统一管理配置文件)
  • 网关路由(对外统一访问入口)
  • 服务熔断(防止故障扩散)

简单来说,Spring Cloud 就是用来简化微服务开发和管理的工具箱。它让你能够更轻松地构建分布式系统,提升系统的可扩展性、可维护性和灵活性。

环境准备:搭建你的第一个 Spring Cloud 开发环境

环境准备:搭建你的第一个 Spring Cloud 开发环境

要开始学习 Spring Cloud,首先我们需要准备好开发环境。不用担心,其实并不复杂,我们一步步来。

1. 安装 Java 和 Maven

Spring Cloud 是基于 Java 的,所以我们需要安装 JDK(Java Development Kit)。建议使用 JDK 8 或以上版本。你可以从 Oracle 官网OpenJDK 下载安装包。

安装完成后,在命令行中输入以下命令检查是否安装成功:

java -version

如果你看到类似如下的输出,说明 JDK 安装好了:

openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment ...

接下来安装 Maven,这是一个项目依赖管理工具。你可以从 Maven 官网 下载并按照官方文档安装。同样地,安装完成后可以运行下面的命令验证:

mvn -v

2. 安装 IntelliJ IDEA

虽然你可以使用任意文本编辑器配合命令行开发,但为了提高效率,推荐使用 IntelliJ IDEA 这款强大的 Java IDE。社区版(免费)就可以满足我们的需求。可以从 JetBrains 官网 下载并安装。

3. 创建 Spring Boot 项目

我们可以使用 Spring 官方提供的脚手架工具:Spring Initializr 来快速创建一个 Spring Boot 项目。

操作步骤:

  1. 打开浏览器,访问 https://start.spring.io/
  2. 填写如下信息:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 推荐使用最新稳定版(如 2.7.x 或更高)
    • Group: com.example
    • Artifact: springcloud-demo
    • Name: springcloud-demo
    • Description: Demo project for Spring Cloud
    • Package name: com.example.springcloud.demo
    • Packaging: Jar
    • Java: 11 或以上版本(与你本地的 JDK 保持一致)
  3. 在 “Dependencies” 中添加:
    • Spring Web(用于创建 web 服务)
  4. 点击 “Generate” 按钮,下载项目压缩包。
  5. 解压后,用 IntelliJ IDEA 打开该文件夹即可。

4. 验证项目能否运行

打开项目的主类(带有 @SpringBootApplication 注解的那个类),点击运行按钮或者在终端执行以下命令:

mvn spring-boot:run

如果控制台输出显示应用启动成功,那么恭喜你!你已经准备好开始编写你的第一个 Spring Cloud 应用了 🎉

现在我们已经准备好一切开发所需的环境,接下来我们将正式进入 Spring Cloud 的核心知识学习!

Spring Cloud 核心概念详解

在正式动手做项目之前,我们先来了解几个 Spring Cloud 中最基础、最重要的概念。它们就像是搭积木时的核心零件,理解了这些,你就能顺利地拼出属于自己的微服务系统啦!


1. 什么是服务注册与发现?

想象你在公司里上班,当你想找某个同事帮忙解决问题时,你需要知道他在哪个部门、哪个座位,对吧?但在传统的单体应用里,所有功能都在同一个程序里,不需要到处去找人。

但是当系统被拆分成多个微服务以后,每个服务都像是一个独立的小团队,他们各自工作,但又需要相互协作。那怎么才能让这些“团队”之间互相找到对方呢?这时候就需要 服务注册与发现(Service Discovery)

通俗点讲:

服务注册与发现就像是一个企业通讯录。每个服务启动之后会去“登记”自己是谁、在哪儿(IP 地址和端口)。其他服务需要调用它的时候,就通过这个“通讯录”查到它的地址,然后进行沟通。

常见实现方式:

  • Eureka(Netflix 提供)
  • Consul(HashiCorp 提供)
  • Nacos(阿里巴巴提供)

我们这里将以 Eureka 为例进行讲解。


2. 什么是负载均衡?

负载均衡就好比是你去餐厅吃饭,门口有服务员安排座位。如果只有一张桌子,那就只能排队。但如果有很多桌,服务员就会根据谁先来的、哪一桌空着来安排,这样大家都能更快吃到饭。

在微服务中,很多服务可能会同时部署多个实例,这时候就需要 负载均衡(Load Balancing) 来决定客户端的请求到底发送给哪个实例。

常见实现:

  • Ribbon(Netflix 提供)
  • Spring Cloud LoadBalancer(新版本默认使用)

我们在后面实战中会演示如何让服务自动选择合适的目标节点。


3. 什么是 API 网关?

设想你是一家银行的客户,你要办很多事情,比如存款、转账、查询账单等。如果每一项服务都要单独找不同的窗口,你会觉得很麻烦吧?

这时候,API 网关(Gateway) 就相当于一个统一的前台接待员。它负责接收所有外部请求,然后根据不同的路径转发到对应的微服务,避免前端直接对接多个服务。

功能包括:

  • 请求路由
  • 鉴权认证
  • 限流保护
  • 日志记录

常用组件:

  • Zuul(Netflix 提供)
  • Spring Cloud Gateway(现代推荐)

我们会用 Spring Cloud Gateway 来搭建一个简单的网关服务。


4. 什么是配置中心?

试想一下,如果你的多个微服务都用到了一个配置参数,例如数据库连接地址,那你是不是要在每个服务里都修改一遍?如果服务数量多的话,管理起来岂不是很费劲?

这时我们就需要用到 配置中心(Config Server) —— 它就像是一个共享配置库,所有服务都可以从中获取各自的配置信息,集中管理,统一更新。

支持方式:

  • Spring Cloud Config(官方原生支持)
  • Nacos Config(适合国内开发者)
  • Apollo(百度开源)

我们将使用 Nacos 作为配置中心示例。


5. 什么是服务熔断与降级?

有时候某个服务可能因为负载过高或网络不稳定而变得很慢甚至崩溃。如果这个时候其他服务还不断向它发起请求,可能会导致整个系统雪崩式瘫痪。

服务熔断与降级(Circuit Breaker & Fallback) 就是为了解决这个问题。它的工作原理类似于电路中的保险丝,一旦发现某个服务无法正常响应,就会暂时断开连接,转而返回一个预设的“备用答案”,避免整个系统崩溃。

实现方式:

  • Hystrix(Netflix 已弃用)
  • Resilience4j(轻量级现代替代方案)
  • Sentinel(阿里巴巴提供,功能强大)

我们将在项目中引入 Sentinel 来实现基本的熔断机制。


✅ 小结:关键概念总结表

技术名称 中文含义 作用描述 常用组件举例
Eureka 服务注册与发现 让服务之间找到彼此 Netflix Eureka、Consul、Nacos
Ribbon / LoadBalancer 负载均衡 分配请求到合适的实例 Ribbon、Spring Cloud LoadBalancer
Gateway API 网关 统一处理外部请求并转发 Zuul、Spring Cloud Gateway
Config Server 配置中心 统一管理和分发配置文件 Spring Cloud Config、Nacos Config
Sentinel / Resilience4j 熔断与降级 避免因服务异常导致系统崩溃 Hystrix(过时)、Sentinel、Resilience4j

现在你已经了解了这些关键概念,接下来我们就来实际动手做一个 Spring Cloud 微服务项目,看看这些技术是怎么一起工作的 😄

第一步:创建并配置 Eureka 注册中心

还记得前面提到的“服务注册与发现”吗?我们现在就来创建第一个服务——Eureka 注册中心。它是所有服务注册和发现的起点。

缓存策略对比-2

步骤一:创建一个新的 Spring Boot 项目

我们可以通过 https://start.spring.io/ 再创建一个 Spring Boot 项目,这次我们选择 Spring Cloud Eureka Server 作为依赖。

填写信息如下:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.0.x 或最新稳定版
  • Group: com.example
  • Artifact: eureka-server
  • Name: EurekaServer
  • Dependencies: Eureka Server

点击 “Generate” 下载项目压缩包,解压后导入 IntelliJ IDEA。

步骤二:配置 application.yml 文件

src/main/resources/application.yml 中填写以下配置,启用 Eureka 服务并设置端口:

server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

💡 解释:

  • register-with-eureka: false 表示这个 Eureka 不再把自己当作一个普通服务注册进去。
  • fetch-registry: false 表示它不向其他 Eureka 获取注册列表。
  • defaultZone: 设置当前 Eureka 服务器的访问地址。

步骤三:开启 Eureka 服务

在主类加上 @EnableEurekaServer 注解,激活 Eureka 服务:

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
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

步骤四:启动服务并访问管理界面

运行主类,等待服务启动后,打开浏览器访问:http://localhost:8761,你会看到 Eureka 的管理页面。目前还没有任何服务注册进来,等我们下一步创建服务消费者和提供者后,就能看到它们出现在这里啦!

🎉 恭喜!你已经搭建好了 Spring Cloud 的服务注册中心!

创建第一个微服务:用户服务(User Service)

现在我们来创建第一个真正的微服务 —— 用户服务(User Service),它将提供一个获取用户信息的接口,并注册到 Eureka 注册中心。

步骤一:新建 User Service 项目

再次通过 https://start.spring.io/ 创建一个新的 Spring Boot 项目,选中以下依赖:

  • Spring Web(用于创建 REST 接口)
  • Eureka Client(用于注册到 Eureka)

填写信息如下:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 与 Eureka 服务一致的版本
  • Group: com.example
  • Artifact: user-service
  • Name: UserService
  • Dependencies: Spring Web + Eureka Client

下载项目并导入 IntelliJ IDEA。

步骤二:配置 application.yml

编辑 application.yml 文件,设置服务名称、端口,并告诉它去哪里注册:

spring:
  application:
    name: user-service
server:
  port: 8081

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

💡 解释:

  • spring.application.name 指定服务名。
  • eureka.client.service-url.defaultZone 告诉它去哪个 Eureka 注册中心注册自己。

步骤三:创建一个简单的用户接口

我们在项目中新增一个 Controller 类,提供一个 /users/{id} 的接口,模拟获取用户信息。

package com.example.userservice.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id) {
        return "用户 ID:" + id + ",姓名:张三";
    }
}

步骤四:启动服务并在 Eureka 查看注册情况

运行 UserServiceApplication 主类,启动服务。稍等几秒后刷新 Eureka 页面(http://localhost:8761),你会看到一个名为 USER-SERVICE 的服务出现在注册列表中。

✅ 到此为止,你已经完成了第一个微服务的创建,并成功注册到了 Eureka 服务中。下一节我们将会创建另一个服务来调用它哦!

创建服务消费者:订单服务(Order Service)并远程调用用户服务

现在我们来创建一个订单服务(Order Service),它会调用用户服务(User Service)来获取用户信息。这样你就能看到两个微服务是如何协同工作的啦!

步骤一:新建 Order Service 项目

再次使用 https://start.spring.io/ 创建一个新的 Spring Boot 项目,添加以下依赖:

  • Spring Web
  • Eureka Client
  • OpenFeign(用于远程调用)

填写信息如下:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 与之前的项目一致
  • Group: com.example
  • Artifact: order-service
  • Name: OrderService
  • Dependencies: Spring Web, Eureka Client, Feign Clients

下载后导入 IntelliJ IDEA。

步骤二:配置 application.yml

编辑 application.yml 文件,设置服务名称、端口,并注册到 Eureka:

spring:
  application:
    name: order-service
server:
  port: 8082

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

步骤三:启用 Feign 并定义远程调用接口

Feign 可以让我们像调用本地方法一样远程调用其他服务的接口。

1. 启用 Feign 客户端

在主类上添加 @EnableFeignClients 注解:

package com.example.orderservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

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

2. 创建 Feign 客户端接口

创建一个接口,声明我们要调用的远程方法:

package com.example.orderservice.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "user-service")
public interface UserClient {

    @GetMapping("/users/{id}")
    String getUserById(@PathVariable("id") Long userId);
}

这里的 @FeignClient(name = "user-service") 表示我们要调用名为 user-service 的服务。

步骤四:创建订单接口并调用用户服务

创建一个订单控制器,模拟下单操作并调用用户服务:

package com.example.orderservice.controller;

import com.example.orderservice.client.UserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/{userId}")
    public String getOrder(@PathVariable Long userId) {
        String userInfo = userClient.getUserById(userId);
        return "订单信息:用户 [" + userInfo + "] 已下订单。";
    }
}

系统架构设计图-1

步骤五:启动服务并测试远程调用

确保 Eureka ServerUser Service 都在运行的情况下,启动 Order Service。然后访问:

http://localhost:8082/orders/1001

你应该会看到类似如下输出:

订单信息:用户 [用户 ID:1001,姓名:张三] 已下订单。

✅ 恭喜你!你已经成功实现了两个微服务之间的远程调用!

使用 Spring Cloud Gateway 实现 API 网关

现在我们已经有了两个

评论 0

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