Sentinel-服务流控降级配置

记录一次配置 Sentinel 的过程,以及遇到的一些问题

Sentinel

Sentinel 是一个面向云原生微服务的高可用流控防护组件,作用跟 Hystrix 类似. 具体介绍可以看 Github

可视化界面

可视化界面的安装,先去 github 的 release 里面,选一个版本, 下载一个 jar 如下;

image

之后直接启动这个jar就可以了

1
java -Dserver.port=8080 -Dscp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.2.jar

访问 localhost:8080 ,默认的账号密码都是 sentinel ,登录进去

image

默认是一个空的,没有应用的,到这儿可视化界面就安装成功了

Spring Boot 配置使用

依赖引入

Sentinel 要具体配置在每一个微服务上, 首先需要引入 Sentinel 的 starter 依赖

1
2
3
4
5
6
<!-- 阿里哨兵 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>

配置修改

在 application 配置文件中,要做一些 sentinel 相关的配置,如下:

1
2
3
4
5
6
7
8
9
10
spring:
application:
name: orderApi
cloud:
sentinel:
transport:
# sentinel 会再启动一个端口,去和dashboard去通讯
port: 8719
# sentinel 控制台地址
dashboard: localhost:8080

流控使用

资源声明

以流控为例, 首先要声明资源, Spring Boot 中,使用注解的方式就可以,如下:

1
2
3
4
5
@PostMapping
@SentinelResource(value = "createOrder")
public OrderInfo createOrder(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) {
return null
}

使用 @SentinelResource 这个注解声明一个资源,里面的 value 值就是资源名称

配置使用

声明好资源之后,还要对这个资源设置一些规则,比如每秒最多多少QPS,代码如下:

1
2
3
4
5
6
7
8
9
// 设置流控规则
val flowRule = FlowRule()
flowRule.resource = "createOrder"
flowRule.grade = RuleConstant.FLOW_GRADE_QPS
flowRule.count = 10.0

val rules = listOf(flowRule)
// 加载规则
FlowRuleManager.loadRules(rules)

上面代码是 kotlin 的, 步骤如下:

  1. 创建一个 FlowRule 对象
  2. 然后设置一些规则,比如 resource 就是我们定义的资源名, 然后 grade 是一个限流的策略, count 就是请求的数量
  3. 声明一个集合把 FlowRule 放到集合中去
  4. 最后调用 FlowRuleManager.loadRules() 这个方法,让规则加载到系统中

这段代码要在 Spring Boot 项目启动后执行,至于使用启动器还是别的方式可以自己选,总之配置的代码要在启动后执行一次

执行完成后,规则就生效了,按照上面的配置QPS到10的时候服务就限流了

服务降级

方法声明

服务降级配置跟流控类似的,第一步还是在注解上面配置,注解如下:

1
@SentinelResource(value = "createOrder",blockHandler = "createOrderOnBlock")

多配置了一个属性 blockHandler 值是 createOrderOnBlock, createOrderOnBlock 是降级处理的方法名,默认是在当前类的,如下:

1
2
3
4
5
public OrderInfo createOrderOnBlock(@RequestBody OrderInfo info, @AuthenticationPrincipal String username, BlockException ex) {
log.info("createOrder 服务已降级:{}", ex.getClass().getSimpleName());
info.setProductId(99L);
return info;
}

参数返回值和资源声明的方法都是一样的, 多了一个 BlockException ,服务熔断之后就会走这个降级的方法

配置使用

跟流控一样的,降级也是要在代码中做一些配置的,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 设置降级规则
val degradeRule = DegradeRule()
degradeRule.resource = "createOrder"
// 定义规则 , 每秒请求数 >= 5 的时候才会生效
// DEGRADE_GRADE_RT: 服务响应时间 (秒)
// DEGRADE_GRADE_EXCEPTION_RATIO: 在一定时间内异常的比例 值是 0-1 (秒)
// DEGRADE_GRADE_EXCEPTION_COUNT: 精确的值,在一定时间(时间窗口是1分钟)内错了几个之后熔断
degradeRule.grade = RuleConstant.DEGRADE_GRADE_RT
// 时间是毫秒,表示服务响应时间> 10ms 后会熔断
degradeRule.count = 10.0
// 熔断的持续时间,单位是秒
degradeRule.timeWindow = 10
val degradeRules = listOf(degradeRule)

DegradeRuleManager.loadRules(degradeRules)
  1. 声明一个 DegradeRule 对象
  2. 设置资源名,还有降级规则,熔断的持续时间等等(代码注释中都标明了)
  3. 之后放到一个 list 中
  4. 调用 DegradeRuleManager.loadRules() 方法加载到系统中

服务降级默认是在 QPS 大于等于5的时候才会生效, 同样的这段代码也是要在系统启动之后执行.

关于限流和降级的配置先记录到这里