从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 解决的是
"一堆服务怎么协作"