【Spring Cloud 10】阿里巴巴分布式服务架构流量控件Sentinel,廖师兄springcloud视频

除了流量控制以外,及时对调用链路中的不稳定因素进行熔断也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。

Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

Hystrix源自Netflix API团队于2011年开始的弹性工程工作。2012年Hystrix不断发展和成熟,Netflix内的许多团队都采用了它。如今,每天在Netflix执行数以千亿计的线程隔离和数以千计的信号隔离调用,这大大的提高了运行时间和弹性。

4、熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

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 Java开源项目【ali1024.coding.net/public/P7/Java/git】 、安装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)用控制台的配置取代代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vSDEjCT9-1650621263662)(https://img-blog.csdn 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 img.cn/20210524230311977.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70)]

八、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

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

【Spring Cloud 10】阿里巴巴分布式服务架构流量控件Sentinel,廖师兄springcloud视频_第1张图片

步的回调函数中调用exit()方法。

代码编写:

启动类加入@EnableAsync注解

@EnableDiscoveryClient

@SpringBootApplication(scanBasePackages = “com.guor”)

@MapperScan(“com.guor.management.dao”)

@RefreshScope

@EnableAsync

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

[外链图片转存中…(img-p2wpYWWK-1650621263662)]

你可能感兴趣的:(Java,经验分享,面试,java)