Dicky张头像
关注

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

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

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

为什么选择 Spring Cloud Alibaba?

组件NetflixAlibaba
服务注册Eureka(停更)Nacos(活跃)
服务熔断Hystrix(停更)Sentinel(活跃)
分布式事务Seata
配置中心Spring Cloud ConfigNacos Config
网关ZuulSpring 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

最佳实践清单

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

最终效果

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

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

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


往期推荐:

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/dicky_zhang3/article/details/161173090

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--