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.xmldependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependencyapplication.ymlspring: 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: trueNacos 集群部署# 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.xmldependency groupIdcom.alibaba.cloud/groupId artifactIdspring-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() { ListFlowRule 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.xmldependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-seata/artifactId /dependencyapplication.ymlseata: 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; } }GatewayAPI 网关pom.xmldependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependencyapplication.ymlspring: 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: - StripPrefix2 - name: Sentinel最佳实践清单组件推荐配置Nacos3 节点集群数据库持久化开启鉴权Sentinel控制台 持久化规则Nacos/RedisSeataAT 模式适合大多数场景TC 高可用集群Gateway限流熔断 超时控制 日志记录最终效果指标迁移前迁移后系统可用性99.5%99.99%故障恢复时间30 分钟5 分钟配置更新生效重启应用实时限流熔断能力基本无完善说到这全家桶我家那只叫 Docker 的哈士奇最近也搞了个狗全家桶——食盆、水盆、狗窝、玩具按顺序放好缺一不可这跟我们的 Nacos/Sentinel/Seata 搭配方式简直一模一样 我是迪哥我们下期再见往期推荐《Go 语言高并发服务性能调优》《消息队列选型与高可用架构》