一、Sentinel简介
Why
保护系统
WHAT
分布式系统的流量防卫兵:它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
HOW
1.启动,pom,配置
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8180 # 指定sentinel控制台地址。
2.限流
小节面试分析
- Sentinel是什么?(阿里推出一个流量控制平台,防卫兵)
- 类似Sentinel的产品你知道有什么?(hystrix-一代微服务产品)
- Sentinel是如何对请求进行限流的?(基于sentinel依赖提供的拦截器)
- 你了解哪些限流算法?(计数器、令牌桶、漏斗算法,滑动窗口算法,…)
- Sentinel 默认的限流算法是什么?(滑动窗口算法)
https://blog.csdn.net/lm278858445/article/details/88189212?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164112211716781685348538%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164112211716781685348538&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~baidu_landing_v2~default-1-88189212.nonecase&utm_term=%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E7%AE%97&spm=1018.2226.3001.4450
限流的分类:
1.直接限流(如上图)
2.关联限流(A访问多了限流B)
3.链路限流
1.定义:链路模式只记录指定链路入口的流量
2.方式:
第一步:在指定包创建一个ResourceService类,代码如下:
package com.jt.provider.service;
@Service
public class ResourceService{
@SentinelResource("doGetResource")
public String doGetResource(){
return "doGetResource";
}
}
这个是一个面向切面编程(AOP)
第二步:在ProviderSentinelController中添加一个方法,例如:
@Autowired
private ResourceService resourceService;
@GetMapping("/sentinel03")
public String doSentinel03() throws InterruptedException {
resourceService.doGetResource();
return "sentinel 03 test";
}
第三步:在sentinel中配置限流规则,例如:
3.注意:
说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在application.yml添加如下语句来关闭URL PATH聚合,例如:
sentinel:
web-context-unify: false
这样就可以一次搞两个以上的方法了
4.异常进行自定义处理
1.自定义一个异常类
package com.jt.provider.service;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class ResourceBlockHandler {
public static String call(BlockException ex){
log.error("block exception {}", ex.getMessage());
return "访问太频繁了,稍等片刻再访问";
}
}
* 注意此方法中的异常类型必须为BlockException它是所有限流,降级等异常的父类类型)
* 方法的返回值类型为@SentinelResource注解描述的返回值类型
* 方法的其他参数为@SentinelResource注解描述的方法参数,
* 并且此方法必须为静态方法
第二步:修改@SentinelResource注解中的属性定义,例如:
@SentinelResource(value="doGetResource",
blockHandlerClass = ResourceBlockHandler.class,
blockHandler = "call")
public String doGetResource(){
return "do get resource";
}
第三步:演示
/**
* 演示链路限流
* @return
*/
@GetMapping("/sentinel03")
public String doSentinel03(){
return resourceService.doGetResource();
}
小节面试分析
- 你了解sentinel中的阈值应用类型吗?(两种-QPS,线程数)
- Sentinel的限流规则中默认有哪些限流模式?(直连,关联,链路)
- Sentinel的限流效果有哪些?(快速失败,预热,排队)相关介绍https://blog.csdn.net/no_1back_up/article/details/109747956?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164112255616780357249607%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164112255616780357249607&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-1-109747956.nonecase&utm_term=sentinel%E7%9A%84warmup&spm=1018.2226.3001.4450
常见问题分析
- 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)
- 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
- Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
- @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)
- Sentinel常用限流效果有哪些?(快速失败,预热,排队)
- Sentinel中限流被触发时出现的异常类型是什么?(都是BlockException类型的子类)
- 如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)
- Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)