【震撼揭秘】Sentinel:一文读懂,那些让开发者“拍案叫绝”的核心特性!

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

引言

在微服务架构中,流量治理是确保系统稳定性和高可用性的关键。Sentinel作为一项强大的流量控制组件,为我们提供了完善的解决方案。本文将带您走进Sentinel的世界,通过实战案例,展示如何利用Sentinel进行流量控制、熔断降级和系统自适应保护,让您的微服务架构更加健壮。

Sentinel的简介

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel的实现原理

在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适
配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建
一系列功能插槽(slot chain)。这些插槽有不同的职责。

Sentinel的核心概念

资源(Resource)

资源(Resource) 是指需要受到流量控制或者熔断保护的代码逻辑单元,它可以是服务调用、数据库连接、甚至一段特定的代码。Sentinel 对资源的保护是通过定义资源及其相关的规则来实现的。

资源的作用

  • 流量控制:限制资源的访问频率,防止系统过载。
  • 熔断降级:当资源(如服务调用)失败率达到一定阈值时,触发熔断,避免连锁故障。
  • 实时监控:监控资源的访问情况,包括调用次数和响应时间等。

资源的分类

  • 普通资源:通常是一段代码块,如一个服务的调用过程。
  • 入口资源:在框架层面自动定义的资源,如 MVC 框架中的一个 URL 路径。

资源入口类型(EntryType)

  • IN:进入型资源,这是最常见的资源入口类型。当一个请求或者调用进入你的服务时,通常会使用进入型资源。例如,一个 RESTful API 调用,一个数据库查询,或者任何其他由外部触发的事件。
  • OUT:出去型资源,通常用于异步处理或者需要显式地将流量流出到下一个逻辑的场合。出去型资源允许你在调用链中嵌入一个显式的出口点。
  • COMMON:通用型资源,用于那些既不是明确进入型也不是明确出去型的资源。在某些情况下,如果你不想明确区分资源的进入或出去方向,可以使用通用型。
  • ASYNC:异步资源,用于处理异步调用场景。当资源的调用是在一个独立的线程或者在响应式编程模型中进行时,使用异步资源可以更准确地控制和监控这些异步操作。
  • TRY_PREPARE:用于能够提前进行热点参数提取的异步调用链路。 进入型资源,这是最常见的资源入口类型。当一个请求或者调用进入你的服务时,通常会使用进入型资源。例如,一个 RESTful API 调用,一个数据库查询,或者任何其他由外部触发的事件。

String resource = "resourceA";
// 通过 Sentinel 的入口方法进行资源访问
Entry entry = null;
try {
    entry = SphU.entry(resource,EntryType.ASYNC);
    // 执行业务逻辑
} catch (BlockException ex) {
    // 处理被限流的情况
} finally {
    if (entry != null) {
        entry.exit();
    }
}

注解方式定义资源

@SentinelResource 是 Sentinel 提供的一个用于Java Spring框架的注解,它允许开发者在代码中声明式地定义资源及其流量控制规则。这个注解通常用在Spring的Bean方法上,以便于对这些方法进行流量控制和熔断降级处理。

核心属性解析:

  • value:资源名称。这是必需的属性,Sentinel会根据这个名称来匹配和应用相应的流量规则。
  • entryType:资源的入口类型。可以是IN(进入)或OUT(出去),默认为IN。这决定了流量是从外部进入系统,还是从系统出去。
  • blockHandler:当资源被限流时调用的方法名。该方法必须与被注解的方法处于同一类中,并且返回类型必须与被注解的方法一致。
  • fallback:当资源被熔断时调用的方法名。这类似于Spring的@Fallback机制,用于提供备选方案。
  • exceptionsToTrace:指定在哪些异常下,该资源会被当作异常资源来统计。

代码示例:

@RestController
public class YourController {

    @GetMapping("/test")
    @SentinelResource(value = "testResource", blockHandler = "handleBlock", fallback = "handleFallback")
    public String test() {
        // 业务逻辑
        return "Hello, Sentinel";
    }

    public String handleBlock(String resource, BlockException ex) {
        // 限流处理逻辑
        return "Blocked by Sentinel";
    }

    public String handleFallback(String resource, Throwable cause) {
        // 熔断处理逻辑
        return "Fallback for " + resource;
    }
}

规则(Rule)

规则(Rule) 是用于定义流量控制、熔断降级等行为的具体条件。规则是 Sentinel 系统中非常核心的概念,它允许开发者根据实际的业务需求来定制流量管理策略。

Sentinel 支持的规则类型:

  • 流量控制规则(FlowRule):用于限制资源的访问流量,如限制 QPS 或并发数。
FlowRule flowRule = new FlowRule("resourceA");
flowRule.setCount(10); // 限流阈值,如 QPS 为 10
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setLimitApp("default");
flowRule.setStrategy(RuleConstant.DIRECT);

