Spring Cloud 家谱经历了从 Netflix OSS 到 Spring Cloud Alibaba 的演进。本文以 Spring Cloud 2022/2023 + Spring Cloud Alibaba 2022 版本为基线,系统梳理注册发现、配置管理、服务网关、熔断限流与分布式事务的完整方案。
1. 版本选型矩阵
| 版本线 | Spring Boot | Spring Cloud | Spring Cloud Alibaba | 状态 |
|---|---|---|---|---|
| 2021.x | 2.6/2.7 | 2021.0.x | 2021.x | 维护中 |
| 2022.x | 3.0/3.1 | 2022.0.x | 2022.x | 推荐 |
| 2023.x | 3.2+ | 2023.0.x | 2022.x | 最新 |
Java 基线: Spring Boot 3.x 起 最低 Java 17。
2. Nacos:注册与配置统一中心
2.1 服务注册与发现
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
metadata:
version: v1
region: cn-north
注册原理:
服务启动
└─ NacosServiceRegistry.register()
├─ 构造 Instance(IP、Port、Metadata、权重、健康状态)
├─ 发送 /nacos/v1/ns/instance 注册请求
└─ 启动心跳线程(默认 5s)
└─ 心跳失败 15s 后开始清理,30s 后移除
2.2 配置中心与动态刷新
spring:
config:
import: nacos:payment-service.yaml?refreshEnabled=true
@ConfigurationProperties(prefix = "payment")
@NacosConfigurationProperties(dataId = "payment-service.yaml", groupId = "DEFAULT_GROUP", autoRefreshed = true)
public class PaymentProperties {
private BigDecimal maxAmount;
private Integer timeoutSeconds;
}
配置推送机制:
Nacos Server
├─ 配置变更 → Long Polling(30s 超时轮询)
│ └─ 客户端收到变更 → 发布 RefreshScopeRefreshedEvent
└─ @RefreshScope 代理 Bean 被销毁重建
2.3 Nacos 集群模式
┌── Nacos Server (n1)
Client ──→├── Nacos Server (n2) ── MySQL (config持久化)
└── Nacos Server (n3)
── Nginx/SLB (TCP 转发)
3. 服务网关:Spring Cloud Gateway
3.1 核心架构
Client
└─ Gateway
├─ Route(路由)→ id + url + predicate + filters
├─ Predicate(断言)→ Path、Header、Query、Cookie、Method、Time
└─ Filter(过滤器链)
├─ GatewayFilter(单路由)→ AddRequestHeader、StripPrefix、RateLimiter
└─ GlobalFilter(全局)→ Token 鉴权、日志、灰度
3.2 路由配置示例
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
- Header=X-Api-Version, v2
filters:
- StripPrefix=2
- AddRequestHeader=X-Gateway-Time, ${now}
- CircuitBreaker=name=userCb, fallbackUri=forward:/fallback
3.3 自定义 GlobalFilter
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (!validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 透传用户信息到下游
ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()
.header("X-User-Id", extractUserId(token))
.build();
return chain.filter(exchange.mutate().request(mutatedRequest).build());
}
}
3.4 网关限流:Redis RateLimiter
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒补充令牌数
redis-rate-limiter.burstCapacity: 20 # 最大突发
key-resolver: "#{@ipKeyResolver}" # SpEL 引用 Bean
4. 远程调用:OpenFeign
4.1 声明式客户端
@FeignClient(
name = "inventory-service",
path = "/api/inventory",
fallbackFactory = InventoryFallbackFactory.class
)
public interface InventoryClient {
@GetMapping("/{sku}")
InventoryDTO getInventory(@PathVariable String sku);
@PostMapping("/decrement")
void decrement(@RequestBody DecrementRequest request);
}
4.2 与 Sentinel 整合
feign:
sentinel:
enabled: true # 启用 Sentinel Fallback
5. 熔断限流:Sentinel
5.1 Sentinel vs Hystrix
| 特性 | Sentinel | Hystrix |
|---|---|---|
| 隔离方式 | 信号量/线程池 | 线程池 |
| 统计窗口 | 滑动窗口 | 固定窗口 |
| 规则类型 | 流控、熔断、系统保护、热点 | 熔断、隔离 |
| 控制台 | 可视化 UI | 无 |
| 维护状态 | 活跃 | 停止维护 |
5.2 流控规则配置
FlowRule rule = new FlowRule();
rule.setResource("order:create");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS 限流
rule.setCount(100); // 每秒 100
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 预热
rule.setWarmUpPeriodSec(10); // 预热 10s
rule.setStrategy(RuleConstant.STRATEGY_CHAIN); // 调用链路模式(区分不同入口)
FlowRuleManager.loadRules(Collections.singletonList(rule));
流控效果:
| 行为 | 说明 |
|---|---|
CONTROL_BEHAVIOR_DEFAULT | 直接拒绝,抛 FlowException |
CONTROL_BEHAVIOR_WARM_UP | 令牌桶预热,避免系统冷启动过载 |
CONTROL_BEHAVIOR_RATE_LIMITER | 匀速排队,漏桶算法 |
5.3 熔断降级规则
DegradeRule degradeRule = new DegradeRule("order:detail");
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
degradeRule.setCount(0.5); // 异常比例 > 50%
degradeRule.setTimeWindow(10); // 熔断 10s
degradeRule.setMinRequestAmount(5); // 最少 5 个请求才触发
DegradeRuleManager.loadRules(Collections.singletonList(degradeRule));
熔断状态机:
CLOSED 正常服务
→ 异常比例/数超过阈值 → OPEN 拒绝所有请求
→ 经过 timeWindow → HALF-OPEN 放少量请求试探
→ 成功 → CLOSED
→ 失败 → OPEN
6. 分布式事务:Seata
6.1 四种事务模式对比
| 模式 | 侵入性 | 适用场景 | 实现原理 |
|---|---|---|---|
| AT | 低 | 标准 CRUD | 代理数据源,解析 SQL 生成 Undo Log |
| TCC | 高 | 复杂业务 | Try/Confirm/Cancel 三阶段 |
| Saga | 中 | 长事务 | 状态机编排,正向+补偿 |
| XA | 低 | 强一致性 | 2PC,XA 协议 |
6.2 AT 模式原理
Business App TC (Transaction Coordinator)
│ │
├─ @GlobalTransactional ─┤
│ ├─ RM: 订单库 │ ← 注册分支事务
│ │ ├─ 执行业务 SQL │
│ │ ├─ 解析 SQL │
│ │ ├── 查询前镜像 │
│ │ ├── 查询后镜像 │
│ │ └── 插入 Undo Log │
│ │ │
│ ├─ RM: 库存库 │ ← 注册分支事务
│ │ └─ 同样生成 Undo Log │
│ │ │
│ └─ 提交全局事务 ←┤ TC 协调二阶段
│ ├─ 一阶段:各 RM 本地提交
│ └─ 二阶段:TC 通知 RM 异步删除 Undo Log
│
├─ 全局回滚情景 → TC 通知各 RM 根据 Undo Log 反向补偿
6.3 集成配置
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_tx_group
service:
vgroup-mapping.my_tx_group: default
grouplist.default: 127.0.0.1:8091
client:
rm:
async-commit-buffer-limit: 10000
@Service
public class OrderService {
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
public void createOrder(OrderDTO order) {
orderDao.insert(order);
inventoryClient.decrement(order.getSku(), order.getQuantity());
accountClient.debit(order.getUserId(), order.getAmount());
}
}
7. 链路追踪:Micrometer + Brave/Zipkin
Spring Boot 3.x 将 Sleuth 替换为 Micrometer Observation。
management:
tracing:
sampling:
probability: 1.0
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
自动传播:TraceID / SpanID 自动注入 HTTP Header(micrometer.tracing. baggage)。
8. 微服务安全配置
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://auth-server:8080
Gateway 层统一鉴权 → 向各微服务透传 X-User-Id、X-Roles。各服务只做 权限校验,不做 身份认证。
9. 生产部署最佳实践
| 实践 | 说明 |
|---|---|
| Nacos 持久化配置 | 使用 MySQL 主从 + 挂载外部 config |
| Gateway 水平扩展 | 无状态,K8s Deployment 多副本 |
| Sentinel 规则持久化 | 推模式 + Nacos 配置同步 |
| Seata 高可用 | TC 集群部署,DB 存储模式 |
| 网络隔离 | 注册/配置中心不暴露公网,走 VPC |
延伸阅读
- 监控系统架构设计 — 架构理论视角的微服务演进
- Java 缓存策略与 Redis 集成 — 分布式缓存实践
- Java 安全认证与授权 — 深入 JWT 与 OAuth2 实现
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。