继续学习SpringCloud Alibaba的Sentinel,主要是跟着周阳老师的视频资料学习。首先启动nacos服务。
Sentinel实际和Hystrix的作用一样,实现服务降级、熔断等。但是Hystrix的不足之处大概有:
1.需要程序员手工搭建监控平台;
2.没有一套web界面可以给我们进行细粒度化的配置。
Sentinel也是实现流量控制、速率控制、服务熔断、服务降级。Sentinel有的优点如下:
1.单独的组件,可以独立出来。
2.直接界面化的细粒度统一配置。
启动sentinel-dashboard-1.8.3.jar服务。找到sentinel-dashboard-1.8.3.jar文件目录,然后在它目录下通过cmd窗口执行jar包。
java -jar sentinel-dashboard-1.8.3.jar
访问sentinel控制台
http://localhost:8080/#/dashboard/home
pom.xml
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
application.yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery: #Nacos注册中心地址
server-addr: localhost:8848
sentinel:
transport: #dashboard地址
dashboard: localhost:8080
port: 8719 #默认端口,如果被占用则从8719依次+1扫描
datasource:
dsl:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data_type: json
rule-type: flow
management:
endpoints:
web:
exposure:
include: "*"
MainApp8401
@SpringBootApplication
@EnableDiscoveryClient
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
FlowLimitController
@RestController
@Slf4j
public class FlowLimitController {
@GetMapping("/testA")
public String testA(){
try {
TimeUnit.MILLISECONDS.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "---------testA";
}
@GetMapping("/testB")
public String testB(){
return "----------testB";
}
@GetMapping("/testD")
public String testD(){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
// log.info("testD 测试RT");
log.info("testD 异常比例");
int age = 10/0;
return "------testD";
}
@GetMapping("/testE")
public String testE(){
log.info("testD 测试异常数");
int age = 10/0;
return "------testD 测试异常数";
}
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2", required = false) String p2) {
return "-------testHotKey";
}
public String deal_testHotKey(String p1, String p2,
BlockException exception){
return "----deal_testHotKey,o(╥﹏╥)o";
}
}
多次访问http://localhost:8401/testA,会报错
超过阈值限制,自定义fallback消息或者默认反馈内容。这里设置流控模式为关联。
当关联资源/testB的QPS阈值超过1时,就限流/testA的Rest访问地址。当关联资源到阈值后,限制配置好的资源名,即B惹事,A挂了。
利用jmeter模拟并发访问testB场景,并发启动一万个线程,隔0.1秒内全部开启。
jmeter启动后,访问http://localhost:8401/testA,显示关联流控场景效果即"快速失败"。
默认coldFactor为3,即请求的QPS从(threadhold/3)开始,经过多少预热时长才逐渐升至设定的QPS阈值。
案例:设置阈值10,预热时长设置5,则系统初始化的阈值10/3约等于3,即阈值刚开始为3,然后过了5秒后阈值才慢慢升高到10。
刚开始点击3秒内,快速访问http://localhost:8401/testB报错
经过5秒钟后,同样的访问频率恢复正常
代码调整
@GetMapping("/testB")
public String testB(){
log.info(Thread.currentThread().getName()+"\t ..testB..");
return "----------testB";
}
jmeter调整,设置10个线程,0.1秒间隔执行
启动jmeter,测试发现排队等待执行,一秒执行一个任务
即选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
controller层代码调整
@GetMapping("/testD")
public String testD(){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD 测试慢调用比例RT");
// log.info("testD 异常比例");
// int age = 10/0;
return "------testD";
}
jmeter未启动前,访问http://localhost:8401/testD一切正常。
启动jmeter,jmeter 以每秒钟10次请求访问,再次访问http://localhost:8401/testD结果显示异常。
因为jmeter每秒钟10次请求大于最小值5;每个请求处理时长超过200ms,满足第二个条件,因此触发降级。停止jmeter后,一切访问又恢复正常了!
当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
测试controller层代码,testE()方法。
配置熔断策略为异常比例。配置参数解释:
1》每秒钟请求超过五个
2》异常比例超过50%触发熔断
jmeter每秒钟十个访问,访问http://localhost:8401/testE,发现已经触发服务降级。
停掉jmeter再次访问http://localhost:8401/testE,直接爆程序错误。也就是没触发sentinel熔断。
参考文章
Sentinel服务限流、降级、热点规则