SpringCloud入门认识:构建高效微服务架构的核心利器
目录
四、Spring Cloud 和 Spring Cloud Alibaba 的区别
Spring Cloud 是什么
Spring Cloud 是一套用于构建分布式系统和微服务架构的工具集合。
它不是一个单独的框架,而是基于 Spring Boot,整合了一系列微服务基础设施能力,例如:
-
服务注册与发现
-
配置中心
-
服务调用
-
负载均衡
-
API 网关
-
熔断降级
-
链路追踪
-
消息驱动
-
分布式事务
可以把它理解成:
Spring Boot:负责把一个服务写出来
Spring Cloud:负责让多个服务协同工作
一、为什么需要 Spring Cloud
假设你现在开发一个电商系统,最开始可能是单体架构:
mall-system
├── 用户模块
├── 商品模块
├── 订单模块
├── 支付模块
└── 库存模块
所有代码都在一个项目中。
随着业务变大,可以拆成多个服务:
user-service
product-service
order-service
payment-service
inventory-service
拆分后会出现大量新问题:
订单服务怎么找到库存服务?
库存服务有多个实例,调用哪一个?
某个服务宕机怎么办?
所有服务的配置怎么统一管理?
前端应该直接访问每个服务吗?
服务之间调用失败如何重试?
如何知道一次请求经过了哪些服务?
Spring Cloud 的作用,就是解决这些分布式系统中的通用问题。
二、Spring Cloud 的整体架构
一个典型的 Spring Cloud 微服务系统,大致如下:
客户端
│
▼
Spring Cloud Gateway
│
┌────────────┼────────────┐
▼ ▼ ▼
用户服务 订单服务 商品服务
│ │ │
└──────服务注册中心───────┘
│
配置中心
│
链路追踪 / 日志
│
消息队列 / 数据库
核心逻辑是:
-
所有服务启动后注册到注册中心。
-
网关统一接收外部请求。
-
服务之间通过服务名互相调用。
-
配置统一放到配置中心。
-
调用失败时通过熔断、限流、降级保护系统。
-
通过链路追踪排查跨服务问题。
三、Spring Cloud 中最核心的组件
1. 服务注册与发现
服务注册中心维护所有微服务实例的信息。
例如:
user-service
├── 192.168.1.10:8081
├── 192.168.1.11:8081
└── 192.168.1.12:8081
订单服务调用用户服务时,不需要写死 IP:
http://192.168.1.10:8081
而是直接通过服务名调用:
http://user-service
注册中心会返回可用实例。
常见方案:
-
Nacos
-
Eureka
-
Consul
-
ZooKeeper
目前国内 Spring Cloud 项目中,Nacos 非常常见。
2. 服务调用
微服务之间通常通过 HTTP 或 RPC 调用。
Spring Cloud 中常用的是 OpenFeign。
例如订单服务调用用户服务:
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
UserDTO getUserById(@PathVariable Long id);
}
业务代码中直接调用:
@Service
public class OrderService {
private final UserClient userClient;
public OrderService(UserClient userClient) {
this.userClient = userClient;
}
public OrderVO getOrder(Long orderId) {
Order order = getOrderFromDatabase(orderId);
UserDTO user = userClient.getUserById(order.getUserId());
return buildOrderVO(order, user);
}
}
你写起来像调用普通 Java 方法,但底层实际上发起了 HTTP 请求。
3. 负载均衡
假设用户服务有三个实例:
user-service-1
user-service-2
user-service-3
订单服务调用 user-service 时,需要选择一个实例。
这就是客户端负载均衡。
常见策略:
轮询
随机
权重
最少连接
一致性哈希
Spring Cloud 当前常用:
Spring Cloud LoadBalancer
例如轮询:
第一次请求 → user-service-1
第二次请求 → user-service-2
第三次请求 → user-service-3
第四次请求 → user-service-1
4. API 网关
网关是整个微服务系统的统一入口。
常用组件:
Spring Cloud Gateway
没有网关时:
前端 → 用户服务
前端 → 商品服务
前端 → 订单服务
前端 → 支付服务
有网关后:
前端 → 网关 → 各个微服务
网关通常负责:
-
路由转发
-
JWT 鉴权
-
权限校验
-
限流
-
日志记录
-
跨域处理
-
黑白名单
-
请求改写
-
统一异常处理
例如:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
含义:
请求路径:
/api/users/**
转发到:
user-service
这里的:
lb://
表示通过注册中心和负载均衡查找服务实例。
5. 配置中心
在微服务项目中,每个服务都有配置:
数据库地址
Redis 地址
MQ 地址
端口
日志级别
业务开关
第三方密钥
如果每个服务都保存一份 application.yml,配置很难统一管理。
配置中心可以统一存储配置:
user-service-dev.yml
order-service-dev.yml
payment-service-prod.yml
常见方案:
-
Nacos Config
-
Spring Cloud Config
-
Apollo
配置中心的优点:
-
集中管理
-
多环境隔离
-
动态刷新
-
权限控制
-
配置历史版本
-
灰度发布
例如:
spring:
datasource:
url: jdbc:mysql://mysql:3306/order_db
username: root
password: xxx
服务启动后从 Nacos 拉取配置,而不是完全依赖本地文件。
6. 熔断、降级和限流
这是 Spring Cloud 中非常重要的一部分。
假设调用链如下:
网关 → 订单服务 → 用户服务 → 积分服务
如果积分服务变慢,订单服务大量线程会阻塞,最终可能造成整个系统雪崩。
因此需要:
-
超时
-
重试
-
熔断
-
降级
-
限流
-
隔离
国内常用:
Sentinel
国外常见:
Resilience4j
熔断
连续调用失败时,暂时停止调用下游服务。
正常:
订单服务 → 积分服务
积分服务大量失败后:
订单服务 ✕ 积分服务
订单服务 → 直接执行降级逻辑
降级
调用失败时返回备用结果。
例如:
public UserDTO fallback(Long id, Throwable throwable) {
UserDTO user = new UserDTO();
user.setId(id);
user.setUsername("默认用户");
return user;
}
限流
例如限制接口:
每秒最多 100 个请求
超过后直接拒绝,避免系统被压垮。
7. 链路追踪
微服务中一次请求可能经过多个服务:
Gateway
↓
Order Service
↓
Product Service
↓
Inventory Service
↓
Payment Service
如果请求耗时 3 秒,需要知道:
网关耗时多少?
订单服务耗时多少?
库存服务是否超时?
哪个服务报错?
链路追踪会给一次请求分配统一的 Trace ID:
traceId = abc123
各服务日志中都会带上它:
Gateway traceId=abc123
Order Service traceId=abc123
Inventory traceId=abc123
Payment traceId=abc123
常见方案:
-
Micrometer Tracing
-
Zipkin
-
SkyWalking
-
Jaeger
-
OpenTelemetry
企业项目中,SkyWalking 比较常见。
8. 消息驱动
部分业务不适合直接同步调用。
例如用户下单后:
创建订单
扣减库存
发送短信
增加积分
发送优惠券
记录日志
如果全部同步调用:
订单服务
→ 库存服务
→ 短信服务
→ 积分服务
→ 优惠券服务
调用链太长,容易失败。
可以改为消息驱动:
订单服务
│
▼
发送“订单创建成功”消息
│
├── 库存服务消费
├── 积分服务消费
├── 短信服务消费
└── 优惠券服务消费
常见中间件:
-
RabbitMQ
-
Kafka
-
RocketMQ
Spring 体系还提供:
Spring Cloud Stream
用于屏蔽部分消息中间件差异。
9. 分布式事务
单体系统中,一个本地事务可以完成:
@Transactional
public void createOrder() {
insertOrder();
updateInventory();
}
但微服务中:
订单服务操作订单数据库
库存服务操作库存数据库
账户服务操作账户数据库
不同数据库之间无法直接使用一个本地事务。
因此需要考虑分布式事务。
常见方案:
-
Seata
-
TCC
-
Saga
-
可靠消息最终一致性
-
本地消息表
-
事务消息
需要注意:
微服务中不是所有业务都应该使用强一致分布式事务。
实际项目更常见的是:
本地事务 + MQ + 重试 + 幂等 + 最终一致性
四、Spring Cloud 和 Spring Cloud Alibaba 的区别
很多人容易混淆。
Spring Cloud
Spring 官方微服务体系,包含:
-
Gateway
-
OpenFeign
-
LoadBalancer
-
Config
-
Circuit Breaker
-
Stream
Spring Cloud Alibaba
阿里提供的一套 Spring Cloud 扩展生态,常用组件:
-
Nacos:注册中心、配置中心
-
Sentinel:限流、熔断、降级
-
Seata:分布式事务
-
RocketMQ:消息队列
-
Dubbo:RPC
国内常见组合:
Spring Boot
+ Spring Cloud
+ Spring Cloud Alibaba
+ Nacos
+ OpenFeign
+ Gateway
+ Sentinel
+ Seata
+ RocketMQ
可以理解为:
Spring Cloud:制定微服务接口规范和整体体系
Spring Cloud Alibaba:提供一套国内常用的具体实现
五、一个典型技术栈
对于 Java 后端项目,常见微服务技术栈可能是:
| 功能 | 常用技术 |
|---|---|
| 单体服务基础 | Spring Boot |
| 微服务框架 | Spring Cloud |
| 注册中心 | Nacos |
| 配置中心 | Nacos |
| 服务调用 | OpenFeign |
| 负载均衡 | Spring Cloud LoadBalancer |
| 网关 | Spring Cloud Gateway |
| 熔断限流 | Sentinel |
| 分布式事务 | Seata |
| 消息队列 | RocketMQ / RabbitMQ / Kafka |
| 数据库 | MySQL |
| 缓存 | Redis |
| 链路追踪 | SkyWalking |
| 日志 | ELK / Loki |
| 容器化 | Docker |
| 编排 | Kubernetes |
六、一次请求的完整流程
以“查询订单详情”为例:
1. 前端请求:
GET /api/orders/1001
2. 请求进入 Gateway。
3. Gateway 校验 JWT。
4. Gateway 根据路由规则找到 order-service。
5. 注册中心返回 order-service 的多个实例。
6. LoadBalancer 选择一个实例。
7. order-service 查询订单数据库。
8. order-service 使用 OpenFeign 调用 user-service。
9. user-service 返回用户信息。
10. order-service 使用 OpenFeign 调用 product-service。
11. product-service 返回商品信息。
12. order-service 组装结果返回。
13. 链路追踪系统记录整个调用链。
结构如下:
前端
↓
Gateway
↓
order-service
├── MySQL
├── user-service
└── product-service
七、微服务架构的优点
1. 独立部署
修改订单服务,不一定要重新部署整个系统。
2. 独立扩容
订单服务压力大,可以单独扩容:
order-service × 10
user-service × 3
product-service × 5
3. 故障隔离
推荐服务宕机,不应该拖垮支付服务。
4. 团队解耦
不同团队负责不同服务:
用户团队
订单团队
支付团队
商品团队
5. 技术栈灵活
虽然 Java 项目一般统一使用 Spring Boot,但理论上部分服务可以使用不同语言。
八、微服务架构的缺点
微服务不是“拆得越多越好”。
1. 系统复杂度上升
单体方法调用:
userService.getUser(id);
微服务调用需要考虑:
网络超时
服务宕机
重试
熔断
负载均衡
序列化
版本兼容
2. 数据一致性困难
多个服务操作不同数据库,事务变复杂。
3. 排查问题困难
一次请求跨越多个服务,需要链路追踪。
4. 运维成本高
需要管理:
-
服务实例
-
配置中心
-
注册中心
-
网关
-
MQ
-
Redis
-
日志平台
-
监控平台
-
Docker
-
Kubernetes
5. 测试困难
需要同时启动多个依赖服务。
因此:
业务规模不大时,优先选择模块化单体,而不是盲目拆微服务。
九、Spring Cloud 最容易混淆的几个概念
注册中心和配置中心
注册中心:
管理服务在哪里、是否存活。
配置中心:
管理服务使用什么配置。
Nacos 同时支持这两项能力。
Gateway 和 Nginx
Nginx 更偏基础设施层:
-
静态资源
-
反向代理
-
TLS
-
负载均衡
Gateway 更偏业务网关层:
-
JWT 鉴权
-
动态路由
-
用户上下文
-
限流
-
灰度发布
-
业务过滤器
实际项目可能是:
用户
↓
Nginx
↓
Spring Cloud Gateway
↓
微服务
Feign 和 RestTemplate
RestTemplate:
restTemplate.getForObject(
"http://user-service/users/1",
UserDTO.class
);
Feign:
userClient.getUserById(1L);
Feign 更加声明式,代码更简洁。
熔断和降级
熔断:
暂时不调用已经出问题的服务。
降级:
不调用或调用失败时,返回备用结果。
通常两者配合使用。
限流和熔断
限流:
控制进入系统的请求数量。
熔断:
保护对下游服务的调用。
一个主要控制入口流量,一个主要保护服务调用链。
十、建议的学习顺序
你是 Java 后端开发,不建议一开始就把所有组件全部学一遍。按下面顺序更合理:
第一阶段:理解核心调用链
先学:
Spring Boot
Nacos 注册中心
OpenFeign
LoadBalancer
Gateway
目标是实现:
用户请求
→ Gateway
→ order-service
→ user-service
第二阶段:系统稳定性
再学:
Sentinel
超时
重试
熔断
降级
限流
重点理解:
服务调用失败后,系统如何自我保护
第三阶段:分布式数据问题
学习:
Redis
MQ
幂等
分布式锁
分布式事务
最终一致性
重点理解:
消息重复消费怎么办?
库存扣减失败怎么办?
订单和支付状态不一致怎么办?
第四阶段:运维和可观测性
学习:
Docker
SkyWalking
Prometheus
Grafana
ELK
Kubernetes
重点理解:
服务是否存活?
接口为什么慢?
一次请求在哪里失败?
如何扩容?
十一、面试中怎么回答“什么是 Spring Cloud”
可以这样回答:
Spring Cloud 是基于 Spring Boot 构建微服务和分布式系统的一套工具体系。它主要解决服务注册与发现、服务调用、负载均衡、统一网关、配置管理、熔断降级、限流、链路追踪和消息驱动等问题。
Spring Boot 负责快速开发单个服务,Spring Cloud 负责多个服务之间的治理和协作。在国内项目中,通常会结合 Spring Cloud Alibaba,使用 Nacos 作为注册和配置中心,OpenFeign 进行服务调用,Gateway 作为统一入口,Sentinel 进行限流和熔断保护。
十二、你当前最应该掌握的主线
不要先背组件,而是记住这一条调用链:
客户端
↓
Gateway:鉴权、路由、限流
↓
注册中心:查询服务实例
↓
LoadBalancer:选择实例
↓
OpenFeign:远程调用
↓
Sentinel:熔断、降级、限流
↓
微服务 + 数据库 + Redis + MQ
Spring Cloud 的本质可以归纳成一句话:
把单体系统中的本地方法调用,变成可治理、可容错、可观测的远程服务调用。
更多推荐


所有评论(0)