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?
| 组件 | 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 搭配方式简直一模一样 😂
我是迪哥,我们下期再见!
往期推荐:
更多推荐




所有评论(0)