springboot接入sentinel限流、降级熔断

快速接入sentinel文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

  1. 引入jar包

com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel

  1. 配置文件增加配置:
    #设置sentinel控制台地址
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=http://localhost:8080

或者

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080

这里的配置会在应用服务器上开启一个Http Server端口为8719,与指定地址的sentinel控制台(localhost:8080)交互,传输限流规则数据等。

#开启sentinel

feign.sentinel.enabled=true
  1. Sentinel 对Feign、RestTemplate支持

Sentinel适配了Feign组件。
如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:
(1)配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true
(2)加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:


    org.springframework.cloud
    spring-cloud-starter-openfeign

注意:
如果想要将feign默认使用jdk底层的http长连接修改成使用连接池,需要引入jar包:


io.github.openfeign
feign-httpclient
10.4.0

sentinel对RestTemplate支持
Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @SentinelRestTemplate 注解。
@Bean
@SentinelRestTemplate(blockHandler = “handleException”, blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {
return new RestTemplate();
}

4.使用示例

注解接入:
官方文档:
https://gitee.com/rmlb/Sentinel/wikis/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81?sort_id=3419427

测试类使用注解@SentinelResource,value指定一个资源名,blockHandlerClass指定异常BlockException 处理的类,blockHandler 指定处理该资源的方法,方法参数需保持和测试方法相同基础上增加异常BlockException b。

@SentinelResource(value="resource1",blockHandlerClass={ToolsBlockHandler.class}, blockHandler = "resource1Handler")
public void test(String str) throws Exception {}

异常处理机制BlockException 包含降级、限流两种情况

public final class ToolsBlockHandler {
	public void resource1Handler(String str,  BlockException b) {
		If(b instanceof DegradeException){
			log.error(“降级”)
		}else{
			log.error(“限流”)
		}
    }
}

Sentinel规则配置类

@Data
@Component
@ConfigurationProperties("sentinel.degrade")
public class SentinelConfig {

    private List rules;

    /**
     * 设置熔断降级规则
     *
     * @return
     */
    @PostConstruct
    public void initFlowRules() {
        DegradeRuleManager.loadRules(rules);
    }
}

配置文件:

sentinel:
  degrade:
    rules:
# grade=0平均响应时间模式, timeWindow60秒窗口,  count指标时间15s,  slowRatioThreshold慢响应比例80%,  statIntervalMs熔断时长60秒,  minRequestAmount最小统计请求数20
      - resource: resource1
        grade: 0
        statIntervalMs: 60000
        count: 15000
        slowRatioThreshold: 0.8
        timeWindow: 60
        minRequestAmount: 20
# grade=1异常比例模式, timeWindow60秒窗口,  count指标比例80%,  statIntervalMs熔断时长60秒,  minRequestAmount最小统计请求数20
      - resource: resource1
        grade: 1
        statIntervalMs: 60000
        count: 0.8
        timeWindow: 60
        minRequestAmount: 20

grade = 0、1区分两种规则情况,即平均响应时间和异常比例

我们通常用以下几种方式来衡量资源是否处于稳定的状态:
(1)平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
(2)异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
(3)异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态

自定义接入方式:
https://gitee.com/rmlb/Sentinel/wikis/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8?sort_id=3419419

class LivingVerifySentinel {
	public LivingVerifyResponse sentinelEntry(String name, Biz biz) {
    	//埋点降级
    	Entry entry = null;
        try {
        	//设置资源名
         	entry = SphU.entry(name);
         	return biz.apply();
         } catch (BlockException e) {
         	//降级,限流
         	return livingVerifyBlockException(name, e);
         } catch (BizProcessException ex) {
         	//需要统计的异常
            Tracer.traceEntry(ex, entry);
            throw ex;
         } finally {
             // 务必保证 exit,务必保证每个 entry 与 exit 配对
             if (entry != null) {
                 entry.exit();
                }
            }
        }

    interface Biz {
        /**
         * 业务执行
         *
         * @return
         */
        LivingVerifyResponse apply();
    }
}

你可能感兴趣的:(sentinel,spring,cloud,spring,boot,java)