Spring Cloud Alibaba微服务全家桶实战:从0到1搭高可用生产级架构

大家好,我是迪哥。2023 年我们把 Spring Cloud Netflix 全套换成了 Spring Cloud Alibaba,稳定性提升了 50%,运维成本降了 60%。今天就聊聊,Nacos、Sentinel、Seata 这三剑客,如何撑起我们的百万级电商系统。

为什么选择 Spring Cloud Alibaba?

组件 Netflix Alibaba
服务注册 Eureka(停更) Nacos(活跃)
服务熔断 Hystrix(停更) Sentinel(活跃)
分布式事务 Seata
配置中心 Spring Cloud Config Nacos Config
网关 Zuul Spring Cloud Gateway

架构全景

┌─────────────────────────────────────────────────────────────┐
│                      Client (Web/App)                         │
└────────────────────────┬────────────────────────────────────┘
                         │
                    ┌────▼─────┐
                    │  Gateway  │ (Spring Cloud Gateway)
                    └────┬─────┘
                         │
        ┌────────────────┼────────────────┐
        │                │                │
   ┌────▼─────┐   ┌─────▼────┐    ┌─────▼─────┐
   │  Order   │   │  User    │    │  Payment  │
   └────┬─────┘   └─────┬────┘    └─────┬─────┘
        │                │                │
   ┌────▼─────┐   ┌─────▼────┐    ┌─────▼─────┐
   │ Sentinel │   │  Nacos   │    │   Seata   │
   │ (限流熔断)│   │(注册配置)│    │(分布式事务)│
   └──────────┘   └──────────┘    └───────────┘

Nacos:服务注册与配置中心

pom.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

application.yml

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: nacos1:8848,nacos2:8848,nacos3:8848
        namespace: prod
        group: order-group
      config:
        server-addr: nacos1:8848,nacos2:8848,nacos3:8848
        namespace: prod
        group: order-group
        file-extension: yaml
        refresh-enabled: true

Nacos 集群部署

# docker-compose.yml
version: '3'
services:
  nacos1:
    image: nacos/nacos-server:v2.2.3
    environment:
      MODE: cluster
      NACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql
    volumes:
      - ./logs/nacos1:/home/nacos/logs
  nacos2: ...
  nacos3: ...

Sentinel:流量控制与熔断降级

pom.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

代码示例

@RestController
@RequestMapping("/api/order")
public class OrderController {

    @PostMapping
    @SentinelResource(
        value = "createOrder",
        blockHandler = "handleBlock",
        fallback = "handleFallback"
    )
    public OrderResult createOrder(@RequestBody Order order) {
        return orderService.create(order);
    }

    public OrderResult handleBlock(Order order, BlockException e) {
        return OrderResult.error("系统繁忙,请稍后再试");
    }

    public OrderResult handleFallback(Order order, Throwable e) {
        return OrderResult.error("服务异常,请稍后再试");
    }
}

动态规则

@Configuration
public class SentinelConfig {
    @PostConstruct
    public void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("createOrder");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10000); // 每秒最多 10000 次
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

Seata:分布式事务

pom.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

application.yml

seata:
  tx-service-group: order-tx-group
  config:
    type: nacos
    nacos:
      server-addr: nacos1:8848
      namespace: prod
  registry:
    type: nacos
    nacos:
      server-addr: nacos1:8848
      namespace: prod

代码示例

@Service
public class OrderService {

    @Autowired
    private StockFeignClient stockFeignClient;

    @Autowired
    private AccountFeignClient accountFeignClient;

    @GlobalTransactional(name = "order-create-tx", rollbackFor = Exception.class)
    public Order create(Order order) {
        // 1. 本地创建订单
        orderMapper.insert(order);

        // 2. 扣库存
        stockFeignClient.deduct(order.getProductId(), order.getCount());

        // 3. 扣余额
        accountFeignClient.debit(order.getUserId(), order.getAmount());

        return order;
    }
}

Gateway:API 网关

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

application.yml

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: nacos1:8848
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
          filters:
            - StripPrefix=2
            - name: Sentinel

最佳实践清单

组件 推荐配置
Nacos 3 节点集群,数据库持久化,开启鉴权
Sentinel 控制台 + 持久化规则(Nacos/Redis)
Seata AT 模式适合大多数场景,TC 高可用集群
Gateway 限流熔断 + 超时控制 + 日志记录

最终效果

指标 迁移前 迁移后
系统可用性 99.5% 99.99%
故障恢复时间 30 分钟 5 分钟
配置更新生效 重启应用 实时
限流熔断能力 基本无 完善

说到这全家桶,我家那只叫 Docker 的哈士奇最近也搞了个"狗全家桶"——食盆、水盆、狗窝、玩具按顺序放好,缺一不可,这跟我们的 Nacos/Sentinel/Seata 搭配方式简直一模一样 😂

我是迪哥,我们下期再见!


往期推荐:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