拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 阿里巴巴Sentinel简介

阿里巴巴Sentinel简介

白鹭 - 2021-11-24 694 0 0

1.概述

顾名思义, Sentinel是微服务的强大后卫。它提供了流量控制,并发限制,电路中断和自适应系统保护等功能,以确保其可靠性。这是阿里巴巴集团积极维护的开源组件。此外,它正式是Spring Cloud Circuit Breaker的一部分。

在本教程中,我们将了解Sentinel的一些主要功能。此外,我们将看到一个有关如何使用它,其注释支持以及其监视仪表板的示例。

2.特点

2.1 流量控制

Sentinel控制随机传入请求的速度,以避免微服务过载。这样可以确保我们的服务不会因流量激增而中断。它支持多种流量调整策略。当每秒查询数(QPS)太高时,这些策略会自动将流量调整为适当的形状。

这些流量整形策略包括:

  • 直接拒绝模式–当每秒请求数超过设置的阈值时,它将自动拒绝其他请求
  • 慢启动热身模式-如果流量突然激增,此模式可确保请求计数持续递增,直到达到上限

2.2 断路和降级

当一个服务同步调用另一个服务时,另一种服务可能由于某种原因而关闭。在这种情况下,线程将被阻塞,因为它们继续等待其他服务做出响应。这可能导致资源耗尽,并且呼叫者服务也将无法处理其他请求。这被称为级联效应,它可能会破坏我们的整个微服务体系结构

为防止此类情况,断路器进入了图片。它将立即阻止对其他服务的所有后续调用。超时时间过后,一些请求将通过。如果它们成功,则断路器将恢复正常流量。否则,超时时间将再次开始。

Sentinel使用最大并发限制的原理来实现断路。通过限制并发线程数,它减少了不稳定资源的影响。

Sentinel还会降级不稳定的资源。当资源的响应时间过长时,将在指定的时间窗口中拒绝对资源的所有调用。这样可以防止呼叫变得非常慢的情况,从而导致级联效果。

2.3 自适应系统保护

如果系统负载过高,Sentinel可以保护我们的服务器。它使用load1 (系统负载)作为度量标准来启动流量控制。在以下情况下,该请求将被阻止:

  • 当前系统负载( load1 )>阈值( highestSystemLoad );
  • 当前并发请求(线程数)>估计容量(最小响应时间*最大QPS)

3.使用方法

3.1 添加Maven依赖

在我们的Maven项目中,我们需要pom.xml sentinel-core依赖项:

<dependency>

 <groupId>com.alibaba.csp</groupId>

 <artifactId>sentinel-core</artifactId>

 <version>1.8.0</version>

 </dependency>

3.2 定义资源

让我们使用Sentinel API try-catch块中用相应的业务逻辑定义资源:

try (Entry entry = SphU.entry("HelloWorld")) {

 // Our business logic here.

 System.out.println("hello world");

 } catch (BlockException e) {

 // Handle rejected request.

 }

try-catch块用作Sentinel保护的业务逻辑的入口点。

3.3 定义流控制规则

这些规则控制着流向我们资源的流量,例如阈值计数或控制行为,例如,直接拒绝或启动缓慢。让我们使用FlowRuleManager.loadRules()来配置流规则:

List<FlowRule> flowRules = new ArrayList<>();

 FlowRule flowRule = new FlowRule();

 flowRule.setResource(RESOURCE_NAME);

 flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);

 flowRule.setCount(1);

 flowRules.add(flowRule);

 FlowRuleManager.loadRules(flowRules);

此规则定义我们的资源“ RESOURCE_NAME”每秒最多可以响应一个请求。

3.4 定义降级规则

使用降级规则,我们可以配置断路器的阈值请求计数,恢复超时和其他设置。
让我们使用DegradeRuleManager.loadRules()配置降级规则:

List<DegradeRule> rules = new ArrayList<DegradeRule>();

 DegradeRule rule = new DegradeRule();

 rule.setResource(RESOURCE_NAME);

 rule.setCount(10);

 rule.setTimeWindow(10);

 rules.add(rule);

 DegradeRuleManager.loadRules(rules);

此规则指定当我们的资源RESOURCE_NAME无法满足10个请求(阈值计数)时,电路将断开。 Sentinel将阻止对该资源的所有后续请求10秒钟(时间窗口)。

3.5。定义系统保护规则

使用系统保护规则,我们可以配置并确保自适应系统保护( load1阈值,平均响应时间,并发线程数)。让我们使用SystemRuleManager.loadRules()方法配置系统规则:

List<SystemRule> rules = new ArrayList<>();

 SystemRule rule = new SystemRule();

 rule.setHighestSystemLoad(10);

 rules.add(rule);

 SystemRuleManager.loadRules(rules);

该规则指定,对于我们的系统,最高的系统负载是每秒10个请求。如果当前负载超过此阈值,则所有其他请求都将被阻止。

4.注释支持

Sentinel还提供了面向方面的注释支持,用于定义资源

首先,我们将为sentinel-annotation-aspectj添加Maven依赖项:

<dependency>

 <groupId>com.alibaba.csp</groupId>

 <artifactId>sentinel-annotation-aspectj</artifactId>

 <version>1.8.0</version>

 </dependency>

然后,将@Configuration添加到我们的配置类中,以将前哨方面注册为Spring bean:

@Configuration

 public class SentinelAspectConfiguration {



 @Bean

 public SentinelResourceAspect sentinelResourceAspect() {

 return new SentinelResourceAspect();

 }

 }

@SentinelResource指示资源定义。它具有类似于value属性,该属性定义了资源名称。属性fallback是fallback方法名称。当电路断开时,这种后备方法定义了我们程序的替代流程。让我们使用@SentinelResource批注定义资源:

@SentinelResource(value = "resource_name", fallback = "doFallback")

 public String doSomething(long i) {

 return "Hello " + i;

 }



 public String doFallback(long i, Throwable t) {

 // Return fallback value.

 return "fallback";

 }

这定义了名称为resource_name以及后备方法。

5.监控仪表板

Sentinel还提供了一个监视仪表板。这样,我们可以监视客户端并动态配置规则。我们可以实时查看到我们定义的资源的传入流量。

5.1 启动仪表板

首先,我们需要下载Sentinel Dashboard jar 。然后,我们可以使用以下命令启动仪表板:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

仪表板应用程序启动后,我们可以按照下一部分中的步骤连接我们的应用程序。

5.2 准备我们的依赖项

让我们在我们的pom.xml sentinel-transport-simple-http依赖项:

<dependency>

 <groupId>com.alibaba.csp</groupId>

 <artifactId>sentinel-transport-simple-http</artifactId>

 <version>1.8.0</version>

 </dependency>

5.3 将我们的应用程序连接到仪表板

启动应用程序时,我们需要添加仪表板IP地址:

-Dcsp.sentinel.dashboard.server=consoleIp:port

现在,无论何时调用资源,仪表板都会从我们的应用程序接收到心跳信号:

阿里巴巴前哨简介

我们还可以使用仪表板动态地控制流程,降级和系统规则。

六,结论

在本文中,我们了解了阿里巴巴Sentinel流量控制,断路器和自适应系统保护的主要功能。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *