sentinel是Alibaba Cloud的一个组件,号称流量防卫兵。主打一手流量控制,有但不限于限流和熔断等功能,是高并发情况下提升容灾的策略之一。
限流顾名思义就是限制流量进入,在高并发场景下,比如抢购、秒杀,就可以用到限流。限流有好几种策略:
熔断就像是保险丝一样为了保护系统的运行,断掉一些服务。熔断是下游故障引起的。
而降级就是为了整个系统的整体运行会主动放弃一些不必要的服务。就像阿里的双十一一样,每次凌晨12点买完东西后,都不能立刻退款,是因为他们讲退款服务暂时关闭了,提高整体系统的性能。
maven依赖
<!-- sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置文件中
# sentinel配置
spring:
cloud:
sentinel:
transport:
dashboard: 192.168.250.3:8080
port: 9998
dashboard是sentinel控制台的位置
port本地启的端?口,随机选个不不能被占?用的,与dashboard进?行行数据交互,会在应?用对应的机器?上启动?一个Http Server,该Server 会与Sentinel 控制台做交互, 若被占?用,则开始+1?一次扫描。
sentinel控制台本质上是一个jar包,具体启动命令:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentineldashboard-1.8.0.jar
当sentinel限流时仅仅返回一连串字符,这样交互体验十分不好,可以自定义返回数据
实现BlockExceptionHandler接口,并重写handle方法
@Component
public class UrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
Map<String, Object> map = new HashMap<>();
if (e instanceof FlowException) {
map.put("code", -1);
map.put("msg", "流量异常");
}else if (e instanceof DegradeException) {
map.put("code", -2);
map.put("msg", "降级异常");
}else if (e instanceof ParamFlowException) {
map.put("code", -3);
map.put("msg", "参数限流异常");
}else if (e instanceof SystemBlockException) {
map.put("code", -4);
map.put("msg", "系统负载异常");
}else if (e instanceof AuthorityException) {
map.put("code", -5);
map.put("msg", "授权异常");
}
httpServletResponse.setStatus(200);
httpServletResponse.setHeader("content-Type", "application/json;charset=UTF-8");
httpServletResponse.getWriter().write(JSON.toJSONString(map));
}
}
sentinel在进行降级熔断的时候可以和openFeign配合,返回兜底数据,就不会单单返回一串字符了。
配置文件:
feign:
sentinel:
enabled: true
然后写对应的fallback
@Service
public class VideoServiceFallback implements VideoService {
@Override
public Video findById(int videoId) {
Video video = new Video();
video.setTitle("fallback兜底数据测试");
video.setCreateTime(new Date());
return video;
}
@Override
public int save(Video video) {
return 0;
}
}
在对应的service处标明fallback
@FeignClient(name = "xdclass-video-service", fallback = VideoServiceFallback.class)
public interface VideoService {
原文:https://www.cnblogs.com/zhoujianyi/p/14770803.html