首页 > 其他 > 详细

Sentinel初体验

时间:2021-05-15 12:23:54      阅读:23      评论:0      收藏:0      [点我收藏+]

Sentinel初体验

sentinel是Alibaba Cloud的一个组件,号称流量防卫兵。主打一手流量控制,有但不限于限流和熔断等功能,是高并发情况下提升容灾的策略之一。

技术分享图片

限流

限流顾名思义就是限制流量进入,在高并发场景下,比如抢购、秒杀,就可以用到限流。限流有好几种策略:

  1. 立刻失败,就是到达流量阈值就会直接失败。
  2. 等待队列,到达流量阈值的请求会进入等待队列进行等待,就好像小米抢购一样,每次抢购都会提示等待
  3. warm up:就是预热,等待流量阈值慢慢提升

技术分享图片

熔断

熔断就像是保险丝一样为了保护系统的运行,断掉一些服务。熔断是下游故障引起的。

而降级就是为了整个系统的整体运行会主动放弃一些不必要的服务。就像阿里的双十一一样,每次凌晨12点买完东西后,都不能立刻退款,是因为他们讲退款服务暂时关闭了,提高整体系统的性能。

sentinel的使用

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限流时自定义返回数据

当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进行兜底数据的返回

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 {

Sentinel初体验

原文:https://www.cnblogs.com/zhoujianyi/p/14770803.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!