首页 > 其他分享 >十四、使用Sentinal进行限流熔断

十四、使用Sentinal进行限流熔断

时间:2023-06-03 17:23:03浏览次数:33  
标签:spring nacos 熔断 Sentinal sentinel 限流 cloud

内容

  • sentinal限流降级:限流是接口流量太大要进行限制,限制后的流量进行降级。
  • sentinal熔断降级:熔断是A调用B,而B不靠谱,就熔断不调用,并降级。
  • sentinal+nacos组合。

常见的限流算法

  • 静态窗口限流
  • 动态窗口限流

    例如:当前是第2.5秒

    静态:统计第2秒到现在的请求数

    动态:统计第1.5秒到现在的请求数

  • 漏桶限流:所有的请求放入队列,请求超出队列上限则失败
  • 令牌桶算法:令牌桶放令牌,每秒按多少往桶里放令牌,请求进来就取令牌。
  • 令牌大闸:在令牌桶的基础上做控制,初始给多少令牌。

初识sentinal

Sentinel 功能

流量控制

很多请求调用方法,而系统的处理能力是有限的。需要根据系统的处理能力对流量进行控制。只允许一定量的请求进入。流量控制是在被调用方,在接口入口限流。

熔断降级

某一服务不稳定,调用方要主动断开。

限流主要用在被调用方,熔断在调用方。

sentinel初体验

引入sentinel依赖

<!--限流熔断-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

启动类新增限流方法,默认qps限流

 1 private static void initFlowRules(){
 2         List<FlowRule> rules = new ArrayList<>();
 3         FlowRule rule = new FlowRule();
 4         rule.setResource("doConfirm");
 5         rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
 6         // Set limit QPS to 1.
 7         rule.setCount(1);
 8         rules.add(rule);
 9         FlowRuleManager.loadRules(rules);
10     }

还要对限流的线程进行处理,否则会抛出FlowException异常。

doConfirm增加注解,说明限流后怎么处理

@SentinelResource(value = "doConfirm", blockHandler = "doConfirmBlock")


public void doConfirmBlock(ConfirmOrderDoReq req, BlockException e) {
LOG.info("购票请求被限流:{}", req);
throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION);
}
}

使用sentinel控台监控流量

启动控制台命令

java -Dserver.port=18080 -Dcsp.sentinel.dashboard.server=localhost:18080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

windows 要把-D命令放到-jar命令之后,否则会报错。

 8719是固定的,18080可以在命令行更改

 后台可以看到请求通过的数量。

使用Sentinel配置限流

之前的配置写在代码的启动类,还有之前的限流设置在方法里,也可以对某个接口进行限流。通过控台可以实现。

簇点链路

代码中不写死限流规则,通过控台来配置,但是控台配置后,重启会清空所有的配置。接口的资源名称不要和接口路径一致,会导致限流后走不到降级方法中

降级方法

/** 降级方法,需包含限流方法的所有参数和BlockException参数,且返回值要保持一致
     * @param req
     * @param e
     */
    public CommonResp<Object> doConfirmBlock(ConfirmOrderDoReq req, BlockException e) {
        LOG.info("ConfirmOrderController购票请求被限流:{}", req);
        // throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION);
        CommonResp<Object> commonResp = new CommonResp<>();
        commonResp.setSuccess(false);
        commonResp.setMessage(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION.getDesc());
        return commonResp;

    }

Sentinel+Nacos实现限流规则持久化

引入依赖

        <!--sentinel+nacos-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

客户端和nacos关联

# sentinel控台:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:18080
# sentinel + nacos
spring.cloud.sentinel.datasource.nacos.nacos.serverAddr=localhost:8848
spring.cloud.sentinel.datasource.nacos.nacos.namespace=train
spring.cloud.sentinel.datasource.nacos.nacos.groupId=TRAIN_GROUP
spring.cloud.sentinel.datasource.nacos.nacos.dataId=sentinel
spring.cloud.sentinel.datasource.nacos.nacos.ruleType=flow

配置限流规则

 对应规则

 通过nacos修改sentinel配置。

sentinel限流不同的流控效果 -- 快速失败 & Warm up & 排队等待

warm up可以选择预热时常,qps从阈值/3开始,经过预热时常升至QPS阈值。比如阈值是100,时长是10s,则从33开始经过10s上升到100.

 500个线程,如果阈值是10,那么其他的线程在超时时间内就会排队等待。超过超时时间就会失败。

sentinel限流不同的流控模式 -- 关联&链路

 关联:对目标的限流是有条件的,需要关联的资源限流时,目标才会限流。hello被限流,hello1才会限流。

链路:从指定路径进来才会限流。比如从hello访问hello1,hello1才会限流。而从hello2访问hello1则不限流。

sentinel+feign熔断初体验

 如果businessFeign.hello调用不顺利,会影响整个功能使用。

那么businessHello从哪来?

构造一个备用的值(熔断降级)

 1s中有30%的请求最大响应时间超过201,后面的11s都不会访问business。

sentinel+feign熔断后的降级处理

增加一个异常处理,不能添加SentinelResource注解

添加一个类,实现接口BusinessFeign接口,写备用方案

@Component
public class BusinessFeignFallback implements BusinessFeign {
    @Override
    public String hello() {
        return "Fallback";
    }

    @Override
    public CommonResp<Object> genDaily(Date date) {
        return null;
    }
}

@FeignClient(value = "business", fallback = BusinessFeignFallback.class)

 

 请求数超过6,每秒统计异常比例,如果30%出现异常,熔断。

 请求数超过6,每秒统计异常比例,如果3次出现异常,熔断。

 

标签:spring,nacos,熔断,Sentinal,sentinel,限流,cloud
From: https://www.cnblogs.com/szhNJUPT/p/17450405.html

相关文章

  • 限流算法
    固定窗口缺陷:最简单,但是不能精确限制,由于是计算的时间差,比如每10秒只能10个请求,8-10秒请求了10个,那么10-18秒就也无法请求了importjava.util.concurrent.atomic.AtomicInteger;importjava.util.concurrent.atomic.AtomicLong;publicclassMyFixedWindow{privatef......
  • Spring Cloud Alibaba Sentinel实现熔断限流代码示例
    SpringCloudAlibabaSentinel介绍SpringCloudAlibabaSentinel是一个面向分布式服务架构的流量控制组件,是SpringCloudAlibaba的核心组件之一。主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。代码示例以下是一个使用SpringC......
  • 电子熔断器IC行业市场调研分析报告
    2023-2029全球电子熔断器IC行业调研及趋势分析报告2022年全球电子熔断器IC市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国电子熔断器IC市场占据全球约%的市场份额,为全球最主......
  • Springboot+Guava实现单机令牌桶限流
    令牌桶算法系统会维护一个令牌(token)桶,以一个恒定的速度往桶里放入令牌(token),这时如果有请求进来想要被处理,则需要先从桶里获取一个令牌(token),当桶里没有令牌(token)可取时,则该请求将被拒绝服务。令牌桶算法通过控制桶的容量、发放令牌的速率,来达到对请求的限制。=================......
  • 8、Hystrix 线程池隔离与接口限流
    线程池隔离技术的设计原则Hystrix采取了bulkhead舱壁隔离技术,来将外部依赖进行资源隔离,进而避免任何外部依赖的故障导致本服务崩溃线程池隔离,学术名称:bulkhead,舱壁隔离外部依赖的调用在单独的线程中执行,这样就能跟调用线程隔离开来,避免外部依赖调用timeout耗时过长,导致调用线程......
  • 1004.Django项目用户功能之关联序列化及访问限流
    一、路由器1.SimpleRouter该路由器包括标准集合——list、create、retrieve、update、partial_update、destroy动作的路由。视图集中还可以使用@detail_route或@list_route装饰器标记要被路由的其他方法;2.DefaultRouter这个路由器类似于上面的SimpleRouter,但是还包括一个默......
  • Hystrix(服务熔断)+Feign和FallbackFactory(服务降级)
    分布式系统面临的服务雪崩问题当用户发起请求时,假设处理请求的服务器1运行时需要调用到服务器2,服务器2运行时需要调用到服务器3,而如果服务器2因为某些原因始终不能正常调用到服务器3,这时候后面其他用户的请求也都会阻塞在服务器1,在并发量极大的情况下容易导致多个服务器崩溃已经......
  • 简单接口限流能力实现
    使用AOP注解方式在controller接口上实现的请求接口限流一:核心逻辑packagecom.simple.common.aop;importcom.simple.common.model.ErrorCode;importcom.simple.common.model.OperationRateLimit;importcom.simple.common.model.ServiceException;importcom.simple.comm......
  • 弹力设计篇之“限流设计”
    保护系统不会在过载的情况下出现问题,我们就需要限流。我们在一些系统中都可以看到这样的设计,比如,我们的数据库访问的连接池,还有我们的线程池,还有Nginx下的用于限制瞬时并发连接数的limit_conn模块,限制每秒平均速率的limit_req模块,还有限制MQ的生产速,等等。......
  • 微服务网关限流&鉴权-wei-fu-wu-wang-guan-xian-liu--jian-quan
    title:微服务网关限流&鉴权date:2022-01-0614:40:45.047updated:2022-01-0614:40:45.047url:https://www.yby6.com/archives/wei-fu-wu-wang-guan-xian-liu--jian-quancategories:tags:-微服务-鉴权掌握微服务网关Gateway的系统搭建掌握网关限流的实现能够......