Spring Cloud Alibaba:Sentinel之降级、热点限流与授权控制

Spring Cloud Alibaba:Sentinel之降级、热点限流与授权控制,第1张

Spring Cloud Alibaba:Sentinel之降级、热点限流与授权控制 Spring Cloud Alibaba:Sentinel之降级、热点限流与授权控制

在上一篇博客中,博主介绍了如何整合Sentinel以及它的流控规则:

  • Spring Cloud Alibaba:整合Sentinel & 流控规则详细介绍

本篇博客将会介绍Sentinel的降级、热点限流与授权控制,需要创建Spring Cloud Alibaba项目以及整合Sentinel,这些在上面那篇博客中已经介绍过了,这里不再赘述。

降级 熔断策略

慢调用比例:选择慢调用比例作为熔断策略,需要设置允许的慢调用RT(即最大的响应时间),若请求的响应时间大于它则统计该请求为慢调用。当单位统计时长内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,熔断器会打开(OPEN状态),则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置的慢调用RT,则结束熔断,若大于设置的慢调用RT则会再次被熔断。这和Hystrix的熔断策略差不多:

  • Spring Cloud 之Hystrix初使用
  • Spring Cloud 之Hystrix熔断器、Hystrix-Dashboard可视化监控中心

给资源添加降级。

为了测试,需要修改/kaven接口:

    @GetMapping("kaven")
    public String getKaven(boolean sleep) throws InterruptedException {
        if(sleep) {
            Thread.sleep(400);
        }
        return "hello kaven " + messageService.getMessage();
    }

启动应用后,先请求几次接口,让Sentinel有展示数据,方便给资源添加降级。

当单位统计时长(100000ms=100s,为了方便测试 )内请求数目大于设置的最小请求数目5,并且慢调用的比例大于阈值20%,熔断器会打开(OPEN状态),则接下来的熔断时长(120s)内请求会自动被熔断。经过熔断时长(120s)后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置的慢调用RT(300ms),则结束熔断,若大于设置的慢调用RT则会再次被熔断。

第6次请求/kaven接口被降级了(100s内,慢调用的比例很显然是100%)。

熔断时长(120s)内请求会自动被熔断。

经过熔断时长(120s)后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置的慢调用RT(300ms),则结束熔断。

异常比例:当单位统计时长内请求数目大于设置的最小请求数目,并且请求异常的比例大于阈值,熔断器打开(OPEN 状态),则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求访问接口成功,则结束熔断,否则会再次被熔断。异常比例的阈值范围是 [0.0, 1.0] ,代表0% - 100%。

修改/kaven接口:

    @GetMapping("kaven")
    public String getKaven(boolean throwExc) throws InterruptedException {
        if(throwExc) {
            throw new RuntimeException();
        }
        return "hello kaven " + messageService.getMessage();
    }

重新启动应用,给资源添加降级。

第6次请求/kaven接口被降级了(100s内,异常的比例很显然是100%)。

熔断时长(120s)内请求会自动被熔断。

经过熔断时长(120s)后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求访问接口成功,则结束熔断。

异常数:当单位统计时长内的请求异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求访问接口成功则结束熔断,否则会再次被熔断。

将/kaven资源的降级规则修改为如下图所示:

第6次请求/kaven接口会被降级,其他情况与上面两种熔断策略一样,这里不再赘述。

热点限流

修改/kaven接口:

    @GetMapping("kaven")
    @SentinelResource("kaven")
    public String getKaven(@RequestParam(value = "arg1", required = false) Integer arg1,
                           @RequestParam(value = "arg2", required = false) Integer arg2) {
        return "hello kaven " + messageService.getMessage();
    }

重新启动应用,给kaven资源(不是/kaven资源)添加热点限流。

给kaven资源添加热点限流如下图所示,表示当请求的arg2参数存在,且QPS大于5则触发限流(10s内)。

第6次请求/kaven接口(每次都传入arg2参数)会被限流(10s内)。

如果不传入arg2参数,请求超过5次也不会被限流(10s内),传入arg2参数,只要携带arg2参数的请求不超过5次也不会被限流(10s内)。

授权控制

添加两个配置类:

package com.kaven.alibaba;

import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

public class RequestParametersLimiter implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        // 每个请求都会被校验参数中是否包含arg1
        // 如果不包含则抛异常
        if(httpServletRequest.getRequestURI().startsWith("/kaven")){
            String name = httpServletRequest.getParameter("arg1");
            if(StringUtils.isEmpty(name)){
                throw new RuntimeException("arg1 is null");
            }
            return name;
        }
        return "";
    }
}

RequestParametersLimiter类可以看作一个请求参数限制器,如果请求的URI以/kaven开头,当arg1参数不存在时,会抛出异常,当arg1参数存在时,直接返回该值,其他URI的请求直接返回""。

package com.kaven.alibaba;

import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class SentinelConfiguration {

    @PostConstruct
    public void init(){
        WebCallbackManager.setRequestOriginParser(new RequestOriginParserDefinition());
    }
}

@PostConstruct注解用于需要在依赖注入完成后执行任何初始化的方法。必须在类投入使用之前调用此方法。所有支持依赖注入的类都必须支持这个注解。@PostConstruct注解的方法将会在依赖注入完成后被自动调用。WebCallbackManager类是Sentinel提供的URL cleaner和URL block handler的注册表。通过WebCallbackManager类将RequestOriginParserDefinition实例进行注册(请求源解析器,而其实现是一个请求参数限制器)。

重新启动应用,给资源添加授权。

因此,请求/kaven接口时,arg1参数的值只有属于[0,9]区间才可以请求成功(黑名单相反)。


效果符合预期,Sentinel的降级、热点限流与授权控制就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659998.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存