熔断器原理图:
环境配置
- 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>
- applicaion.xml配置
开放provder的数据,provider所有请求都会进行监控,然后用sentinel进行流量控制。同时配置sentinel服务地址
management:
endpoints:
web:
exposure:
include: '*'
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
- 启动Sentinel 控制台。
流控
流控模式:关联
当资源请求数/index一秒内超过单据阈值,资源/list的请求会被限制。
流控模式:链路
test是service层的资源,入口资源/test1是控制器请求入口。请求入口可以有多个,如/test2。以上操作,限制了入口/test1的访问service中test方法的流量。
由于seninel1.6.3以上版本默认收紧链路,因此我们需要开放链路。以下用于开放链路。(固定代码)
- 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>
- application.yml配置
spring:
cloud:
sentinel:
filter:
enabled: false
- 配置类
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的才能访问。反之。
给指定的资源设置流控应用(追加参数),可以对流控应用进行访问权限的设置,具体就是添加白名单和黑名单。
需进行以下配置
- 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;
}
}
- 要让 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());
}
}
自定义规则异常返回
- 创建异常处理类
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);
}
}
- 配置类进行配置,新增SentinelConfiguration配置类。
@Configuration
public class SentinelConfiguration {
@PostConstruct
public void init(){
WebCallbackManager.setUrlBlockHandler(new ExceptionHandler());
}
}