前言:引用官网的截图来对Sentinel有个说明
以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到保护系统的目的,通过服务降级增强服务被拒后用户的体验。
Dashboard
Sentinel 有一个Dashboard控制台,可以方便的看到我们设置的降级和流控规则,也能动态的添加修改规则,很是方便,为了后面方便讲解Sentinel,我们先把这个东西安装并用起来。
下载上传服务器并运行
可以去官网下载jar包,然后执行命令运行,指定host、port 还有用户名密码,不指定的话默认都是sentinel。
java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=xxx.xxx.xxx.xxx:8888 \
-Dproject.name=sentinel-dashboard \
-Dsentinel.dashboard.auth.username=sentinel \
-Dsentinel.dashboard.auth.password=111 -jar sentinel-dashboard-1.8.0.jar \
打开webUI如下,这里可以直接通过控制台来设定各种流控规则。
代码中的配置
注释里说的很清楚
spring:
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: xxx.xxx.xxx.xxx:8848
sentinel:
transport:
# 会在对应的服务机器上启动一个HttpServer,该Server会与Sentinel控制台做交互
# 比如Sentinel控制台添加了一个限流规则,会把该规则push给这个HttpServer接收。HttpServer再将规则注册到Sentinel中
port: 8719
dashboard: xxx.xxx.xxx.xxx:8888
# 能够使Sentinel控制台主动发现服务
eager: true
这里的测试环境是:一个提供者,一个消费者,dubbo调用,nacos注册中心和配置中心。
启动两个服务后,能在Sentinel Dashboard 上看到我们的服务。
服务降级
Sentinel的服务降级有三种,方法级别的降级、类级别的降级、Feign式类级别的降级
-
方法级别的降级
// 该注解表示当前方法是由Sentinel管理的资源,value属性用于指定该资源的名称 @SentinelResource(value = "getByIdHandler", fallback = "getDepartFallback") @GetMapping("/get/{id}") public Depart getByIdHandler(@PathVariable("id") int id) { return service.getDepartById(id); } // 降级的方法,参数和返回值要和原方法一样 public Depart getDepartFallback(int id) { Depart depart = new Depart(); depart.setId(id); depart.setName("method-degrade-" + id); return depart; }
-
类级别的降级
降级类,可以加个 Throwable 参数查看具体的异常// Sentinel 降级类 public class DepartServiceFallback { // 降级的方法,参数和返回值要和原方法一样 public static Depart getDepartFallback(int id, Throwable e) { Depart depart = new Depart(); depart.setId(id); depart.setName("method-degrade-" + id + "-" + e); return depart; } }
指定降级类和降级的方法
// 该注解表示当前方法是由Sentinel管理的资源,value属性用于指定该资源的名称 @SentinelResource(value = "getByIdHandler", fallback = "getDepartFallback", fallbackClass = DepartServiceFallback.class) @GetMapping("/get/{id}") public Depart getByIdHandler(@PathVariable("id") int id) { return service.getDepartById(id); }
-
Feign式类级别的降级
主要是针对通过feign的调用,这里不贴代码了,注意要添加配置 feign.sentinel.enabled=true;然后定义一个降级类实现接口,重写方法,这个重写的方法就是降级方法;然后在@FeignClient 中指定降级类即可。
服务熔断
在指定了资源名之后,就是 @SentinelResource 注解中 value 属性的值,我们可以通过在控制台指定熔断的规则,也可以通过代码的方式指定。
熔断策略
-
慢调用比例
最大RT:就是请求的响应时间超过该设定的阈值则将该请求统计为慢调用请求。
最小请求数:如果要发生熔断,则在1秒内的请求数要大于该设定的值。
比例 阈值:慢调用请求的比例要大于该设置的阈值。
熔断时长:满足上述三个条件的情况下,触发了熔断,熔断的时长,在熔断期间再来的请求则直接走降级。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 -
异常比例
最小请求数:如果要发生熔断,则在1秒内的请求数要大于该设定的值。
比例阈值:异常请求的比例大于该设定的阈值,范围是[0.0,1.0],也就是0%到100%。
熔断时长:满足上述两个条件的情况下,触发了熔断,熔断的时长,在熔断期间再来的请求则直接走降级。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。 -
异常数
解释同上
通过代码设置熔断策略
/**
* Sentinel通过代码的方式设置熔断降级规则
* 1、慢调用比例 2、异常比例 3、异常数
*/
public class DegradeRuleConfig {
public static void initRule() {
List<DegradeRule> rules = Lists.newArrayList();
// DegradeRule的集合,可以指定多个规则
rules.add(slowRequestDegradeRule());
DegradeRuleManager.loadRules(rules);
}
// 设置 慢调用比例 降级规则
private static DegradeRule slowRequestDegradeRule() {
DegradeRule rule = new DegradeRule();
// 设置该规则要应用的资源名称
rule.setResource("getByIdHandler");
// 设置降级规则类型为 RT
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
// 设置阈值:RT时间,单位毫秒
rule.setCount(