Sentinel使用


熔断器原理图:

在这里插入图片描述

环境配置

  1. pom.xml引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

采集数据
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. applicaion.xml配置
    开放provder的数据,provider所有请求都会进行监控,然后用sentinel进行流量控制。同时配置sentinel服务地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
  1. 启动Sentinel 控制台。

流控

流控模式:关联

在这里插入图片描述
当资源请求数/index一秒内超过单据阈值,资源/list的请求会被限制。

流控模式:链路


test是service层的资源,入口资源/test1是控制器请求入口。请求入口可以有多个,如/test2。以上操作,限制了入口/test1的访问service中test方法的流量。

由于seninel1.6.3以上版本默认收紧链路,因此我们需要开放链路。以下用于开放链路。(固定代码)

  1. pom.xml添加依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.7.1</version>
</dependency>

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>1.7.1</version>
</dependency>
  1. application.yml配置
spring:
	cloud:
        sentinel:
          filter:
            enabled: false
  1. 配置类
package com.southwind.configuration;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new CommonFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
        registrationBean.setName("sentinelFilter");
        return registrationBean;
    }
}

流控效果:Warm up

在这里插入图片描述
warm up是预热加载,前N秒单机阈值是设置的1/3N秒,N秒后恢复为N秒。

流控效果: 排队等待

在这里插入图片描述
排队等待,例 设置阈值为1,一秒内两次请求,第一次请求肯定成功,第二次请求肯定失败,失败后在500毫秒后,继续进行第二次请求。看是否请求成功,否则抛异常。

降级

降级策略:RT(平均响应时间)

在这里插入图片描述
在这里插入图片描述
前五个请求还是可以走得通,计算完五个请求平均值超过RT,则立刻进行降级N秒。

降级策略:异常比例

在这里插入图片描述
出现异常请求次数与总请求比例,超过0.2,则进行降级N秒。

降级策略:异常数

在这里插入图片描述
一分钟内异常数大于5,则进行降级N秒。
1分钟内的异常数超过阈值就进行降级处理,时间窗口的值要大于 60S,否则刚结束熔断又进入下一次熔断了。

热点

对参数进行限流
在这里插入图片描述

传参中,包含第一个参数(参数索引0)的阈值为1,则限流。
当第一个参数的值为10,则阈值取100。

授权

有没有权限访问某个请求
在这里插入图片描述
白名单中设置,则只有带参数name=admin的才能访问。反之。
给指定的资源设置流控应用(追加参数),可以对流控应用进行访问权限的设置,具体就是添加白名单和黑名单。

需进行以下配置

  1. RequestOriginParserDefinition类,写在配置类处即可
package com.southwind.configuration;

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

import javax.servlet.http.HttpServletRequest;

public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String name = httpServletRequest.getParameter("name");
        if(StringUtils.isEmpty(name)){
            throw new RuntimeException("name is null");
        }
        return name;
    }
}  
  1. 要让 RequestOriginParserDefinition 生效,需要在配置类中进行配置。新增配置类
package com.southwind.configuration;

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());
    }
}

自定义规则异常返回

  1. 创建异常处理类
package com.southwind.handler;

import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ExceptionHandler implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
        httpServletResponse.setContentType("text/html;charset=utf-8");
        String msg = null;
        if(e instanceof FlowException){
            msg = "限流";
        }else if(e instanceof DegradeException){
            msg = "降级";
        }
        httpServletResponse.getWriter().write(msg);
    }
}
  1. 配置类进行配置,新增SentinelConfiguration配置类。
@Configuration
public class SentinelConfiguration {

    @PostConstruct
    public void init(){
        WebCallbackManager.setUrlBlockHandler(new ExceptionHandler());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值