微服务架构整体方案
┌─────────────┐
│ Nacos │ ← 服务注册、配置中心
└─────────────┘
↓
┌─────────────┐
│ Gateway │ ← 网关(Sentinel限流)
└─────────────┘
↓
┌─────────────┐
│ 订单服务 │ ← Sentinel流控、熔断
└─────────────┘
↓
┌─────────────┐
│ 商品服务 │ ← Sentinel流控、熔断
└─────────────┘
完整依赖配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- LoadBalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
Nacos + Sentinel配置
spring:
application:
name: order-service
cloud:
# Nacos配置
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
config:
server-addr: localhost:8848
namespace: dev
file-extension: yml
# Sentinel配置
sentinel:
transport:
dashboard: localhost:8080
datasource:
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow
namespace: dev
degrade:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-degrade-rules
groupId: SENTINEL_GROUP
rule-type: degrade
namespace: dev
# Feign配置
feign:
sentinel:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
服务间调用保护
订单服务调用商品服务
@FeignClient(
name = "product-service",
fallback = ProductServiceFallback.class,
fallbackFactory = ProductServiceFallbackFactory.class
)
public interface ProductService {
@GetMapping("/product/{id}")
Product getProduct(@PathVariable Long id);
}
// Fallback实现
@Component
public class ProductServiceFallback implements ProductService {
@Override
public Product getProduct(Long id) {
return Product.builder()
.id(id)
.name("商品服务暂时不可用")
.price(0.0)
.build();
}
}
// FallbackFactory(可以获取异常信息)
@Component
public class ProductServiceFallbackFactory implements FallbackFactory<ProductService> {
@Override
public ProductService create(Throwable cause) {
return new ProductService() {
@Override
public Product getProduct(Long id) {
log.error("调用商品服务失败:{}", cause.getMessage());
return Product.builder()
.id(id)
.name("商品服务异常:" + cause.getMessage())
.build();
}
};
}
}
链路限流
场景:多个接口调用同一个服务
@Service
public class OrderService {
@Autowired
private ProductService productService;
// 接口1:创建订单
@SentinelResource(value = "createOrder")
public Order createOrder(Long productId) {
// 调用商品服务
getProductInfo(productId);
return new Order();
}
// 接口2:查询订单
@SentinelResource(value = "queryOrder")
public Order queryOrder(Long orderId) {
Order order = orderDao.findById(orderId);
// 调用商品服务
getProductInfo(order.getProductId());
return order;
}
// 公共方法:获取商品信息
@SentinelResource(value = "getProductInfo", blockHandler = "handleBlock")
private Product getProductInfo(Long productId) {
return productService.getProduct(productId);
}
private Product handleBlock(Long productId, BlockException ex) {
return Product.builder().id(productId).name("商品信息获取受限").build();
}
}
配置链路限流
FlowRule rule = new FlowRule();
rule.setResource("getProductInfo");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100);
rule.setStrategy(RuleConstant.STRATEGY_CHAIN);
rule.setRefResource("createOrder"); // 只对createOrder链路限流
FlowRuleManager.loadRules(Collections.singletonList(rule));
服务熔断配置
# 在Nacos中配置
# order-service-degrade-rules
[
{
"resource": "product-service",
"grade": 0,
"count": 1000,
"timeWindow": 10,
"minRequestAmount": 5,
"statIntervalMs": 10000,
"slowRatioThreshold": 0.5
},
{
"resource": "inventory-service",
"grade": 1,
"count": 0.3,
"timeWindow": 10,
"minRequestAmount": 5,
"statIntervalMs": 10000
}
]
Gateway集成
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=2
sentinel:
filter:
enabled: false # 禁用默认过滤器
scg:
fallback:
mode: response
response-status: 429
response-body: '{"code":429,"message":"请求过于频繁"}'
监控集成
暴露监控端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
sentinel:
enabled: true
Prometheus集成
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
@Configuration
public class SentinelMetricsConfig {
@PostConstruct
public void init() {
// 启用Sentinel指标导出
MetricRegistry.getMetricRegistry()
.addMetricProvider(new SentinelMetricProvider());
}
}
完整微服务实战
订单服务
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/create")
@SentinelResource(value = "orderCreateApi", blockHandler = "handleBlock")
public Result createOrder(@RequestBody OrderDTO dto) {
Order order = orderService.createOrder(dto);
return Result.success(order);
}
public Result handleBlock(OrderDTO dto, BlockException ex) {
return Result.error(429, "订单创建繁忙");
}
}
@Service
public class OrderService {
@Autowired
private ProductService productService;
@Autowired
private InventoryService inventoryService;
@SentinelResource(value = "createOrder", fallback = "handleFallback")
@Transactional
public Order createOrder(OrderDTO dto) {
// 1. 检查商品
Product product = productService.getProduct(dto.getProductId());
// 2. 检查库存
boolean hasStock = inventoryService.checkStock(dto.getProductId(), dto.getQuantity());
if (!hasStock) {
throw new BusinessException("库存不足");
}
// 3. 扣减库存
inventoryService.deductStock(dto.getProductId(), dto.getQuantity());
// 4. 创建订单
Order order = new Order();
order.setProductId(product.getId());
order.setQuantity(dto.getQuantity());
order.setAmount(product.getPrice() * dto.getQuantity());
return orderDao.save(order);
}
public Order handleFallback(OrderDTO dto, Throwable ex) {
log.error("订单创建失败", ex);
throw new BusinessException("系统繁忙,请稍后重试");
}
}
总结
Spring Cloud Alibaba + Sentinel集成要点:
- Nacos作为注册中心和配置中心
- Feign自动支持Sentinel熔断
- Gateway集成Sentinel网关流控
- 链路限流实现精细化控制
- 从Nacos动态加载规则
- 完整的监控和告警体系