一.概述
sentinel提供了限流的功能,本章节讲解如何使用sentinel对我们开发的接口进行限流.
二.sentinel限流
1.server-user服务,加入了spring.cloud.sentinel和management的相关配置.
(1)management.endpoints.web.exposure.include这个配置属于springboot Actuator,众所周知,这个包的主要作用是服务健康监控,提供了大量的接口,很多监控服务的组件比如nacos都是以调用这个包提供的一些接口实现的,该配置的作用允许sentinel调用springboot Actuator提供的一些接口,做到完善的监控功能.
(2)spring.cloud.sentinel相关配置已经在代码的注释中给出.
server:
port: 1001 #服务端口
spring:
application:
name: server-user #服务名称
cloud:
nacos:
discovery:
server-addr: 47.96.131.185:8848
config:
server-addr: 47.96.131.185:8848 #nacos config配置中心ip和端口
file-extension: yaml #文件扩展名格式,针对于默认的{spring.application.name}-${profile}.${file-extension:properties}配置
enabled: true #开启或关闭配置中心
shared-dataids: mysql-user.yaml #自定义的配置文件dataid,以逗号分隔
refreshable-dataids: mysql-user.yaml #自定义的配置文件dataid实现自动刷新,以逗号分隔(其实就是热加载配置文件)
sentinel:
transport:
dashboard: 47.96.131.185:8080 #sentinel服务端的地址
eager: true #取消控制台懒加载
management:
endpoints:
web:
exposure:
include: '*'
ribbon:
#对所有操作请求都进行重试,默认false(false=只有get请求才会进行重试)
OkToRetryOnAllOperations: false
#负载均衡超时时间,默认值5000
ReadTimeout: 4000
#ribbon请求连接的超时时间,默认值2000
ConnectTimeout: 1
#对当前实例的重试次数,默认0
MaxAutoRetries: 0
#对切换实例的重试次数,默认1
MaxAutoRetriesNextServer: 0
2.启动server-user服务,查看sentinel控制台.
可以看到sentinel已经监控到了server-user服务.
3.编写测试代码,查看sentinel的实时监控.
package com.ccm.server.user.controller;
import com.ccm.common.exception.result.ResultSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description sentinel限流测试控制层
* @Author zhouzhiwu
* @CreateTime 2020/07/28 15:17
*/
@RestController
@RequestMapping(value = "sentinelCurrentlimitingTest")
@Api(tags = "sentinel限流测试控制层")
public class SentinelCurrentlimitingTestController {
@ApiOperation(value = "限流测试")
@GetMapping(value = "test01")
public ResultSet test01() {
return ResultSet.success("笑脸");
}
}
可以看到我们访问接口,实时监控tab会有记录.
3.sentinel流量控制规则.
从弹出框,我们可以看到几个名词和两种类型的配置.
(1).名词解释
a.针对来源:
可以针对调用者进行限流,填写微服务名,默认default(不区分来源).
b.资源名称:
唯一名称,默认请求路径.
c.阈值类型:
qps: 当调用该api的qps达到阈值的时候,进行限流.
线程数: 当调用该api的线程数达到阈值的时候,进行限流.
d.是否集群:
意入其名.
e.流控模式:
直接:
当api达到限流条件时直接限流
关联:
当关联资源达到限流条件时限流自己
链路:
当请求链路上的流量达到阈值,就进行限流:
e.流控效果:
快速失败:
直接失败,抛出异常
warm up:(预热/冷启动的方式,当系统长期处于低水位的情况下),当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮.通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮.
排队等候:
均匀排队,阈值类型必须设置qps,否则无效
4.为接口添加流控规则.
5.使用jmeter进行压力测试.
一秒钟20个请求.
填写请求路径和参数.
请求后的结果树,可以看到20个请求中有部分请求失败,响应数据为Blocked by Sentinel (flow limiting),证明我们的流量控制规则生效.
至此,完事!