随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
Setinel的主要特性:
Setinel分为两个部分:
java -jar sentinel-dashboard-1.8.3.jar
登录控制台,地址:http://localhost:8080 初始账密:sentinel/sentinel
引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
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作为规则配置数据源 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
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类
配置完后我们发现Sentinel里面就有了
所有属性来⾃源码FlowRule类
降级配置规则:
配置文件: resume-nacos-consumer-degrade-rules
[ { "resource":"findResumeOpenState", "grade":2, "count":1, "timeWindow":5 } ]
所有属性来⾃源码DegradeRule类
注意