随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
Setinel的主要特性:
Setinel分为两个部分:
Sentinel Dashboard部署,下载地址:https://github.com/alibaba/Sentinel/releases ,使用命令启动
java -jar sentinel-dashboard-1.8.3.jar
登录控制台,地址: http://localhost:8080 初始账密:sentinel/sentinel
引入依赖
在服务的application.properties中加入以下配置
spring:
application:
name: resume-nacos-consumer
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719 #sentinel会在该端口启动http server,那么这样的话,控制台定义的一些限流等规则才能发送传递过来
然后调用接口,再查看Sentinel控制台(注意有一会儿的延迟)。
Sentinel关键概念
概念名称
概念描述
资源
它可以是Java应⽤程序中的任何内容。例如,由应⽤程序提供的服务或由应⽤程序调⽤的其它应⽤提供的服务,甚⾄可以是⼀段代码。我们请求的API接⼝就是资源
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整
Sentinel降级会在调⽤链路中某个资源出现不稳定状态时(例如调⽤超时或异常⽐例升⾼),对这个资源的调⽤进⾏限制,让请求快速失败,避免影响到其它的资源⽽导致级联错误。当资源被降级后,在接下来的降级时间窗⼝之内,对该资源的调⽤都⾃动熔断
慢调用比例:
这个版本下好像有bug,比例阈值填不了
异常比例:
异常比例超过0.5就会熔断
异常数:
异常数超过2就会被熔断,上面熔断后,会直接抛出异常。像下面这样:
实际应用中,我们需要对异常进行自定义。
3.1 自定义降级异常
使用blockHandler:
@RequestMapping("/testException")
@SentinelResource(value = "/testExceptionTest",blockHandlerClass = SentinelFallback.class,blockHandler = "handleException")
public String testException(){
int i=1/0;
return "ok";
}
public class SentinelFallback {
/**
* 形参最后加入BlockException参数,用于接收异常,方法必须为public static
* @param blockException
* @return
*/
public static String handleException(BlockException blockException){
return "exception";
}
}
使用fallback:
@RequestMapping("/testError")
@SentinelResource(value = "/testErrorTest",fallbackClass = SentinelFallback.class,fallback = "handleError")
public String testError(){
int i=1/0;
return "ok";
}
public class SentinelFallback {
//方法列表需要和原函数一致,或者多一个Throwable类型的参数
public static String handleError(){
return "error";
}
}
fallback和blockHandler的区别:fallback可以处理所有类型的异常,而blockHandler只处理BlockException类型的异常。
3.2 基于Nacos实现Sentinel规则持久化
引入依赖
sentinel中配置Nacos数据源
spring:
application:
name: resume-nacos-consumer
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719 #sentinel会在该端口启动http server,那么这样的话,控制台定义的一些限流等规则才能发送传递过来
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类
在Nacos里面进行配置
配置完后我们发现Sentinel里面就有了
所有属性来⾃源码FlowRule类
降级配置规则:
配置文件: resume-nacos-consumer-degrade-rules
[
{
"resource":"findResumeOpenState",
"grade":2,
"count":1,
"timeWindow":5
}
]
所有属性来⾃源码DegradeRule类
注意
手机扫一扫
移动阅读更方便
你可能感兴趣的文章