sentinel 的基础知识参考官方文档和本人 SpringCloud 学习项目
熔断
: 使用 Sentinel 直接快速返回失败的请求,而不是进行远程调用。例如: Fegin 有一个默认的过期时间 3s(不知道准不准确),如果某个服务宕机或者总是服务超时,每次都要等待 3s 才返回,资源得不到释放,降低了吞吐量降级
: 例如此时正处于秒杀流量高峰期,手工的停掉非核心业务【例如注册】,直接返回错误提示页面【降级页面】熔断与降级比较
限流
对打入服务器的请求流量进行控制,使服务能够承担不超过自己的能力的流量压力,超过了流量的峰值的直接打回重试模式
Sentinel 与 Hystrix 对比
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<!-- sentinel熔断降级限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
基本配置
# sentinel控制台地址
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
# 暴露所有监控端点,使得sentinel可以实时监控
management:
endpoints:
web:
exposure:
include: "*"
注意
:
//执行一次访问即可
http://localhost:25000/getCurrentSeckillSkus
流控规则设置
效果:
@Configuration
public class GulimallSentinelConfig implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
R error = R.error(BizCodeEnum.TO_MANY_REQUEST.getCode(), BizCodeEnum.TO_MANY_REQUEST.getMsg());
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(JSON.toJSONString(error));
}
}
TO_MANY_REQUEST(10003,"请求流量过大,请稍后再试")
如果能在网关层就进行流控,可以避免请求流入业务,减小服务压力
<!-- 引入sentinel网关限流 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
默认情况下,sentinel 是不会对 feign 进行监控的,需要开启配置
feign:
sentinel:
enabled: true
开启后的效果
feign 的降级
在@FeignClient
设置fallback
属性
@FeignClient(value = "gulimall-seckill",fallback = SeckillFallbackService.class)
public interface SeckillFeignService {
@ResponseBody
@GetMapping(value = "/getSeckillSkuInfo/{skuId}")
R getSeckillSkuInfo(@PathVariable("skuId") Long skuId);
}
在降级类中实现对应的feign接口
,并重写降级方法
@Component
public class SeckillFallbackService implements SeckillFeignService {
@Override
public R getSeckillSkuInfo(Long skuId) {
return R.error(BizCodeEnum.READ_TIME_OUT_EXCEPTION.getCode(), BizCodeEnum.READ_TIME_OUT_EXCEPTION.getMsg());
}
}
降级效果
当远程服务被限流或者不可用时,会触发降级效果,如下所示