02. Spring Cloud 微服务架构全家桶

全面解析 Spring Cloud Alibaba 与 Netflix 生态:Nacos 注册配置中心、Gateway 网关、Sentinel 熔断限流、Seata 分布式事务

Spring Cloud 家谱经历了从 Netflix OSS 到 Spring Cloud Alibaba 的演进。本文以 Spring Cloud 2022/2023 + Spring Cloud Alibaba 2022 版本为基线,系统梳理注册发现、配置管理、服务网关、熔断限流与分布式事务的完整方案。

1. 版本选型矩阵

版本线Spring BootSpring CloudSpring Cloud Alibaba状态
2021.x2.6/2.72021.0.x2021.x维护中
2022.x3.0/3.12022.0.x2022.x推荐
2023.x3.2+2023.0.x2022.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

特性SentinelHystrix
隔离方式信号量/线程池线程池
统计窗口滑动窗口固定窗口
规则类型流控、熔断、系统保护、热点熔断、隔离
控制台可视化 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-IdX-Roles。各服务只做 权限校验,不做 身份认证

9. 生产部署最佳实践

实践说明
Nacos 持久化配置使用 MySQL 主从 + 挂载外部 config
Gateway 水平扩展无状态,K8s Deployment 多副本
Sentinel 规则持久化推模式 + Nacos 配置同步
Seata 高可用TC 集群部署,DB 存储模式
网络隔离注册/配置中心不暴露公网,走 VPC

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「java-enterprise」更多文章

  1. 限流算法深度解析:令牌桶、漏桶与滑动窗口计数
  2. Java 代码质量:SonarQube、Checkstyle 与 SpotBugs 工程化实践
  3. Spring IoC 容器与依赖注入原理深度剖析