文章内容输出来源:拉勾教育Java高薪训练营;
Sentinel是⼀个⾯向云原⽣微服务的流量控制、熔断降级组件,可以用来替代Hystrix解决服务雪崩、服务降级、服务熔断、服务限流等问题。
对比Hystrix来说,Sentinel提供了独⽴可部署Dashboard控制台组件,通过在控制台进行配置即可完成对服务的限流、熔断、降级等控制,减少了代码部分的开发
下载地址:https://github.com/alibaba/Sentinel/releases
默认端口:8080,有冲突记得修改,这里改为了8090
启动命令:
java -jar sentinel-dashboard-1.7.1.jar --server.port=8090 &
默认⽤户名/密码:sentinel/sentinel
访问:http://localhost:8090/#/dashboard/home
引入maven依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
修改yml配置文件
server:
port: 8080
spring:
application:
name: cloud-service-user
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
sentinel:
transport:
dashboard: 127.0.0.1:8090# sentinel dashboard/console 地址
port: 8719
jpa:
database: MySQL
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免将驼峰命名转换为下划线命名
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的细节
endpoint:
health:
show-details: always
Sentinel是懒加载的,在完成上述配置后,不会立刻发生变化,在发送一次请求之后,才会触发。
是否集群: 是否集群限流
流控模式
流控效果
Sentinel会在某个资源不稳定时进行降级,在接下来的时间窗口内都进行熔断(不会像Hystrix那样放过⼀个请求尝试⾃我修复,熔断触发后,时间窗⼝内拒绝所有请求,时间窗⼝结束后才会恢复)。
可以通过参数在限制接口访问,针对热点数据做限流,
场景:比如一些比较火的商品,频繁访问的商品可以利用这个限流
比如针对cpu占用多少时进行控制,这里是全局控制,使用的场景也比较少
@SentinelResource
注解类似于Hystrix中的@HystrixCommand
注解
/**
* @SentinelResource value:定义资源名
* blockHandlerClass:指定Sentinel规则异常兜底逻辑所在class类
* blockHandler:指定Sentinel规则异常兜底逻辑具体哪个⽅法
* fallbackClass:指定Java运⾏时异常兜底逻辑所在class类
* fallback:指定Java运⾏时异常兜底逻辑具体哪个⽅法
*/
@GetMapping("/checkState/{userId}")
@SentinelResource(value = "findUserState",
blockHandlerClass = SentinelFallbackClass.class,
blockHandler = "handleException",
fallback ="handleError",
fallbackClass = SentinelFallbackClass.class)
public Integer findUserState(@PathVariable Long userId) {
// 模拟降级:
/*
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
*/
// 模拟降级:异常⽐例
int i = 1 / 0;
Integer defaultUserState = resumeServiceFeignClient.findDefaultUserState(userId);
return defaultUserState;
}
⾃定义兜底逻辑类
public class SentinelHandlersClass {
// 整体要求和当时Hystrix⼀样,这⾥还需要在形参最后添加BlockException参数,⽤于接收异常
// 注意:⽅法是静态的
public static Integer handleException(Long userId, BlockException
blockException) {
return -100;
}
public static Integer handleError(Long userId) {
return -500;
}
}
我们在Sentinel Dashboard中定义的规则全部存储在内存中,这会导致一个问题,当我们将Sentinel重启后,之前定义的规则就会消失,这在生产环境下对我们来说是很不方便的,我们可以借助nacos的配置中心,nacos可以将配置信息持久化到数据库,从而达到我们将Sentinel规则持久化的目的。
在微服务项目中引入依赖:
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
修改配置文件
server:
port: 8080
spring:
application:
name: cloud-service-user
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
sentinel:
transport:
dashboard: 127.0.0.1:8090# sentinel dashboard/console 地址
port: 8719
###############################################新增部分start###################################
# Sentinel Nacos数据源配置,Nacos中的规则会自动同步到sentinel流控规则中
datasource:
# 自定义的流控规则数据源名称
flow:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-flow-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow # 类型来自RuleType类
# 自定义的降级规则数据源名称
degrade:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-degrade-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade # 类型来自RuleType类
########################################新增部分end###########################################
jpa:
database: MySQL
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免将驼峰命名转换为下划线命名
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的细节
endpoint:
health:
show-details: always
nacos中添加对应规则配置信息
流控规则配置集 cloud-user-service-flow-rules
[
{
"resource":"findUserState",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
resource: 资源名称
limitApp: 来源应⽤
grade: 阈值类型 0 线程数 1 QPS
count: 单机阈值
strategy: 流控模式,0 直接 1 关联 2 链路
controlBehavior: 流控效果,0 快速失败 1 Warm Up 2 排队等待
clusterMode: true/false 是否集群
降级规则配置集 cloud-user-service-degrade-rules
[
{
"resource":"findUserState",
"grade":2,
"count":1,
"timeWindow":5
}
]
resource: 资源名称
grade: 降级策略 0 RT 1 异常⽐例 2 异常数
count: 阈值
timeWindow: 时间窗
*以上规则的可以在源码Rule接口的实现类中查看