Sentinel实现限流和熔断降级
文章:关于sentinel的介绍已经非常详细了,直接看它就可以了,这边只是做一个简单的学习。
自己根据上面的链接配置好sentinel.
前面我们学习过通过feign + resilience4j 实现限流和服务的熔断降级
feign + resilience4j前情回顾:
需要的依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency>
yml配置:
spring:cloud:openfeign:circuit breaker:enabled: true
通过@FeignClient就可以实现服务调用和熔断降级
现在我们学习一个更加灵活的限流和熔断降级方式:Sentinel
首先
- 下载好sentinel控制台的jar包
- 运行jar包
- 访问127.0.0.1:8080
应用引入依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--sentinel限流,熔断降级--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
给应用配置好sentinel
spring:cloud:sentinel:enabled: true# 开启对sentinel看板的饥饿式加载。sentinel默认是懒加载机制,只有访问过一次的资源才会被监控,通过关闭懒加载,在项目启动时就连接sentinel控制台eager: truelog:#日志输出地址dir: logs/sentinel transport:#跟控制台交流的端口port: 8719# sentinel看板的地址dashboard: localhost:8080
feign:sentinel:enabled: true
我们看到配置里面配置了:
feign:
sentinel:
enabled: true
我们让openfeign集成Sentinel熔断器,,所以同样通过@FeignClient也可以实现熔断降级。在熔断器Sentinel下@FeignClient的使用与熔断器resilience4并没有什么太大差别,同样可以实现服务降级,OpenFeign 本身只是一个声明式的 HTTP 客户端,它不包含熔断器的实现,它只提供了与熔断器集成的接口,所以可以注入不同的熔断器来实现@FeignClient的熔断降级
sentinel的使用就是一个@SentinelResource注解的使用
@SentinelResource的属性
- value:作用指定资源名称,必填
- entryType:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
- blockHandler:处理BlockException的函数名称,函数要求为
必须是public
返回类型与原方法一致
参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法- blockHandlerClass:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为:
必须是public
返回类型与原方法一致
参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数- fallback:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为:
返回类型与原方法一致
参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数
默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法- fallbackClass:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
- defaultFallback:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
返回类型与原方法一致
方法参数列表为空,或者有一个Throwable类型的参数
默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。- exceptionsToIgnore:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
- exceptionsToTrace:需要trace的异常
这边重点讲一下blockHandler和 fallback属性:
blockHandler:就是对我们手动在控制台添加的流空规则、熔断规则、热点规则、系统规则等的处理,只要超过了规则阈值就会执行blockHandler指定的的方法,如果指定的方法与@SentinelResource不在同一个类,blockHandlerClass需要指定blockHandler指定的方法的存放类,否则可省
fallback:就是被@SentinelResource注释的接口发生异常时会调用fallback指定的方法,fallbackClass就是存放fallback的类
简单实现使用一下@SentinelResource注解:
@RequestMapping("/hello")@SentinelResource(value = "hello",blockHandler = "getNameBlockHandler",fallback = "helloFallback")public String hello(){throw new RuntimeException("consumer error");}public static String helloFallback(String name, Throwable e){return "接口出错了,请稍后重试";}@RequestMapping("/get")@SentinelResource(value = "getName",blockHandler = "getNameBlockHandler")public String get(String name){return name;}public static String getNameBlockHandler(String name, BlockException e){return "服务繁忙,请稍后重试";}
添加一个流控规则:
通过Jmeter来进行压测(使用Jmeter自己看:jemter的安装与使用),让1秒内进行4次请求看一下结果: