Hystrix 通过线程池隔离的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配,并且对于一些使用了 ThreadLocal 的场景来说会有问题(如 Spring 事务)。

Sentinel 对这个问题采取了两种手段:

(1)通过并发线程数进行限制

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。

(2)针对慢调用和异常对资源进行降级

除了对并发线程数进行控制以外,Sentinel 还可以根据响应时间和异常等不稳定因素来快速对不稳定的调用进行熔断。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新渐进式地恢复。

5、系统自适应保护

Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

6、Sentinel 是如何工作的

Sentinel 的主要工作机制如下:

对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。

根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。

Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

7、竞品对比

六、SpringBoot整合sentinel


1、加入pom

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-config

0.2.1.RELEASE

2、编写sentinel规则

@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中其它定义资源的方式


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

public void sentinelAsync() {

log.info(“异步开始…”);

try {

Thread.sleep(5000);

}catch (InterruptedException e){

log.error(e.getMessage());

}

log.info(“异步完成…”);

}

控制层

@GetMapping(“/sentinelAsync”)

public void sentinelAsync(){

AsyncEntry asyncEntry = null;

try {

asyncEntry = SphU.asyncEntry(“sentinelAsync”);

userService.sentinelAsync();

log.info(“sentinelAsync success.”);

}catch (BlockException e){

log.error(“sentinelAsync error.”);

}finally {

if(asyncEntry != null){

asyncEntry.exit();

}

}

}

sentinel dashboard未定义时:

sentinel dashboard定义后:流控成功!

4、注解形式定义资源

(1)pom文件

com.alibaba.csp

sentinel-annotation-aspectj

1.7.2

(2)配置类

package com.guor.management.config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;

@Configuration

public class SentinelAspectConfig {

@Bean

public SentinelResourceAspect sentinelResourceAspect(){

return new SentinelResourceAspect();

}

}

(3)控制类

@SentinelResource(value = “sentinel_Annotation”, blockHandler = “exceptionHandler”)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

结尾

查漏补缺:Java岗 千+道面试题Java基础+全家桶+容器+反射+异常等

这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
取)**

img

结尾

[外链图片转存中…(img-TFhIOD6D-1713540579635)]

这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

GitHub 加速计划 / sentine / Sentinel
22.25 K
7.98 K
下载
alibaba/Sentinel: Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件,提供实时监控、限流、降级和系统保护功能,适用于微服务治理场景。
最近提交(Master分支:3 个月前 )
195150bc * fix issue 2485 which occur oom when using async servlet request. * optimize imports * 1. fix the same issue in the webmvc-v6x 2. improve based on review comments 3 个月前
b78b09d3 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