【Java】Spring Boot 与 Spring Cloud 整合:微服务架构入门实战

Spring Boot 与 Spring Cloud 整合:微服务架构入门实战

  • [Spring Boot 与 Spring Cloud 整合:微服务架构入门实战](#Spring Boot 与 Spring Cloud 整合:微服务架构入门实战)
    • 一、微服务架构:核心概念与优势
    • [二、Spring Boot 与 Spring Cloud 的角色与关系](#二、Spring Boot 与 Spring Cloud 的角色与关系)
      • [1. Spring Boot:微服务的"实现载体"](#1. Spring Boot:微服务的“实现载体”)
      • [2. Spring Cloud:微服务的"生态管家"](#2. Spring Cloud:微服务的“生态管家”)
      • [3. 二者核心关系](#3. 二者核心关系)
    • [三、实战:Spring Boot 与 Spring Cloud 整合示例](#三、实战:Spring Boot 与 Spring Cloud 整合示例)
      • [1. 技术栈说明](#1. 技术栈说明)
      • [2. 步骤 1:搭建 Eureka 服务注册中心](#2. 步骤 1:搭建 Eureka 服务注册中心)
        • [2.1 创建 Eureka Server 项目](#2.1 创建 Eureka Server 项目)
        • [2.2 编写 Eureka Server 启动类](#2.2 编写 Eureka Server 启动类)
        • [2.3 配置 Eureka Server(application.yml)](#2.3 配置 Eureka Server(application.yml))
        • [2.4 启动 Eureka Server 并验证](#2.4 启动 Eureka Server 并验证)
      • [3. 步骤 2:创建 User Service 微服务](#3. 步骤 2:创建 User Service 微服务)
        • [3.1 创建 User Service 项目](#3.1 创建 User Service 项目)
        • [3.2 编写 User Service 启动类](#3.2 编写 User Service 启动类)
        • [3.3 编写 User 实体类与 REST 接口](#3.3 编写 User 实体类与 REST 接口)
        • [3.4 配置 User Service(application.yml)](#3.4 配置 User Service(application.yml))
        • [3.5 启动 User Service 并验证注册](#3.5 启动 User Service 并验证注册)
      • [4. 步骤 3:服务发现演示](#4. 步骤 3:服务发现演示)
    • 四、服务注册与发现流程图
    • 五、整合要点总结与后续探索方向
      • [1. 整合核心要点](#1. 整合核心要点)
      • [2. 后续探索方向](#2. 后续探索方向)

对于具备 Java 基础和 Spring Boot 初步经验的开发者而言,从单体应用转向微服务架构是技术进阶的重要方向。Spring Boot 简化了单体应用的开发,而 Spring Cloud 则为微服务架构提供了完整的生态支持,二者的完美整合是构建稳定、高效微服务系统的基础。本文将从概念入手,逐步拆解二者的角色关系,并通过实战案例带你上手微服务整合开发。

📕个人领域 :Linux/C++/java/AI

🚀 个人主页有点流鼻涕 · CSDN

💬 座右铭 : "向光而行,沐光而生。"

一、微服务架构:核心概念与优势

微服务架构是一种将应用程序拆分为多个独立、可部署、松耦合服务的架构模式。每个服务聚焦于完成单一业务功能,通过轻量级通信协议(如 HTTP/REST)实现服务间交互,且各服务可独立采用不同技术栈、独立部署和扩展。

相较于传统单体架构,微服务架构具备以下核心优势:

  • 独立部署与扩展:单个服务出现问题不影响整体系统,可根据业务负载针对性扩展高频服务,资源利用率更高。

  • 技术栈灵活选择:不同服务可根据业务需求选用合适的技术栈(如订单服务用 Java,数据分析服务用 Python),突破单体应用技术栈限制。

  • 团队协作高效:服务按业务域拆分,不同团队可并行开发、测试和维护各自负责的服务,提升迭代效率。

  • 容错性更强 :通过服务熔断、降级等机制,可避免单个服务故障蔓延至整个系统,提升系统稳定性。

二、Spring Boot 与 Spring Cloud 的角色与关系

Spring Boot 和 Spring Cloud 并非竞争关系,而是互补共生的组合,二者共同构成微服务开发的基石。

1. Spring Boot:微服务的"实现载体"

Spring Boot 核心定位是"简化 Spring 应用开发",通过自动配置、起步依赖(Starter)等特性,让开发者无需繁琐的 XML 配置,快速构建独立运行的 Java 应用。在微服务中,每个独立的服务都是一个 Spring Boot 应用,Spring Boot 为单个微服务提供了基础运行环境和开发简化能力,是微服务的"最小运行单元"。

2. Spring Cloud:微服务的"生态管家"

Spring Cloud 并非单一框架,而是一套微服务架构的一站式解决方案,它基于 Spring Boot 构建,整合了众多成熟的第三方组件,为微服务集群提供了服务注册发现、配置管理、负载均衡、熔断降级、网关路由等核心能力。如果说每个 Spring Boot 应用是"单独的士兵",Spring Cloud 就是"指挥体系",负责协调所有士兵协同作战。

3. 二者核心关系

Spring Cloud 依赖 Spring Boot 实现微服务的个体开发,Spring Boot 应用通过引入 Spring Cloud 相关组件,接入微服务集群并获得分布式能力。简单来说:Spring Boot 负责"造服务",Spring Cloud 负责"管服务"

三、实战:Spring Boot 与 Spring Cloud 整合示例

本案例将基于 Spring Cloud Netflix Eureka 组件,实现"服务注册中心 + 用户服务"的基础微服务架构,涵盖服务创建、注册、发现全流程。案例代码可直接复制运行,需提前准备 JDK 8+、Maven 3.6+、IDE(IntelliJ IDEA 或 Eclipse)。

1. 技术栈说明

  • Spring Boot 版本:2.7.15(稳定版,兼容 Spring Cloud)

  • Spring Cloud 版本:2021.0.8(对应 Spring Boot 2.7.x 系列)

  • 服务注册组件:Spring Cloud Netflix Eureka

2. 步骤 1:搭建 Eureka 服务注册中心

Eureka 是 Netflix 开源的服务注册与发现组件,分为 Server(注册中心)和 Client(服务客户端)两部分。Server 负责接收服务注册、维护服务列表;Client 负责向 Server 注册自身,并从 Server 获取服务列表,实现服务发现。

2.1 创建 Eureka Server 项目

在 IDE 中创建新的 Spring Boot 项目,命名为 eureka-server,并在 pom.xml 中引入以下依赖:

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.15</version>
    <relativePath/>
</parent>

<dependencies&gt;
    <!-- Eureka Server 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    &lt;/dependency&gt;
&lt;/dependencies&gt;

<!-- Spring Cloud 依赖管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.8</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
2.2 编写 Eureka Server 启动类

在项目主包下创建启动类 EurekaServerApplication.java,通过 @EnableEurekaServer 注解开启 Eureka 注册中心功能:

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);
    }
}
2.3 配置 Eureka Server(application.yml)

src/main/resources 目录下创建 application.yml 文件,配置注册中心端口、服务名、自我保护机制等:

yaml 复制代码
server:
  port: 8761 # Eureka 注册中心默认端口

spring:
  application:
    name: eureka-server # 注册中心服务名

eureka:
  client:
    register-with-eureka: false # 禁止注册中心自身向自己注册
    fetch-registry: false # 禁止注册中心从自身获取服务列表
    service-url:
      defaultZone: http://localhost:8761/eureka/ # 服务注册地址
  server:
    enable-self-preservation: false # 关闭自我保护机制(开发环境建议关闭,生产环境开启)
    eviction-interval-timer-in-ms: 30000 # 清理无效服务的间隔时间(30秒)
2.4 启动 Eureka Server 并验证

运行启动类,访问 http://localhost:8761,若看到 Eureka 管理界面,说明注册中心搭建成功。此时界面中"Instances currently registered with Eureka"为空,暂无服务注册。

3. 步骤 2:创建 User Service 微服务

创建一个简单的用户服务(user-service),作为 Spring Boot 应用,通过 Eureka Client 组件注册到上述注册中心,并提供一个 REST 接口供后续调用。

3.1 创建 User Service 项目

新建 Spring Boot 项目,命名为 user-service,pom.xml 中引入以下依赖(Eureka Client + Web 依赖):

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.15</version>
    <relativePath/>
&lt;/parent&gt;

&lt;dependencies&gt;
    <!-- Spring Web 依赖,用于提供 REST 接口 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web&lt;/artifactId&gt;
    &lt;/dependency&gt;
    <!-- Eureka Client 依赖,用于注册服务 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

<!-- Spring Cloud 依赖管理,与 Eureka Server 一致 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.8</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
3.2 编写 User Service 启动类

创建启动类 UserServiceApplication.java,通过 @EnableEurekaClient 注解开启 Eureka 客户端功能(Spring Cloud 2.3+ 后可省略该注解,引入依赖后自动生效):

java 复制代码
package com.example.userservice;

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

@SpringBootApplication
@EnableEurekaClient // 开启 Eureka 客户端功能(可选,依赖生效后自动注册)
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
3.3 编写 User 实体类与 REST 接口

创建 User 实体类和 UserController,提供一个根据 ID 查询用户的接口:

java 复制代码
// User.java
package com.example.userservice.entity;

import lombok.Data;

@Data // Lombok 注解,自动生成 getter/setter/toString
public class User {
    private Long id;
    private String username;
    private String email;
}
java 复制代码
// UserController.java
package com.example.userservice.controller;

import com.example.userservice.entity.User;
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("/user/{id}")
    public User getUserById(@PathVariable Long id) {
        User user = new User();
        user.setId(id);
        user.setUsername("testUser" + id);
        user.setEmail("testUser" + id + "@example.com");
        return user;
    }
}

注:若使用 Lombok 注解(@Data),需在 IDE 中安装 Lombok 插件,并在 pom.xml 中引入 Lombok 依赖,否则会报错:

xml 复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
3.4 配置 User Service(application.yml)

配置服务端口、服务名、Eureka 注册地址等信息:

yaml 复制代码
server:
  port: 8081 # User Service 端口(可自定义,避免与注册中心冲突)

spring:
  application:
    name: user-service # 服务名(重要,服务发现时通过该名称定位)

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/ # 注册到 Eureka 注册中心的地址
  instance:
    prefer-ip-address: true # 注册时显示 IP 地址,便于调试
    instance-id: ${spring.application.name}:${server.port} # 服务实例 ID,唯一标识
3.5 启动 User Service 并验证注册

运行 UserServiceApplication,再次访问 Eureka 管理界面(http://localhost:8761),可在"Instances currently registered with Eureka"中看到 user-service 服务已成功注册,实例 ID 为 user-service:8081

同时,访问 http://localhost:8081/user/1,可看到返回的用户信息,说明接口正常提供服务:

4. 步骤 3:服务发现演示

服务注册完成后,其他服务可通过 Eureka 注册中心获取 user-service 的地址,实现服务调用(即服务发现)。此处可简单演示:若启动多个 user-service 实例(修改端口为 8082、8083),Eureka 会自动维护所有实例列表,为后续负载均衡打下基础。

启动多个实例的方法:在 IDE 中复制 User Service 的启动配置,修改 VM 参数 -Dserver.port=8082,依次启动 8081、8082、8083 三个实例,刷新 Eureka 界面可看到三个实例均已注册。

四、服务注册与发现流程图

以下通过 Mermaid 流程图,清晰展示"客户端 → Eureka Server ← 微服务实例"的交互过程,涵盖服务注册、心跳续约、服务发现三个核心阶段:
1.启动时向Eureka Server发送注册请求,携带服务名、IP、端口
2.验证请求,将服务信息存入服务注册表,返回注册成功响应
3.定期发送心跳(默认30秒),告知自身状态
4.接收心跳,更新服务注册表中实例状态
5.向Eureka Server发送请求,获取服务列表
6.返回服务注册表中的可用实例列表
7.根据服务名选择实例,发起业务请求
8.定期清理无心跳的实例(默认90秒无心跳则剔除)
微服务实例(User Service)
Eureka Server(注册中心)
客户端(其他服务/前端)

说明:心跳机制是 Eureka 保证服务可用性的核心,若微服务实例异常下线(如宕机),Eureka Server 会在 90 秒后将其从服务注册表中剔除,避免客户端调用无效实例。

五、整合要点总结与后续探索方向

1. 整合核心要点

  • 版本兼容是前提:Spring Boot 与 Spring Cloud 版本需严格对应(如本文 2.7.x + 2021.0.x),否则会出现依赖冲突,可参考 Spring 官方版本对应表选择。

  • Eureka 配置核心:Server 需禁用自我注册,Client 需指定注册地址和服务名,服务名是服务发现的唯一标识,不可随意修改。

  • 服务实例唯一:通过 instance-id 配置保证每个实例 ID 唯一,便于在 Eureka 界面区分和调试。

2. 后续探索方向

本文实现的是最基础的微服务架构,实际生产环境中还需补充以下能力,可基于本文案例进一步扩展:

  • 服务调用:Feign:替代手动通过 RestTemplate 调用服务,Feign 是声明式服务调用组件,可通过接口+注解的方式简化调用流程,且自动集成 Ribbon 实现负载均衡。

  • 负载均衡:Ribbon:Eureka 配合 Ribbon 可实现客户端负载均衡,从多个服务实例中选择最优实例发起调用,支持轮询、随机、权重等多种策略。

  • 配置中心:Config Server:解决多服务配置分散问题,将所有服务配置集中管理,支持配置动态刷新,无需重启服务即可更新配置。

  • 服务熔断与降级:Hystrix:当服务调用超时或失败时,通过熔断机制避免雪崩效应,降级机制可返回预设兜底数据,保证系统可用性。

  • API 网关:Zuul/Gateway:统一入口管理所有微服务接口,实现路由转发、权限控制、限流、监控等功能,简化客户端调用逻辑。

通过逐步整合这些组件,可构建出一套完整、健壮的微服务架构,满足生产环境的业务需求。

相关推荐
JIngJaneIL2 小时前
基于java + vue连锁门店管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
杜子不疼.2 小时前
从 0 到 1:基于 Spring Boot 4 + Redis + MySQL 构建高可用电商后端系统
spring boot·redis·mysql
骥龙2 小时前
第四篇:融合篇——架构的涌现效应:1+1>2
运维·架构·云计算
月明长歌2 小时前
怎么把 SQL 的增删改查写成“稳、准、可维护”的
java·数据库·sql
前端世界2 小时前
鸿蒙分布式权限管理实战指南:架构原理 + 可运行 Demo
分布式·架构·harmonyos
南汐以墨2 小时前
UI自动化测试指南(二):常用方法
java·测试工具
drebander2 小时前
Cursor IDE 中 Spring Boot 项目启动内存不足问题解决方案
ide·spring boot·cursor
消失的旧时光-19432 小时前
Flutter 工程中 mixin 的正确打开方式:5 种高质量设计范式 + mixin vs 继承 vs 组合 + 为什么它比 BasePage 更优雅
前端·flutter·架构
萧曵 丶2 小时前
Java 泛型详解
java·开发语言·泛型