微服务保护:Sentinel实战解析,【Linux】入门指南:基础指令详解Part One。
·
微服务保护概述
微服务架构中,服务拆分后可能面临高并发、流量突增、依赖服务不稳定等问题,需引入保护机制保障系统稳定性。黑马商城采用Spring Cloud Alibaba生态的Sentinel实现流量控制、熔断降级等核心功能,下文从实际场景出发解析关键配置与代码示例。
Sentinel基础集成
依赖引入
在pom.xml中添加Sentinel核心依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
控制台配置
通过application.yml启用控制台对接:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
eager: true # 取消懒加载
流量控制规则
QPS限流示例
对商品查询接口限制每秒最大请求数为50:
@GetMapping("/product/{id}")
@SentinelResource(value = "getProduct", blockHandler = "handleBlock")
public Product getProduct(@PathVariable Long id) {
return productService.findById(id);
}
// 限流降级处理逻辑
public Product handleBlock(Long id, BlockException ex) {
return Product.builder().name("默认商品").build(); // 返回兜底数据
}
控制台配置
在Sentinel控制台“流控规则”中设置:
- 资源名:
getProduct - 阈值类型:QPS=50
- 流控模式:直接
熔断降级策略
异常比例熔断
当订单服务异常比例超过60%时,触发熔断10秒:
@SentinelResource(
value = "createOrder",
fallback = "orderFallback",
exceptionsToIgnore = {IllegalArgumentException.class} // 忽略特定异常
)
public Order createOrder(OrderDTO dto) {
return orderService.create(dto);
}
// 熔断降级方法
public Order orderFallback(OrderDTO dto, Throwable ex) {
log.error("触发熔断", ex);
return Order.builder().status("服务降级中").build();
}
控制台配置
- 熔断策略:异常比例
- 比例阈值:60%
- 熔断时长:10秒
- 最小请求数:5(触发统计的最低请求量)
热点参数限流
针对商品详情页中频繁访问的特定商品ID进行限流:
@GetMapping("/product/hot/{id}")
@SentinelResource(
value = "hotProduct",
paramFlowKey = "id", // 热点参数名
blockHandler = "hotBlockHandler"
)
public Product hotProduct(@PathVariable Long id) {
return productService.getHotProduct(id);
}
控制台配置
在热点规则中指定参数索引(0表示第一个参数),并设置例外项:
- 参数类型:基本类型/字符串
- 参数索引:0
- 单机阈值:100(普通请求)
- 例外配置:id=101的商品阈值设为500
系统自适应保护
通过全局维度保护系统稳定性:
spring:
cloud:
sentinel:
filter:
enabled: false # 关闭Web层拦截
system:
rules:
- highestSystemLoad: 8.0 # 最大LOAD值
avgRt: 2000 # 平均响应时间(ms)
maxThread: 500 # 最大并发线程数
qps: 1000 # 入口总QPS
持久化规则配置
默认规则内存存储,重启失效,可通过Nacos持久化:
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: ${nacos.server}
dataId: ${spring.application.name}-sentinel
ruleType: flow # 规则类型(flow/degrade/param)
最佳实践总结
- 精细化配置:结合业务场景设置不同资源名的阈值,避免一刀切
- 降级处理:所有
@SentinelResource注解方法必须定义blockHandler或fallback - 监控联动:集成Prometheus+Grafana实现实时监控
- 压测验证:通过JMeter模拟流量验证规则有效性
完整示例代码可参考黑马商城GitHub仓库,实际部署时需根据硬件性能调整阈值参数。
更多推荐
所有评论(0)