Sentinel下载
下载地址:Sentinel下载
- 启动:
java -Dserver.port=8080 -jar sentinel-dashboard-1.7.1.jar
(Sentinel端口默认是8080,可通过-Dserver.port
指定端口)。 - 浏览器访问8080可看到Sentinel管理页面(用户密码均为:sentinel)。
Sentinel使用
Sentinel监控微服务
- 新建module:
cloud-sentinel-service-9010
- POM
<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- yaml
server:
port: 9010
spring:
application:
name: sentinel-service
cloud:
nacos:
discovery:
server-addr: 192.168.74.130:8848 #naocs地址
sentinel:
transport:
dashboard: 192.168.74.130:8080 #sentinel地址
port: 8719 #端口配置会在应用对应的机器上启动一个Http Server,该Server会与Sentinel控制台做交互。默认8719,被占用会从8719开始依次+1扫描,直到终点未被使用端口。
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
- 主启动
@SpringBootApplication
@EnableDiscoveryClient
public class SentinalServiceMain {
public static void main(String[] args) {
SpringApplication.run(SentinalServiceMain.class,args);
}
}
- Controller
@RestController
@Slf4j
public class SentinalController {
@GetMapping("/getA")
public String getA(){
log.info("Hello -- A");
return "Hello -- A";
}
@GetMapping("/getB")
public String getB(){
log.info("Hello -- B");
return "Hello -- B";
}
}
- 启动服务查看Setinel控制台,并没有出现微服务;浏览器访问
/getA
,/getB
后刷新Sentinel工作台,可以看到微服务已成功被Sentinel监控(懒加载)。
流控规则
-
资源名:唯一名称,默认请求路径
-
针对来源:Sentinel可以根据调用者进行限流,填写微服务名,默认default(不区分来源)
-
阈值类型/单击阈值:
- QPS(每秒请求数量):当调用该api的QPS达到阈值时,进行限流
- 线程数:当调用该api的线程数达到阈值时,进行限流
-
是否集群:勾选则是集群
-
流控模式
- 直接:达到限流条件直接限流
- 管理:关联资源达到阈值,限流自己
- 链路:指定链路上的流量达到阈值,进行限流
-
流控效果(仅QPS)
- 快速失败:直接失败,抛异常
- Warn Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
- 排队等待:匀速排队,让请求匀速通过
降级规则
Sentinel的断路器是没有半开状态的
- 资源名:唯一名称,默认请求路径
- 降级策略:
- RT(平均响应时间,秒级):平均响应时间超出
阈值(以 ms 为单位)
,那么在接下的时间窗口(以 s 为单位)
之内,对这个方法的调用都会自动地熔断 - 异常比例(秒级):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过
阈值
之后,资源进入降级状态,即在接下的时间窗口(以 s 为单位)
之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100% - 异常数(分钟级):当资源近 1 分钟的异常数目超过
阈值
之后会进行熔断。,若 时间窗口小于 60s,则结束熔断状态后仍可能再进入熔断状态
- RT(平均响应时间,秒级):平均响应时间超出
热点key限流
- 资源名:唯一名称,默认请求路径
- 限流模式:QPS模式
- 参数索引:对应url参数索引位置
- 单机阈值:当调用该api的QPS达到阈值时,进行限流
- 统计窗口时长:统计窗口时间长度(单位为秒),1.6.0 版本开始支持
- 参数例外项(可以针对指定的参数值单独设置限流阈值,不受前面阈值的限制)
- 参数类型:仅支持基本类型和字符串类型
- 参数值:指定任意满足参数类型的参数值
- 限流阈值:针对指定的参数值的QPS达到阈值时,进行限流
系统规则(不建议使用)
- LOAD(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的
maxQps * minRt
估算得出。设定参考值一般是CPU cores * 2.5
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护
- 入口QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护
- CPU使用率:当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏
@SentinelResouce注解
按资源名称限流
- Controller代码
@GetMapping("/getResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public Result getByResource(){
return new Result(200,"Success","getByResource");
}
public Result handleException(BlockException blockException){
return new Result(444,"资源名称限流","handleException");
}
- Sentinel配置
- 一秒多次访问
按URL限流(优先级高)
- Sentinel配置
- 一秒多次访问(系统默认限流处理信息)
自定义限流处理逻辑(与业务解耦)
- 新建自定义限流处理类(限流处理方法必须
static
修饰)
public class MyBlockHandler {
public static Result myBlockHandlerException(BlockException blockException){
return new Result(444,"自定义限流","myBlockHandlerException");
}
- Controller代码
@GetMapping("/getMyResource")
@SentinelResource(value = "myResource",blockHandlerClass = MyBlockHandler.class, blockHandler = "myBlockHandlerException")
public Result getByMyResource(){
return new Result(200,"Success","getByResource");
}
- 一秒多次访问
@SentinelResource 注解属性
value
:资源名称,必需项(不能为空)entryType
:entry 类型,可选项(默认为 EntryType.OUT)blockHandler / blockHandlerClass
:主管配置违规
。blockHandler 对应处理BlockException
的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为static
函数,否则无法解析。fallback / fallbackClass
:管运行异常
。fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常
(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。defaultFallback(since 1.6.0)
:默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。exceptionsToIgnore(since 1.6.0)
:用于指定哪些异常被排除掉
,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
持久化配置
重启应用,Sentinel规则会消失,生产环境需要将配置规则进行持久。
- POM文件
<!-- 持久化进nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
- yaml
spring:
application:
name: sentinel-service
cloud:
nacos:
discovery:
server-addr: 192.168.74.130:8848
sentinel:
transport:
dashboard: 192.168.74.130:8080
port: 8719 #端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互
datasource:
ds1:
nacos:
server-addr: 192.168.74.130:8848
dataId: sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow #流控规则
- nacos配置
"resource":"myResource", #资源名称
"limitApp":"default", #针对来源
"grade":1, #阈值类型,0表示线程数,1表示QPS
"count":1, #单机阈值
"strategy":0, #流控模式,0表示直接,1表示关联,2表示链路
"controlBehavior":0, #流控效果,0表示快速失败,1表示Warn Up,2表示排队等待
"clusterMode":false #是否集群
- 重新启动服务,发现流控规则已存在