下载sentinel的dashboard,https://github.com/alibaba/Sentinel/releases/tag/v1.8.0下载sentinel-dashboard-1.8.0.jar
因为是jar包,所以可以直接java-jar运行,sentinel-dashboard的默认端口为8080,注意端口不要被占用,访问8080出现sentinel的登录就表示启动成功
新建model,叫service-provider-alibaba-sentinel9010,pom文件
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
配置文件application.yml
server:
port: 9010
spring:
application:
name: service-provider-alibaba-sentinel9010
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
management:
endpoints:
web:
exposure:
include: "*"
启动类加注解
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderAlibabaSentinel9010 {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderAlibabaSentinel9010.class, args);
}
}
controller类
@RestController
public class HelloController {
@Value("${server.port}")
public String serverPort;
@RequestMapping("/hello")
public String getHello(){
return serverPort;
}
}
启动nacos8848,启动sentinel-dashboard8080,启动service-provider-alibaba-sentinel9010服务
调用http://localhost:9010/hello,然后登录dashboard就能看到了,账号密码是sentinel
主要是做流量控制,可以控制到具体的某一个接口,还可以自己选择模式和效果
流控模式:直接表示达到阈值就进行限流,关联表示A达到阈值就限流B(比如支付接口达到阈值就限流下单接口),链路表示记录链路上的流量,当链路上的某一点达到阈值时,会对这条链路进行限流
流控效果:快速失败表示直接抛出异常,Warm Up表示预热,根据冷加载因子(默认3)经过预热时长才达到设置的QPS阀值,排队表示大量请求过来,会排队一个一个进行消费。
http://localhost:9010/hello
如果在一秒内差不多点击一次的话,接口正常调用,如果快速点击的话,会进行限流“Blocked by Sentinel (flow limiting)”
当然可以在服务里面自定义限流后的逻辑,使用@SentinelResource(value = “hello”, blockHandler = “getHelloblockHandler”)注解,blockHandler就是发生限流后走的方法名称,需要自己定义
@RestController
public class HelloController {
@Value("${server.port}")
public String serverPort;
@RequestMapping("/hello")
@SentinelResource(value = "hello", blockHandler = "getHelloblockHandler")
public String getHello(){
return serverPort;
}
public String getHelloblockHandler(BlockException e){
return "发生限流了----------------";
}
}
@SentinelResource注解后面还可以加fallback,用于程序本身异常时走的逻辑
慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例 :当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0]
,代表 0% - 100%。
异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
熔断降级规则(DegradeRule)包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
属性 | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade | 限流模式 | QPS 模式 |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx | 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 |
|
paramFlowItemList | 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型 |
|
clusterMode | 是否是集群参数流控规则 | false |
clusterConfig | 集群流控相关配置 |
使用热点参数要添加依赖pom
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-parameter-flow-controlartifactId>
dependency>
添加方法
@RequestMapping("/hot")
@SentinelResource(value = "hot", blockHandler = "getHelloblockHandler")
public String getHot(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2){
return serverPort;
}
添加高级选项后记得点击添加后在点击保存
调用http://localhost:9010/hot?p1=1,发现是不会限流的,
调用http://localhost:9010/hot?p2=1,发现是会限流的
调用http://localhost:9010/hot?p2=2,如果限流阈值填得足够高,手动刷新是感觉不到到限流的
设置高级选项是可以对参数的具体值做不同的限流的,对于热点的商品有很好的效果
maxQps * minRt
估算得出。设定参考值一般是 CPU cores * 2.5
。系统规则主要是当达到某一条件后,就会触发系统保护,导致整个服务不可用,达到保护效果
resource
:资源名,即限流规则的作用对象。limitApp
:对应的黑名单/白名单,不同 origin 用 ,
分隔,如 appA,appB
。strategy
:限制模式,AUTHORITY_WHITE
为白名单模式,AUTHORITY_BLACK
为黑名单模式,默认为白名单模式。若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。