Sentinel 对这个问题采取了两种手段:
(1)通过并发线程数进行限制
和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
(2)针对慢调用和异常对资源进行降级
除了对并发线程数进行控制以外,Sentinel 还可以根据响应时间和异常等不稳定因素来快速对不稳定的调用进行熔断。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新渐进式地恢复。
Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
Sentinel 的主要工作机制如下:
对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。
六、SpringBoot整合sentinel
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
0.2.1.RELEASE
@PostConstruct
public void initFlowRules(){
//1.创建存放限流规则的集合
List rules = new ArrayList<>();
//2.创建限流规则
FlowRule rule = new FlowRule();
//定义资源,表示sentinel会对这个资源生效
rule.setResource("helloSentinel");
//定义限流规则类型
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//定义QPS每秒能通过的请求个数
rule.setCount(2);
//3.将限流规则放入集合中
rules.add(rule);
//4.加载限流规则
FlowRuleManager.loadRules(rules);
}
@GetMapping("/helloSentinel")
public String hello(){
try{
Entry entry = SphU.entry("helloSentinel");
return "helloSentinel success.";
}catch (Exception e){
log.error(e.getMessage());
return "helloSentinel error";
}
}
### 3、测试
(1)频率小于1秒两次时,访问成功

(2)频率大于1秒两次时,由于限流规则的设立,故失败

七、springboot整合sentinel dashboard
--------------------------------
### 1、安装sentinel dashboard
(1)下载jar包
sentinel-1.7.1jar包下载链接
链接:https://pan.baidu.com/s/1reC7C4sOb4eu2\_O3BPBcKg
提取码:11gm
(2)启动jar包
java -Dserver.port=9000 -jar sentinel-dashboard.jar

### 2、springboot整合sentinel dashboard
(1)引入pom
com.alibaba.csp
sentinel-transport-simple-http
1.7.2
(2)配置启动类
\-Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=GooReeyProject

(3)通过调用接口,使其在dashboard显示出来

### 3、用sentinel dashboard配置流控
(1)注释掉代码中的流控设置代码
(2)用控制台的配置取代代码

八、sentinel中其它定义资源的方式
--------------------
### [](https://gitee.com/vip204888/java-p7)1、抛出异常的方式定义资源
@GetMapping("/helloSentinel")
public String hello(){
try{
Entry entry = SphU.entry("helloSentinel");
return "helloSentinel success.";
}catch (Exception e){
log.error(e.getMessage());
return "helloSentinel error";
}
}
### 2、返回布尔值方式定义资源
代码示例:
@GetMapping("/sentinelBoolean")
public boolean sentinelBoolean(){
if(SphO.entry("sentinelBoolean")){
try {
log.info("sentinelBoolean success.");
return true;
}finally {
SphO.exit();
}
}else{
log.warn("sentinelBoolean error.");
return false;
}
}

### 3、sentinel支持异步调用链路的统计
在异步调用中,需要通过SphU.asynvEntry(xxx)方法定义资源,并通常需要在异步的回调函数中调用exit()方法。
代码编写:
启动类加入@EnableAsync注解
@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = “com.guor”)
@MapperScan(“com.guor.management.dao”)
@RefreshScope
@EnableAsync
public class ManagementApplication {
public static void main(String[] args) {
SpringApplication.run(ManagementApplication.class, args);
}
}
业务层
@Async
@Override
大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。
需要免费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!
public static void main(String[] args) {
SpringApplication.run(ManagementApplication.class, args);
}
}
业务层
@Async
@Override
大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。
需要免费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!