Sentinel下载: 下载地址
最上边这个jar包,下载后找个目录放java -jar运行就可以了
Sentinel默认是8080端口
启动示例
java -jar sentinel-dashboard-1.8.5.jar --server.port=9095//以9095端口启动,默认8080
--server.port=自定义端口。默认为 8080
--auth.username=自定义账号 和 --auth.password=自定义账号密码。默认为sentinel
--logging.file=自定义日志文件位置。默认为 ${user.home}/logs/csp/sentinel-dashboard.log
springboot使用
pom
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.0.1.0</version>
</dependency>
配置类
spring:
cloud:
sentinel:
transport:
#配置sentinel dashboard地址
dashboard: localhost:9095
#默认8719端口,若此端口被占用会循环+1扫描,直至找到未被占用端口
port: 8719
配置完启动后,在后台没任何显示,只有访问一次服务后后台才会出现此服务
可在蔟点链路查看访问的接口并添加流控,熔断,热点,授权
先说个注解 官网解释
@SentinelResource(value = "资源名",blockHandler = "出问题调用的方法名")
出问题调用的方法再原方法基础上加个BlockException参数就可以了
例
不写这个接口就直接拿接口访问路径当资源名也行
流控规则(限定接口访问数量):
-
阈值:其中QPS指的是每秒钟访问的次数,线程数就是同时访问的线程数量,阈值就是设置的上限
-
流控效果:
- 快速失败:超过阈值直接返回错误
- 预热:会出现一个输入框提示输入预热时长,会在该时间内将阈值由设定阈值的1/3倍逐渐提升至1倍
- 排队:顾名思义
-
流控模式:
- 直接:超过阈值我返回错误
- 关联:我关联你,你超过我设置的阈值,我寄了
- 链路:只统计部分来源的阈值
看不懂可以点击这里,描述的很详细
熔断规则(使接口暂时无法访问):
-
熔断策略:
- 慢调用比例:
- RT:平均等待时间
- 比例阈值:超时请求比例达到此阈值将对接口熔断
- 熔断时间:设置接口无法访问的时间,时间过后接口可恢复访问
- 最小请求数:统计时常内的请求达到此请求数,开始判断是否熔断
- 统计时常:统计此时间段内的请求数
- 预异常比例:
- 比例阈值:异常请求比例达到此阈值将对接口熔断
- 异常数:
- 异常数:异常请求比例达到此数量将对接口熔断
- 慢调用比例:
热点规则(对接口内某个参数限流):
- 参数索引:方法中形参的索引,举个例子
在此方法中a的参数索引为0,b的参数索引为1
- 单机阈值:访问次数上限(只统计包含热点参数的请求,如我请求这个接口,不传参数a那就不会被限制)
- 统计窗口时长:几秒一个循环,假如设置5秒,过了三秒被限流则限流两秒,若才过一秒就限流了就会限流4秒(自己测试的,不对可留言,勿喷)
参数例外项 - 参数类型:几个级别数据类型加字符串(选热点限流参数数据类型)
- 参数值:热点参数可能的值
- 限流阈值:热点参数针对于该参数值可以访问的次数。
额外项意思就是,本来只要查我参数a,查到阈值就限流,而我加了额外项后,假如我加了参数值xxxx阈值300,那我查a的值为xxxx的数据要到300次才限流。
系统规则(整体的,不针某个接口):
- Load:自适应(仅对 Linux/Unix-like 机器生效)并发线程数超过估算的系统容量时才会触发系统保护
- RT:所有入口流量的平均执行时间达到阈值即触发系统保护
- 线程数:所有入口流量的并发线程数达到阈值即触发系统保护
- 入口 QPS:单台机器上所有入口流量的 QPS 达到阈值即触发系统保护
- CPU使用率:当系统 CPU 使用率超过阈值即触发系统保护
授权规则:
若配置白名单则只有请求来源位于白名单内时才可通过;
若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
使用参考
额外补充:
整合openfeign
yml
#配置feign对sentinel的支持
feign:
sentinel:
enabled: true
在@FeignClient注解添加fallback值为保底类的class
Service代码
@FeignClient(name="QIESIYV-ZHUTI-TIGONG",contextId = "Ceshi",fallback = ParOpenFeignSentinelService.class)
@Component
public interface ParOpenFeignService {
@GetMapping(value = "/ceshi/ceshi")
String ceshi();
}
保底类代码
@Component
public class ParOpenFeignSentinelService implements ParOpenFeignService {
@Override
public String ceshi() {
return "已服务熔断";
}
}
当关闭所有服务提供者再访问此接口
效果
配置持久化到nacos
看了一圈最简单的:链接