快速接入sentinel文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
com.alibaba.cloud
spring-cloud-starter-alibaba-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
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();
}
}