Sentinel与Hystrix对比
(Hystrix控制台需要自建且功能少,好像支持通过线程数+队列大小进行限流)
使用Sentinel
1.下载sentinel-dashboard.jar并启动
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
2.改pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>jsr305</artifactId>
<groupId>com.google.code.findbugs</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.改yaml
spring:
application:
name: auth-server
cloud:
nacos:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
clientIp: localhost
management:
endpoints:
web:
exposure:
include: '*'
4.启动访问任意接口(Sentinel有懒加载)
访问http://localhost:8080,为接口资源添加流控规则
效果:
功能介绍
1.流控规则
QPS直接失败:当每秒请求数达到阈值时直接失败
线程数直接失败:当请求线程数达到阈值时直接失败
关联模式:当关联资源达到阈值时限流自己
链路模式:只统计指定入口资源的流量数来限流
Warm Up:让资源从初始阈值(阈值 / 加载因子默认3)经过预热时长秒数后达到最终阈值来限流
排队等待:请求到达阈值时进行排队等待,毫秒时间后超时
2.降级规则(服务熔断)
(服务降级有两种方式,一是服务鉴定为不可用时直接禁止访问从而释放资源(即服务熔断(服务端)),二是服务发生某种错误时,主动调用降级逻辑进行处理从而保证服务可用(客户端))
RT:当资源平均响应时间超过毫秒时间 且 在时间窗口内通过的请求数>=5,触发熔断,窗口期过后恢复(RT毫秒时间默认最大4900)
异常比例:当QPS>=5 且 秒级统计的异常比例超过阈值时,触发熔断 ,窗口期过后恢复
异常数:分钟级统计的异常数超过阈值时,触发熔断,窗口期过后恢复
3.热点规则与自定义限流处理方法
热点规则需要结合@SentinelResource使用:当资源testApi请求携带了0下标位参数,窗口时间内QPS数达到阈值,触发限流方法(注意为public)
参数额外项:当0下标位参数值为5时,限流阈值为50
4.@SentinelResource配置与降级方法
(1)通过blockHandlerClass就可以将限流处理方法与业务类解耦
(2)上面说到,限流熔断只是降级的其中一种,而业务代码的异常也需要做降级处理,通过fallback(和fallbackClass):
(注意!即使blockHandler和fallback同时配置,它们都是各司其职负责各自的异常。还有一个
exceptionsToIgnore配置可以忽略指定的异常类型来抛出异常)
(3)作为微服务中的一员,功能的提供通常都是由多个成员一起完成的,因此常见的接口请求异常也是需要做降级处理的 :
feign: #激活对Feign的支持
sentinel:
enabled: true
(通过fallback配置和实现类匹配降级方法)
5.限流规则的持久化
每当服务重启,控制台里的限流规则就会消失因为默认配置规则是存储在内存中的,因此需要配置在其他地方如Nacos。
改pom
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
加yml
spring:
application:
name: auth-server
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
clientIp: localhost
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name} #对应Nacos的配置
groupId: DEFAULT_GROUP #对应Nacos的配置
data-type: json
rule-type: flow #流控规则类型
Nacos新增配置
resource:资源名称
limitApp:来源应用
grade:阈值类型,0线程数,1QPS
count:单机阈值
strategy:流控模式,0直接,1关联,2链路
controlBehavior:流控效果,0快速失败,1Warm Up,2排队等待
clusterMode:是否集群;