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=8888
linux
后台启动方式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
接口才会正常返回