// 加载规则
FlowRuleManager.loadRules(Collections.singletonList(flowRule));
  • 熔断降级规则(DegradeRule):用于在资源访问失败或响应时间过长时触发熔断,以保护系统稳定性。
DegradeRule degradeRule = new DegradeRule("resourceB");
degradeRule.setResource("resourceB");
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
degradeRule.setCount(10); // 秒级失败次数阈值
degradeRule.setTimeWindow(10); // 熔断窗口时间

// 加载规则
DegradeRuleManager.loadRules(Collections.singletonList(degradeRule));
  • 系统保护规则(SystemRule):用于根据系统的负载情况(如 CPU、内存使用率)来控制流量。
SystemRule systemRule = new SystemRule();
systemRule.setHighestSystemLoad(75); // 系统负载达到 75% 时触发规则

// 加载规则
SystemRuleManager.loadRules(Collections.singletonList(systemRule));
  • 热点参数规则(ParamFlowRule):用于对指定参数的不同值进行流量控制。
ParamFlowRule paramFlowRule = new ParamFlowRule("resourceC");
paramFlowRule.setResource("resourceC");
paramFlowRule.setGrade(RuleConstant.FLOW_GRADE_PARAM_QPS);
paramFlowRule.setCount(5); // 参数级别的 QPS 阈值
paramFlowRule.setParamIdx(0); // 参数索引
paramFlowRule.setParamFlowItemList(
    Collections.singletonList(
        new ParamFlowItem("arg0", 5) // 当参数值为 "arg0" 时的阈值
    )
);

// 加载规则
ParamFlowRuleManager.loadRules(Collections.singletonList(paramFlowRule));

规则的基本属性:

  • resource:资源名,用于指定规则适用的资源。
  • limitApp:来源应用名,用于指定规则适用的调用来源。
  • grade:规则等级,如 QPS 或并发数。
  • count:阈值,超过该阈值时规则生效。
  • strategy:流量控制策略,如直接拒绝或平滑过渡。
  • controlBehavior:控制行为,如直接拒绝、排队等待、慢启动等。

规则是 Sentinel 进行流量管理的基础,通过灵活地定义和应用规则,可以有效地保护系统不受异常流量的冲击,保障系统的高可用性。

流量控制(Flow Control)

流量控制(Flow Control) 是一种用于限制资源访问速率的机制,以防止系统过载。流量控制主要通过限制每秒通过的请求数(QPS)或并发数来实现。

核心概念解析:

  • QPS (Queries Per Second):每秒查询率,用于衡量流量控制的速率。
  • 并发数:同时处理请求的最大线程数。
  • 热 Key:当一个资源与一个或多个参数(如用户 ID、商品 ID)关联时,如果某个参数的访问量特别高,这个参数被称为热 Key。
  • 阈值模式:流量控制的两种模式,包括直接阈值模式和关联阈值模式。直接阈值模式只考虑请求总数,而关联阈值模式考虑参数级别的请求总数。
  • 流量整形:对流量曲线进行整形,使流量以更平滑的方式通过。
  • 熔断机制:当系统处于异常状态时,通过断开或降级某些服务来保护系统。

代码示例:

// 1、确认配置流量控制规则
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

FlowRule rule = new FlowRule();
rule.setResource("resourceA"); // 资源名
rule.setCount(10); // 限流阈值,如每秒 10 个请求
rule.setGrade(1); // 1 表示 QPS
rule.setLimitApp("default"); // 来源应用名

// 加载规则
FlowRuleManager.loadRules(Collections.singletonList(rule));


//2、代码中使用流量控制
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;

public void doSomething() {
    String resource = "resourceA";
    Entry entry = null;
    try {
        entry = SphU.entry(resource);
        // 业务逻辑处理
    } catch (Exception e) {
        // 处理被限流的情况
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}
//在上述示例中,我们首先定义了一个流量控制规则,限制名为 resourceA 的资源每秒只能处理 10 个请求。
//然后,在业务逻辑中,我们通过 Sentinel 的 SphU.entry 方法对资源进行保护。如果请求超过了定义的阈值,将抛出异常,我们可以通过 catch 块来处理这种情况。

流量控制是 Sentinel 中非常重要的一个特性,它可以帮助开发者在微服务架构中更好地管理流量,保护系统不受过载的影响。通过合理设置流量控制规则,可以提高系统的稳定性和可用性。

熔断降级(Circuit Breaking)

熔断降级(Circuit Breaking) 是一种提高系统稳定性和可用性的机制。当某个服务不可用或者响应时间过长时,熔断机制可以防止系统雪崩效应,通过临时切断或降级对该服务的调用,从而保护整个系统的稳定运行。

核心概念解析:

  • 熔断(Circuit Tripping):当服务连续失败达到一定阈值时,熔断器会“跳闸”,此时所有对该服务的调用都会立即失败,而不是等待服务超时。
  • 降级(Falling Back):在服务熔断后,可以提供一个备选的行为或返回值,以维持系统的可用性。
  • 半开状态(Half-Open State):在熔断器打开一段时间后,会进入半开状态,允许一部分流量尝试调用服务,以检测服务是否已经恢复正常。
  • 冷却时间(Cool Down Time):熔断器打开后,会等待一段冷却时间,然后才进入半开状态。
  • 失败判定:可以基于异常比例、响应时间等条件来判断服务是否失败。

代码示例:

配置熔断降级规则:

import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;

DegradeRule rule = new DegradeRule();
rule.setResource("resourceB"); // 资源名
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT); // 响应时间降级
rule.setCount(10); // 秒级失败次数阈值
rule.setTimeWindow(10); // 熔断窗口时间,单位为秒
rule.setMinRequestAmount(5); // 最小请求量

