前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Alibaba生态之Sentinel

Spring Cloud Alibaba生态之Sentinel

作者头像
小冷
发布2023-05-24 17:30:15
1800
发布2023-05-24 17:30:15
举报
文章被收录于专栏:小冷coding小冷coding

上一篇知道了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的使用和配置需要根据实际情况进行调整和优化,以达到最佳的流量控制效果。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小冷coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档