1. 概念
1.1 是什么
Sentinel 通俗上将它就是Hystrix的升级web版本.通过可视化的方式,解决服务在在实践中遇到的各种问题 .
1.2 下载安装
下载地址
下载最新稳定版的jar文件,并启动.
window后台启动方式javaw -jar xxx.jar,cmd窗口启动java -jar xxx.jar,默认启动端口为8080,如果8080端口被占用,可以自定义启动端口java -jar xxx.jar --server.port=8888linux后台启动方式nohup java -jar xxx.jar >log.log &指定日志文件位置和后台挂起启动.
启动成功之后访问地址:http://ip:port 默认用户名密码为sentinel.
1.3 核心功能模块
- 服务雪崩
- 服务降级
- 服务熔断
- 服务限流
1.4 项目中使用
在服务配置文件中添加如下配置
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.10.120:8848 # 这里使用的是nacos注册中心,实际配置以自己项目的注册中心为准
sentinel:
transport:
dashboard: 192.168.101.120:8080 # 上面启动的地址
2. 实际中的应用和配置
2.1 面板专业术语说明
| 名称 | 介绍 | 值说明 |
|---|---|---|
| 资源名 | 独一无二 | 默认为请求路径 |
| 针对资源 | Sentinel可以针对调用者进行限流,填写服务名称 | 默认为default |
阈值类型 QPS | 每秒钟的请求数量 | 当调用改api的QPS达到阈值时,触发限流操作 |
| 阈值类型 线程数 | 当调用改api的请求线程数达到阈值是,触发限流操作 | |
| 流控模式 直接 | 当api达到限流条件,直接限流 | |
| 流控模式 关联 | 当关联的资源达到阈值是,直接限流 | |
| 流控模式 链路 | 当从某个接口过来的资源达到限流条件是,开启限流 | |
| 流控效果 快速失败 | 直接进行失败,抛出异常 | |
流控效果 Warm Up | 根据CodeFactor(冷加载因子,默认值为3)的值,从阈值/codeFactor,经过预热时长,才达到这是的QPS阈值 | |
| 流控效果 排队等待 | 均匀排队,让请求均匀的速度通过,阈值类型必须设定为QPS,否则无效 |
2.2 配置使用说明
2.2.1 阈值类型 QPS 流控模式直接
相关参数和方法说明
Sentinel提供了这样的功能,让我们可以另外定义一个方法来代替被限制或异常服务返回数据,这就是fallback和blockHandler
fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。blockHandler:sentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调blockHandler指定的接口。
- 测试的
service层
/**
* 阈值类型 QPS 流控模式直接
*/
String hello(String limit);
service实现层
@SentinelResource(value = "limit",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
@Override
public String hello(String limit) {
return "阈值类型 QPS 流控模式直接";
}
//自定义简单的 服务限流或者降级回调方法
public String defaultFallback(){
return "太拥挤了 ~ 请稍后重试 ";
}
public String handlerException(){
return "测试超出流量限制的部分是否会进入到blockHandler的方法。";
}
controller测试
@Autowired
private SentinelService sentinelService;
@GetMapping("/test1")
public String testA(){
return "this is testA -----------";
}
@GetMapping("/test2")
public String testB(){
return "this is testB -----------";
}
@GetMapping("/limit")
public String limit (){
return sentinelService.hello("测试QPS限流");
}
-
依次调用上面的三个测试接口,因为
Sentinel服务监控是懒加载的,只有当服务的接口被调用之后,才会被监控中心捕捉到,调用之后,在面板可以看到如下数据 -
对相关服务的接口进行流控配置 ,流控配置如下(当前接口在1s内次数超过3次,直接触发限流操作,进入失败的回调方法)
- 测试,在浏览器获取使用
postman快速点击接口http://localhost:8041/limit,当1s内超过三次,进去预先设置的回调方法,返回的参数为
2.2.2 阈值类型 线程数、流控模式 直接
service层
String threadTest(String thread);
service实现层
@SentinelResource(value = "thread",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
@Override
public String threadTest(String thread) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "阈值类型 线程数、流控模式 直接";
}
controller层
@GetMapping("/thread")
public String thread(){
return sentinelService.threadTest("线程测试");
}
-
使用
Apache jmeter进行多线程测试 创建5个线程,正常测试. 每个线程结果正常返回, 添加线程限制限流配置 -
设置线程阈值为4个,创建五个线程去调用接口,从返回结果可以看出,前面四个线程返回结果正常,有一个线程返回的是被限制的结果
2.2.3 阈值类型 QPS、流控模式 关联
- 基于上面的
test1和test2接口不变,将这两个接口建立关联关系. - 模拟场景: 支付接口和订单接口,放支付接口进入阈值的时候,会限制订单接口的产生.缓解服务的压力.具体的流程如下
- 测试接口,单独快速、慢速的测试
test1和test2接口,返回结果都是正常 - 使用
postman和Jmeter测试两个接口,创建多个线程跑test2的同时使用postman调用test1,触发限流,返回异常日志.当test2结束限流之后,test1接口才会正常返回
2.2.4 流控效果
-
快速失败
直接失败,进入异常处理,或者进入指定的回调,不做其它的额外处理.
-
Warm Up 从开始到最大的阈值,会进入一个缓冲阶段,一开始的阈值是最大阈值的1/3,然后缓慢增大,直到最大的阈值,适用于与突然增大的流量转变成缓慢增大,避免突然出现的大流量造成服务器的宕机。
说明: 比如设置阈值为10,最初的请求最大允许阈值为10/3=3个,当再次出现大量的请求,自动会在5s内将阈值自动从3提升至10个
- 排队等待
设置阈值类型为QPS 单机阈值为2个,流控效果为排队等待。实现的效果为当1s内,当前接口的请求次数超过2个,那么剩下的不会直接进去异常,进入排队,等待前面的接口调用完成之后才会继续调用后面的接口,也可以设置超时时间,如果超过当前时间还没调用完,后面的接口直接会被丢弃进入异常
使用JMeter创建10个线程测试接口,线程间隔时间为0.4s,超时时间设置2000ms,会发现只有一小部分被限流,其它的请求都会缓慢执行.