【从SpringBoot到SpringCloud】

从Boot到Cloud

  • [🌩 Spring Cloud 入门到理解(超详细 · 新手友好)](#🌩 Spring Cloud 入门到理解(超详细 · 新手友好))
    • [一、先把话说透:Spring Cloud 到底是干嘛的?](#一、先把话说透:Spring Cloud 到底是干嘛的?)
      • [1️⃣ 先看一个现实问题](#1️⃣ 先看一个现实问题)
      • [2️⃣ 微服务思想(核心)](#2️⃣ 微服务思想(核心))
      • [3️⃣ 那 Spring Cloud 是什么?](#3️⃣ 那 Spring Cloud 是什么?)
    • [二、Spring Cloud 核心组件总览(先混个脸熟)](#二、Spring Cloud 核心组件总览(先混个脸熟))
    • 三、整体架构先看图(非常重要)
    • 四、第一步:服务注册中心(Nacos)
      • [1️⃣ Nacos 是干嘛的?](#1️⃣ Nacos 是干嘛的?)
      • [2️⃣ 为什么不能写死 IP?](#2️⃣ 为什么不能写死 IP?)
      • [3️⃣ 启动 Nacos(简单说)](#3️⃣ 启动 Nacos(简单说))
    • 五、创建第一个微服务:user-service
      • [1️⃣ 创建 Spring Boot 项目](#1️⃣ 创建 Spring Boot 项目)
      • [2️⃣ application.yml](#2️⃣ application.yml)
      • [3️⃣ 写一个接口](#3️⃣ 写一个接口)
      • [4️⃣ 启动后发生了什么?](#4️⃣ 启动后发生了什么?)
    • 六、第二个服务:order-service(重点来了)
      • [1️⃣ 创建 order-service 项目](#1️⃣ 创建 order-service 项目)
      • [2️⃣ 配置文件](#2️⃣ 配置文件)
    • 七、服务调用的核心:Feign
      • [1️⃣ Feign 是干嘛的?](#1️⃣ Feign 是干嘛的?)
      • [2️⃣ 定义 Feign 接口(非常关键)](#2️⃣ 定义 Feign 接口(非常关键))
      • [3️⃣ 启用 Feign](#3️⃣ 启用 Feign)
    • [八、在 order-service 中调用 user-service](#八、在 order-service 中调用 user-service)
    • 九、负载均衡是怎么"自动"生效的?
    • [十、新手最容易犯的 5 个错误(非常实用)](#十、新手最容易犯的 5 个错误(非常实用))
    • [十一、一句话总结 Spring Cloud](#十一、一句话总结 Spring Cloud)

🌩 Spring Cloud 入门到理解(超详细 · 新手友好)

适合人群

✔ 已经会写 Spring Boot 接口

✔ 知道 Controller / Service

✔ 不懂「微服务是怎么通信的」


一、先把话说透:Spring Cloud 到底是干嘛的?

1️⃣ 先看一个现实问题

假设你现在有一个 Spring Boot 项目:

复制代码
电商系统
├── 用户模块
├── 订单模块
├── 商品模块

一开始,你全写在 一个项目里,很爽。

但后来会发生什么?

  • 项目越来越大
  • 改一个模块,全项目重启
  • 多人开发天天冲突
  • 某个模块压力特别大,扛不住

2️⃣ 微服务思想(核心)

于是就有了一个想法:

能不能把一个大项目,拆成多个小服务?

复制代码
user-service      → 用户服务
order-service     → 订单服务
product-service   → 商品服务

每个服务:

  • 单独 Spring Boot 项目
  • 独立启动
  • 独立部署

👉 这,就是 微服务


3️⃣ 那 Spring Cloud 是什么?

一句话定义(非常重要):

Spring Cloud = 一整套「微服务解决方案」

它不是一个东西,而是一堆组件,用来解决:

问题 解决方案
服务怎么找服务 注册中心
服务怎么调用 远程调用
服务挂了怎么办 负载均衡
调用失败怎么办 熔断降级
配置怎么统一 配置中心

二、Spring Cloud 核心组件总览(先混个脸熟)

我们这篇博客重点讲最核心、最常用的 3 个

组件 作用
Nacos 注册中心 + 配置中心
OpenFeign 服务之间调用
LoadBalancer 负载均衡

你只要把这 3 个学会,已经能写 80% 的 Spring Cloud 项目。


三、整体架构先看图(非常重要)

我们要做一个最经典的微服务结构

复制代码
浏览器
  ↓
order-service
  ↓ (Feign 调用)
user-service

再加一个:

复制代码
Nacos(注册中心)

完整结构:

复制代码
┌──────────┐
│  Nacos   │  ← 服务注册
└──────────┘
     ↑
     │
┌──────────┐       ┌──────────┐
│ order    │ ----> │ user     │
│ service  │ Feign │ service  │
└──────────┘       └──────────┘

四、第一步:服务注册中心(Nacos)

1️⃣ Nacos 是干嘛的?

一句话:

Nacos = 微服务的"通讯录"

它干的事只有一件:

  • 记录:

    "user-service 在哪?IP 是多少?端口是多少?"


2️⃣ 为什么不能写死 IP?

❌ 错误方式(单体思维):

java 复制代码
http://localhost:8081/user/1

问题:

  • 端口一变就全炸
  • 多实例无法扩展

✅ 正确方式:

java 复制代码
http://user-service/user/1

👉 名字找服务,交给 Nacos


3️⃣ 启动 Nacos(简单说)

这一步你博客里可以简写,我这里给你逻辑说明:

  • Nacos 是一个独立进程

  • 所有微服务启动后:

    • 向 Nacos 注册自己
  • 调用时:

    • 先问 Nacos:服务在哪?

五、创建第一个微服务:user-service

1️⃣ 创建 Spring Boot 项目

依赖选择:

  • Spring Web
  • Nacos Discovery

2️⃣ application.yml

yml 复制代码
spring:
  application:
    name: user-service   # 服务名(极其重要)
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

server:
  port: 8081

👉 服务名就是以后调用用的名字


3️⃣ 写一个接口

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        return "用户ID:" + id;
    }
}

4️⃣ 启动后发生了什么?

  • user-service 启动

  • 自动向 Nacos 注册

  • Nacos 记录:

    复制代码
    user-service → 127.0.0.1:8081

六、第二个服务:order-service(重点来了)

1️⃣ 创建 order-service 项目

依赖同样:

  • Spring Web
  • Nacos Discovery
  • OpenFeign(重点)

2️⃣ 配置文件

yml 复制代码
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

server:
  port: 8082

七、服务调用的核心:Feign

1️⃣ Feign 是干嘛的?

一句话解释:

Feign = 帮你把 HTTP 调用,写成"普通 Java 方法"

❌ 不用 Feign,你要这样写:

java 复制代码
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(
    "http://user-service/user/1", String.class);

✅ 用 Feign:

java 复制代码
userClient.getUser(1L);

2️⃣ 定义 Feign 接口(非常关键)

java 复制代码
@FeignClient("user-service")
public interface UserClient {

    @GetMapping("/user/{id}")
    String getUser(@PathVariable("id") Long id);
}

解释清楚每一句:

  • @FeignClient("user-service")

    • 指定要调用的服务名
  • 方法 ≈ 远程接口

  • 注解和 Controller 一模一样


3️⃣ 启用 Feign

在启动类加一句:

java 复制代码
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

八、在 order-service 中调用 user-service

java 复制代码
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public String getOrder(@PathVariable Long id) {
        String user = userClient.getUser(id);
        return "订单ID:" + id + ",用户信息:" + user;
    }
}

访问流程(你博客一定要写清楚)

复制代码
浏览器
 → order-service
   → Feign
     → Nacos
       → user-service

九、负载均衡是怎么"自动"生效的?

你不用写一行代码。

原因是:

Feign + LoadBalancer 默认整合

当:

复制代码
user-service
├── 8081
├── 8083
├── 8084

Feign 会自动:

  • 从 Nacos 拿到所有实例
  • 轮询调用

十、新手最容易犯的 5 个错误(非常实用)

1️⃣ 服务名写错

java 复制代码
@FeignClient("userservice") ❌

👉 必须和 spring.application.name 一致


2️⃣ 忘了加 @EnableFeignClients

👉 直接启动报错


3️⃣ 路径不一致

java 复制代码
/user/{id}   ≠   /users/{id}

4️⃣ Nacos 没启动

👉 所有服务都找不到彼此


5️⃣ 把 Spring Cloud 当 Spring Boot 用

👉 微服务 ≠ 单体


十一、一句话总结 Spring Cloud

Spring Boot 解决的是
"一个服务怎么写"
Spring Cloud 解决的是
"一堆服务怎么协作"


相关推荐
毅炼5 小时前
Java 基础常见问题总结(4)
java·后端
GR2342345 小时前
2025年影视仓TV+手机官方版 内置地址源支持高清直播
java·智能手机·软件
皮卡丘不断更5 小时前
手搓本地 RAG:我用 Python 和 Spring Boot 给 AI 装上了“实时代码监控”
人工智能·spring boot·python·ai编程
程序员清风5 小时前
北京回长沙了,简单谈谈感受!
java·后端·面试
lucky67075 小时前
Spring Boot集成Kafka:最佳实践与详细指南
spring boot·kafka·linq
何中应5 小时前
请求头设置没有生效
java·后端
Coder_Boy_5 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
亓才孓6 小时前
[JDBC]批处理
java
春日见6 小时前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设