Spring Cloud Alibaba生态之Sentinel

2023-05-24 17:30:15 浏览数 (2)

上一篇知道了Springcloud Alibaba是什么以及Nacos知识点。

这篇继续总结Spring Cloud Alibaba生态中的Sentinel,它是微服务的哨兵。

哨兵以“流量”为切入点,在多个领域发力,包括流量控制,流量整形, 并发限制,断路 和系统自适应过载保护, 以保证微服务的可靠性和弹性。

Sentinel

Sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard

核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。

使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

先把可能需要保护的资源定义好,之后再配置规则。

使用方式

使用方式,引入对应的依赖即可方便地整合 Sentinel.

Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。

Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。

重要属性:

Field

说明

默认值

resource

资源名,资源名是限流规则的作用对象

count

限流阈值

grade

限流阈值类型,QPS 或线程数模式

QPS 模式

limitApp

流控针对的调用来源

default,代表不区分调用来源

strategy

调用关系限流策略:直接、链路、关联

根据资源本身(直接)

controlBehavior

流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流

直接拒绝

通过代码定义流量控制规则

理解上面规则的定义之后,我们可以通过调用 FlowRuleManager.loadRules() 方法来用硬编码的方式定义流量控制规则,比如:

代码语言:javascript复制
private static void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule1 = new FlowRule();
    rule1.setResource(resource);
    // Set max qps to 20
    rule1.setCount(20);
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule1.setLimitApp("default");
    rules.add(rule1);
    FlowRuleManager.loadRules(rules);
}

熔断降级规则包含下面几个重要的属性:

Field

说明

默认值

resource

资源名,即规则的作用对象

grade

熔断策略,支持慢调用比例/异常比例/异常数策略

慢调用比例

count

慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值

timeWindow

熔断时长,单位为 s

minRequestAmount

熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)

5

statIntervalMs

统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)

1000 ms

slowRatioThreshold

慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

同一个资源可以同时有多个降级规则。

理解上面规则的定义之后,我们可以通过调用 DegradeRuleManager.loadRules() 方法来用硬编码的方式定义流量控制规则。

代码语言:javascript复制
private static void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule1 = new FlowRule();
    rule1.setResource(resource);
    // Set max qps to 20
    rule1.setCount(20);
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule1.setLimitApp("default");
    rules.add(rule1);
    FlowRuleManager.loadRules(rules);
}

Sentinel是一款针对分布式系统的高可用流量控制框架,可以在多个维度上实现流量控制,包括QPS、线程数、CPU使用率等。

在Java项目中使用Sentinel需要以下步骤:

引入Sentinel依赖

在pom.xml中引入Sentinel依赖:

代码语言:javascript复制
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>x.y.z</version>
</dependency>

其中,x.y.z表示版本号,可以根据需要选择最新的版本。

配置Sentinel规则

在Java项目中使用Sentinel需要定义规则,可以在项目中通过代码或配置文件定义规则。例如,使用注解方式定义规则:

代码语言:javascript复制
@SentinelResource("hello")
public String hello() {
    return "Hello World";
}

这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。可以根据需要修改规则的参数,例如设置QPS阈值、异常比例等。

配置Sentinel数据源

Sentinel的流量控制规则需要存储在数据源中,可以选择本地文件或Nacos等云原生平台中存储规则。在Java项目中需要配置数据源,例如:

代码语言:javascript复制
-Dcsp.sentinel.dashboard.server=localhost:8080
-Dcsp.sentinel.api.port=8080
-Dproject.name=my-project

其中,csp.sentinel.dashboard.server表示Sentinel的控制台地址,csp.sentinel.api.port表示Sentinel的API端口号,project.name表示项目名称。

启动Sentinel

在Java项目中启动Sentinel需要进行以下步骤:

创建Sentinel配置类,例如:

代码语言:javascript复制
@Configuration
public class SentinelConfig {
    @PostConstruct
    public void init() {
        // 初始化Sentinel
        initFlowRules();
    }
    private void initFlowRules() {
        // 定义Sentinel规则
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("hello");
        rule.setCount(10);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rules.add(rule);
        // 加载Sentinel规则
        FlowRuleManager.loadRules(rules);
    }
}

这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。

启动Spring Boot应用程序。在启动时,Sentinel会自动加载规则并启动流量控制。

以上是Java项目使用和配置Sentinel的基本步骤。需要注意的是,Sentinel的使用和配置需要根据实际情况进行调整和优化,以达到最佳的流量控制效果。

0 人点赞