// 加载规则
DegradeRuleManager.loadRules(Collections.singletonList(rule));

//在上述示例中,我们定义了一个基于响应时间的熔断降级规则。如果资源 resourceB 在 10 秒内失败次数超过 10 次,并且请求量大于等于 5 次,那么熔断器将会被触发。

在代码中使用熔断降级:

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;

public void doSomething() {
    String resource = "resourceB";
    Entry entry = null;
    try {
        entry = SphU.entry(resource);
        // 业务逻辑处理
    } catch (Exception e) {
        // 处理熔断降级的情况
        // 可以进行重试、返回默认值或执行其他逻辑
        System.out.println("资源暂时不可用,已触发降级逻辑");
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}

//在上述示例中,我们通过 Sentinel 的 SphU.entry 方法对资源进行保护。如果资源触发了熔断降级规则,将会抛出异常,我们可以通过 catch 块来处理这种情况,例如返回默认值或执行其他逻辑。

熔断降级是 Sentinel 中非常重要的一个特性,它可以帮助开发者在微服务架构中更好地处理服务不稳定的情况,保护系统不受单点故障的影响。通过合理设置熔断降级规则,可以提高系统的容错性。

系统保护(System Protection)

系统保护(System Protection) 是一种基于系统负载的流量控制机制,其目的是防止由于系统负载过高导致服务不可用或响应延迟增加。系统保护通过限制流入系统的总体流量来实现,确保系统资源(如 CPU、内存、线程等)不会超过预设的安全阈值。

核心概念解析:

  • 负载指标:系统保护规则基于不同的系统负载指标,如 CPU 使用率、内存使用量、线程数等。
  • 阈值:每种负载指标都有一个阈值,当系统运行的实际负载超过这些阈值时,系统保护规则将被触发。
  • 流量控制:系统保护通过限制流量来降低系统的负载,防止系统过载。
  • 模式:系统保护可以配置为单机模式或集群模式。单机模式下,只考虑单个实例的负载情况;集群模式下,会考虑整个集群的负载情况。

代码示例:

import com.alibaba.csp.sentinel.config.SystemRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRule;

SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(75); // 设置系统负载的最高阈值为 75%
rule.setAverageRt(300); // 设置平均响应时间的阈值为 300 毫秒

// 加载规则
SystemRuleManager.loadRules(Collections.singletonList(rule));

//我们定义了一个系统保护规则,设置了系统负载的最高阈值为 75%,并且设置了平均响应时间的阈值为 300 毫秒。
//当系统负载超过规则中定义的阈值时,Sentinel 会开始拒绝一些请求,直到系统负载降低到安全水平。

系统保护是 Sentinel 中用于保障整个系统稳定性的重要特性,特别适合于那些对系统资源使用有严格要求的场景。通过系统保护,可以在不牺牲用户体验的前提下,最大化地利用系统资源,同时避免因资源耗尽而导致的系统崩溃。

总结

Sentinel 在流量控制、熔断降级、系统保护等方面表现出色,尤其适合微服务架构中需要精细化控制流量和保护系统稳定性的场景。其劣势主要体现在学习成本、定制化需求、依赖控制台以及跨语言支持等方面,需要根据具体项目需求、团队技术栈和运维能力进行权衡选择。总之,Sentinel 凭借其全面的流量控制与保护能力,已成为微服务架构中不可或缺的稳定基石。尽管存在一定的学习成本和特定场景下的定制化需求,但瑕不掩瑜,对于寻求提升服务稳定性和应对复杂流量场景的企业而言,Sentinel 无疑是值得考虑的选择。随着社区的持续发展和功能完善,Sentinel 有望进一步优化其劣势,更好地服务于全球范围内的开发者与企业用户。

参考文档:
https://sentinelguard.io/zh-cn/docs/introduction.html
https://developer.aliyun.com/article/1140971
http://www.manongjc.com/detail/8-hbvpbollqobpzev.html
https://m.blog.csdn.net/weixin_38308374/article/details/114951452
https://zhuanlan.zhihu.com/p/439887978

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574666.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第11章 Android特色开发——基于位置的服务

第11章 Android特色开发——基于位置的服务 本章中,将要学习一些全新的Android技术,这些技术有别于传统的PC或Web领域的应用技术,是只有在移动设备上才能实现的。 基于位置的服务(Location Based Service)。由于移动…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

flutter笔记-webrtc使用1:依赖本地包socket.io-client

文章目录 1. 示例工程2. yaml 修改3. 使用4. socketio 关于自定义服务器自定义签名的问题封装成async和await方式 本文开始介绍webrtc的使用&#xff0c;阅读本文的前提是假设你已经使用过webrtc&#xff0c;了解webrtc的交互机制&#xff0c;不了解的可以看之前的文章&#xf…

【Java数据结构】初步认识ArrayList与顺序表

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

【线性代数 C++】求逆矩阵

对于 n n n阶矩阵 A A A&#xff0c;如果有 n n n阶矩阵 B B B&#xff0c;使 A B B A E ABBAE ABBAE&#xff0c;则说 A A A是可逆的&#xff0c;并把 B B B称为 A A A的逆矩阵. A A A的逆矩阵记作 A − 1 A^{-1} A−1&#xff0c;则 B A − 1 BA^{-1} BA−1.若 ∣ A ∣ ≠…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

59、回溯-括号生成

思路&#xff1a; 括号是成对出现&#xff0c;首先左括号可以放n个&#xff0c;右括号也可以放n个。如果当前左括号放了3了&#xff0c;右括号放了4个&#xff0c;错了&#xff0c;如果左括号放了5个&#xff0c;右括号放了4个。可以&#xff0c;继续放右括号即可。所以可以设…

linux系统安全及应用【上】

目录 1.账号安全控制 1系统账号清理 2密码安全控制 1 对已经存在的用户账号进行控制 2 对新建的用户密码默认设置 3 历史命令和终端自动注销的安全管理 1 历史命令的限制 2. 用户切换管理 1 su命令的使用 2 ssh 3.授权用户管理 1 sudo命令 2 sudo用户别名 3 查看su…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、AR模型出场 创建ARCamer…

【Go语言快速上手(四)】面向对象的三大特性引入

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 初识GO中的结构…

深度学习中的子空间、线性变换和矩阵概念应用

1.表示子空间 在深度学习中&#xff0c;“不同的表示子空间”通常是指模型通过不同的参数&#xff08;例如权重矩阵&#xff09;将输入数据映射到不同的高维空间&#xff0c;这些空间被称为表示子空间。每个子空间都能够捕获输入数据中不同的特征或模式。以下是一些详细解释&am…

软考-论文写作-论架构风格论文

题目 素材 框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员线上开展各项工作以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合实践,以委员履职系统为例,主要讨论软件…

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具&#xff0c;比SpeechRecognition功能多安装也很简单&#xff1b; 官方介绍&#xff1a;FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff…

verilog中比较器的代码用法

在 verilog 中以大于“>”&#xff0c;等于””&#xff0c;小于”<”&#xff0c;大于等于”>”&#xff0c;小于等于”<”&#xff0c;不等于”!”表示&#xff0c;以大于举例&#xff0c;如 c a > b ;表示如果 a 大于 b&#xff0c;那么 c 的值就为 1&#x…

网盘——文件重命名

文件重命名具体步骤如下&#xff1a; 目录 1、具体步骤 2、代码实现 2.1、添加重命名文件的槽函数 2.2、关联重命名文件夹信号槽 2.3、添加重命名文件的协议 2.4、添加槽函数定义 2.5、服务器 2.6、添加重命名文件的case 2.7、客户端接收回复 3、测试 3.1、点击重命…

【AIGC调研系列】Bunny-Llama-3-8B-V与其他多模态大模型相比的优劣

Bunny-Llama-3-8B-V作为基于Llama-3的多模态大模型&#xff0c;其优势主要体现在以下几个方面&#xff1a; 性能超越其他模型&#xff1a;根据我搜索到的资料&#xff0c;Bunny-Llama-3-8B-V在多个主流Benchmark上表现良好&#xff0c;超越了LLaVA-7B、LLaVA-13B、Mini-Gemini…

汽车企业安全上网解决方案

需求背景 成立于1866年的某老牌汽车服务独立运营商&#xff0c;目前已经是全球最大的独立汽车服务网络之一&#xff0c;拥有95年的历史&#xff0c;在全球150多个国家拥有17,000多个维修站&#xff0c;始终致力于为每一位车主提供高品质&#xff0c;可信赖的的专业汽车保养和维…