一、Sentinel简介
1. 为什么要使用Sentinel?
在分布式系统中,服务之间相互调用形成复杂的依赖链。当某个服务出现故障,可能导致整个调用链上的服务都不可用,这种现象称为服务雪崩。
上游服务 → 当前服务 → 下游服务
使用场景:
-
高并发场景下的流量控制
-
服务异常时的熔断降级
-
系统自适应保护
-
实时监控和规则配置
2. 什么是Sentinel?
Sentinel [ˈsentɪnl] 是阿里巴巴开源的,以流量为切入点的分布式系统服务保护框架。
核心功能:
| 功能 | 作用 | 核心目标 |
|---|---|---|
| 流量控制 | 控制请求流量,防止系统被压垮 | 不被上游服务压死 |
| 熔断降级 | 在服务不可用时快速失败 | 不被下游服务拖死 |
流量控制两种模式:
-
QPS:每秒请求数限制
-
线程数:并发线程数限制
熔断降级:
-
熔断:当下游服务异常或响应过慢时,暂时切断调用
-
降级:返回预设的默认值(降级逻辑)
3. Sentinel启动器
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
二、Sentinel规则详解
1. 流控规则(Flow Control)
1)普通流控
将规则应用到指定URL,限制请求频率。
示例配置:
-
QPS = 2:每秒最多2次请求
-
线程数 = 2:同时最多2个线程处理
2)热点参数流控
针对特定参数进行流控,防止热点数据被打爆。
示例:5秒内,相同参数值最多请求2次
3)授权规则
基于调用来源进行访问控制。
示例 :只允许origin=app的请求通过
4)系统规则
对整个服务的所有接口进行全局保护。
示例:sentinel-consumer服务的所有接口QPS总和不超过2
2. 降级规则(Degrade Rule)
1)异常比例熔断
统计时长: 5秒
最小请求数: 至少5次请求
比例阈值: 异常比例超过10%
熔断时长: 熔断5秒
2)异常数熔断
统计时长: 5秒
最小请求数: 至少5次请求
异常数阈值: 超过1次异常
熔断时长: 熔断5秒
3)慢调用比例熔断
统计时长: 5秒
最小请求数: 至少5次请求
比例阈值: 慢调用比例超过10%
最大RT: 响应时间超过1毫秒视为慢调用
熔断时长: 熔断5秒
三、Sentinel整合Feign
1. 为什么要整合Feign?
在微服务架构中,Consumer通常通过Feign调用Provider。要实现熔断降级,需要在Feign层面集成Sentinel。
2. 整合步骤
步骤1:启用Feign对Sentinel的支持
# application.yml
feign:
sentinel:
enabled: true # 开启Feign对Sentinel的支持
步骤2:创建降级逻辑工厂
@Component
public class UserFeignFallbackFactory implements FallbackFactory<UserFeign> {
@Override
public UserFeign create(Throwable throwable) {
return new UserFeign() {
@Override
public User getUserById(Integer id) {
// 返回降级数据
return new User(id, "服务降级,原因:" + throwable.getMessage(), 0);
}
};
}
}
步骤3:在Feign客户端指定降级逻辑
@FeignClient(
value = "sentinel-provider",
fallbackFactory = UserFeignFallbackFactory.class
)
public interface UserFeign {
@GetMapping("/user/{id}")
User getUserById(@PathVariable("id") Integer id);
}
四、Sentinel全局异常处理
统一的异常处理可以提升用户体验,返回友好的错误信息。
@Component
public class GlobalBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
BlockException e) throws Exception {
response.setContentType("application/json;charset=utf-8");
Result result = null;
if (e instanceof FlowException) {
result = new Result(-1, "流控异常,请求被限流");
} else if (e instanceof DegradeException) {
result = new Result(-2, "服务降级,请稍后重试");
} else if (e instanceof AuthorityException) {
result = new Result(-4, "授权验证失败");
} else if (e instanceof SystemBlockException) {
result = new Result(-5, "系统保护触发");
} else {
result = new Result(-999, "未知限流异常");
}
response.getWriter().write(new ObjectMapper().writeValueAsString(result));
}
}
五、Sentinel规则持久化
默认情况下,Sentinel规则存储在内存中,重启后丢失。需要持久化到Nacos配置中心。
方案1:Sentinel Dashboard推送规则到Nacos
步骤1:修改Sentinel Dashboard配置
# application.properties
nacos.address=192.168.61.132:8848
nacos.namespace=sentinel
nacos.groupId=SENTINEL_GROUP
步骤2:重新打包并运行
# 重新打包
jar uf sentinel-dashboard-nacos-1.8.1.jar BOOT-INF/classes/application.properties
# 启动
java -jar sentinel-dashboard-nacos-1.8.1.jar
方案2:微服务从Nacos拉取规则
步骤1:添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
步骤2:配置数据源
spring:
cloud:
sentinel:
datasource:
flow-rule: # 流控规则
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: sentinel
groupId: SENTINEL_GROUP
dataId: ${spring.application.name}-flow-rules
rule-type: flow
degrade-rule: # 降级规则
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: sentinel
groupId: SENTINEL_GROUP
dataId: ${spring.application.name}-degrade-rules
rule-type: degrade
步骤3:Nacos配置示例
[
{
"resource": "/user/{id}",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
六、最佳实践总结
-
生产环境必须配置持久化,避免规则丢失
-
合理设置阈值,根据实际业务压力调整
-
结合监控系统,实时观察系统状态
-
设置合理的降级逻辑,保证核心功能可用
-
定期进行压测,验证流控和降级效果
七、常见问题
Q:Sentinel和Hystrix有什么区别?
A:Sentinel功能更丰富,支持实时监控、系统自适应保护、热点参数限流等,性能更好。
Q:如何选择流控模式?
A:
-
突发流量:选择QPS模式
-
资源紧张:选择线程数模式
-
复杂场景:结合使用
Q:熔断恢复后如何重新接入流量?
A:Sentinel采用"慢启动"策略,逐步恢复流量,避免再次冲击。
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
标签:#Sentinel #微服务 #服务降级 #流量控制 #SpringCloudAlibaba
适合平台:CSDN、博客园、掘金等技术社区