Spring Cloud 整合Sentinel

1、引入依赖

版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

父pom

<spring.cloud.version>Hoxton.SR12</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>

Sentinel应用直接引用starter

<dependency>    
    <groupId>com.alibaba.cloud</groupId>    
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置规则

限流着重于防止整体系统的入口流量过大,通过量化控制进入系统的请求速度。

降级是在系统负载过高或部分服务不可用时,采取的一种策略,它允许系统牺牲部分非核心功能或降低服务质量,以保证核心功能的正常运行。

    // 限流配置规则
    @PostConstruct
    public static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("ordering"); //设置资源名称
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS 每秒的访问量
        // Set limit QPS to 20.
        rule.setCount(2);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
    // 降级规则
    //@PostConstruct
    public  void initFlowRules2() {
        List<DegradeRule> rules = new ArrayList<>();
         DegradeRule rule = new DegradeRule();
        rule.setResource("ordering2"); //设置资源名称
        rule.setGrade(DEGRADE_GRADE_EXCEPTION_RATIO);
        // Set limit QPS to 20.
        rule.setCount(0.5);
        rule.setMinRequestAmount(10);
        rule.setTimeWindow(10); // 10s 熔断时长10s
        rule.setStatIntervalMs(10*1000); 10s 统计时长,统计的窗口(单位为 ms)
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }

3、为接口设置熔断与降级方法

3.1 blockHandler与fallback命名规则

  1. blockHandler方法应该接收与原始方法相同类型的参数,并且额外添加一个 BlockException 类型的参数,用于传递被 Sentinel 阻塞的具体原因。

命名规则是:

1:原方法名 + "_blockHandler",比如在示例中,对应的 blockHandler 方法应该是 ordering_blockHandler(Integer id, BlockException ex)

2:必须为static方法

  1. fallback方法应该接收与原始方法相同类型的参数

命名规则是:

1:原方法名 + "_fallback",此方法应该接收与原始方法相同的参数列表,并返回与原始方法相同的返回类型。

2:必须为static方法

在示例中,对应的 fallback 方法应该是 ordering_fallback(Integer id)也可以ordering_fallback(Integer id, Throwable ex)

上述的 _blockHandler_fallback 后面是可以带上任意的参数类型,但至少需要包含原始方法的所有参数类型,以及在 blockHandler 方法中加入 BlockException 参数。

3.2 触发条件

  1. blockHandler

    1. 触发条件:当资源访问由于触发了 Sentinel 的流控(QPS 超过阈值等情况)规则而被阻止时,会触发 blockHandler 指定的方法。该方法主要用于处理因流量控制而导致的阻塞情况。

    2. 示例中 blockHandler="ordering_blockHandler" 表示如果 ordering 方法因为 Sentinel 流控规则而被阻止时,将调用 OrderController 类中的 ordering_blockHandler 方法进行处理。

  2. fallback

    1. 触发条件:通常在服务不稳定或者异常抛出时触发。对于 Sentinel 来说,若开启了熔断(如因多次调用超时或异常),则会触发熔断进入半开状态,后续请求会直接进入 fallback 处理逻辑,或者在某些资源执行过程中发生了异常也会触发 fallback。

    2. 示例中 fallback="ordering_fallback" 表示如果 ordering 方法出现异常或者满足 Sentinel 熔断策略时,将调用 OrderController 类中的 ordering_fallback 方法进行回退处理。

    3. 在熔断期间,不再调用原始方法,而是直接调用降级方法

3.3验证限流


@RestController
@RequestMapping("/api/order")
@Slf4j
public class OrderController {

    private  static AtomicInteger count = new AtomicInteger(0);
    
    @GetMapping
    @SentinelResource(
            value = "HelloWorld",
            blockHandlerClass=OrderController.class,
            blockHandler = "ordering_blockHandler")
    public String ordering(Integer id) {
        int i = count.incrementAndGet();
        log.debug(id + "进来了 - > "+i);
        return "下单成功";
    }

    public static String  ordering_blockHandler(Integer id,BlockException ex){
        int i = count.incrementAndGet();
        log.debug("熔断了 -> "+i );
        return "系统繁忙,请稍后重试";
    }
    @PostConstruct //初始化执行
    private  void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // Set limit QPS to 20.
        rule.setCount(2);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}


3.4 验证降级


@RestController
@RequestMapping("/api/order2")
@Slf4j
public class Order2Controller {
    
    @GetMapping
    @SentinelResource(
            value = "ordering2",
            fallbackClass= Order2Controller.class,
            fallback = "ordering_fallback")
    public String ordering(Integer id) {
        log.debug("进来了");
        if (id == 4) {
            throw new IllegalArgumentException("参数异常");
        }
        return "下单成功";
    }
    //? 什么时候触发? ordering_fallback 有什么要求吗?
    public static String ordering_fallback(Integer id, Throwable ex) {
        log.debug("降级");
        return "降级了";
    }

    @PostConstruct //初始化执行 降级规则
    private  void initDegradeRule(){

        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule("ordering2")
                .setGrade(CircuitBreakerStrategy.ERROR_COUNT.getType())
                // Max allowed response time 错误数量
                .setCount(2)
                // Retry timeout (in second) 熔断10s
                .setTimeWindow(20)
                .setMinRequestAmount(10) //最小请求数
                .setStatIntervalMs(10*1000);//10s 统计时长,统计的窗口(单位为 ms)
        rules.add(rule);

        DegradeRuleManager.loadRules(rules);

    }
}


4、验证接口 

5、高级配置

5.1流量控制规则 (FlowRule)

5.2 熔断降级规则 (DegradeRule)

5.3 系统保护规则 (SystemRule)

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

private void initSystemProtectionRule() {
  List<SystemRule> rules = new ArrayList<>();
  SystemRule rule = new SystemRule();
  rule.setHighestSystemLoad(10);
  rules.add(rule);
  SystemRuleManager.loadRules(rules);
}

5.4 访问控制规则 (AuthorityRule)

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。授权规则,即黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象

  • limitApp:对应的黑名单/白名单,不同 origin 用 ,分隔,如 appA,appB

  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式

5.5热点规则 (ParamFlowRule)

parameter-flow-control | Sentinel

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

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

相关文章

基于FPGA的数字密码锁电路Verilog代码Quartus仿真

名称&#xff1a;基于FPGA的数字密码锁电路Verilog代码Quartus仿真(文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 数字密码锁电路的设计 1.设计任务:设计并制作数字密码锁电路 2.设计要求 1.用EDA实训仪的I/设备和PLD志…

纯血鸿蒙APP实战开发——折叠屏扫描二维码方案

折叠屏扫描二维码方案 介绍 本示例介绍使用自定义界面扫码能力在折叠屏设备中实现折叠态切换适配。自定义界面扫码使用系统能力customScan&#xff0c;其提供相机流的初始化、启动扫码、识别、停止扫码、释放相机流资源等能力。折叠屏折叠状态通过监听display的foldStatusCha…

Hive3.0新特性:Materialized Views 物化视图

Materialized Views 物化视图 在 Apache Hive 3.0 中引入了物化视图&#xff08;Materialized Views&#xff09;的支持&#xff0c;它们是预先计算并缓存了查询结果的数据结构&#xff0c;以提高查询性能和降低延迟。物化视图通过将查询的结果存储在物理表中来实现&#xff0…

深入理解指针1

目录 如对您有帮助&#xff0c;还望三连支持&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 1.内存和地址 计算机中常⻅的单位&#xff08;补充&#xff09;&#xff1a; 如何理解编址 2.指针变量和地址 2.1取地址操作符&#xff08;&&#xff09; 2.2指针变…

数据结构学不会?数据结构可视化网站来了

目录 前言 图码网站 算法可视化 算法编辑器 数据结构全书 数据结构课程 总结 前言 数据结构与算法在计算机的学习中应该是许多小白最头疼的东西&#xff0c;明明听的时候那么容易&#xff0c;为什么转换成代码就那么抽象呢&#xff1f; 有没有一个网站可以数据结构与算…

【RabbitMQ 三】Java客户端开发

本文引用的代码源自《RabbitMQ实战指南》 关键的类和接口主要有Channel、Connection、ConnectionFactory、Consumer等&#xff0c;它们主要的作用如下&#xff1a; Channel&#xff1a;实现AMQP协议层的操作Connection&#xff1a;开启信道&#xff08;Channel&#xff09;、注…

k8s集群统一设置时间

1 安装时间同步需要软件 yum install -y ntpdate2 设置时间 2.1 手动设置时间 date -s "20190712 18:30:50" hwclock --systohc2.2 在线更新时间 ntpdate 0.asia.pool.ntp.org # 强制把系统时间写入CMOS clock -w3 强制把系统时间写入CMOS hwclock作用与clock相…

【复杂网络】如何用简易通俗的方式快速理解什么是“相对重要节点挖掘”?

什么是相对重要节点&#xff1f; 一、相对重要节点的定义二、如何区分相对重要节点与重要节点&#xff1f;1. 相对重要性与节点相似性2. 识别相对重要节点的两个阶段第一阶段&#xff1a;个体重要性值的计算第二阶段&#xff1a;累积重要性值的计算 三、经典的相对重要节点挖掘…

08 - 条件判断语句

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 条件判断语句2. 语法说明3. 经验4. 代码 1. 条件判断语句 makefile 中支持条件判断语句 可以根据条件的值来决定 make 的执行可以比较两个不同变量或者变量和常量的值 注&#xff1a;条件判断语句只能用于控制 make 实际执行的…

探索大模型能力--prompt工程

1 prompt工程是什么 1.1 什么是Prompt&#xff1f; LLM大语言模型终究也只是一个工具&#xff0c;我们不可能每个人都去训一个大模型&#xff0c;但是我们可以思考如何利用好大模型&#xff0c;让他提升我们的工作效率。就像计算器工具一样&#xff0c;要你算10的10倍&#x…

今天看到一个有意思的问题:个人网站被恶意大量访问,怎么办(文末附GPT指令优化)

目录 问题描述 一、GPT 3.5 二、通义千问 三、讯飞星火 四、文心一言 五、Kimi 六、智谱清言 个人分析&#xff1a; 问题描述 大家好&#xff01;我的个人网站每天晚上7点30到11点被固定的十几个IP大量下载exe&#xff0c;造成网站带宽不够&#xff0c;怎么办! 已经把…

大模型系列之解读MoE

Mixtral 8x7B 的推出&#xff0c; 使我们开始更多地关注 基于MoE 的大模型架构&#xff0c; 那么&#xff0c;什么是MoE呢&#xff1f; 1. MoE溯源 MoE的概念起源于 1991 年的论文 Adaptive Mixture of Local Experts&#xff08;https://www.cs.toronto.edu/~hinton/absps/jjn…

如何在Android设备上恢复丢失的照片

Android手机或平板电脑上的照片丢失了&#xff1f;不要惊慌&#xff0c;您也许可以恢复它们。 由于我们的大量数据和日常生活都存储在一台设备上&#xff0c;有时将所有照片存储在本地的 Android 智能手机或平板电脑上可能是一项冒险的工作。无论是通过事故&#xff08;损坏、…

python数据分析常用基础语法

Python语言基础——语法基础 前言一、变量的介绍与使用变量的介绍变量命名规则变量的使用拓展 二、标识符标识符命名命名规则注意事项 三、数据类型数据类型的介绍数据类型的查看示例 四、输入与输出输入和输出的介绍format格式化输出占位符 五、代码缩进与注释代码缩进 前言 …

最高20K/月,安全、数通、云计算多个方向急招,可内推!

高级安全工程师【岗位职责及要求】 1、统筹负责行业客户的安全项目交付&#xff0c;能够独自输出技术方案并完成施&#xff0c;并具备指导初中级工程师实施的能力&#xff1b; 2、掌握H3C全系列安全产品功能并对全系列产品原理有深入了解&#xff0c;能够熟练完成安全产品规划及…

如何找到台式电脑的ip地址

在数字时代&#xff0c;每台接入网络的设备都拥有一个独特的标识&#xff0c;这就是IP地址。无论是手机、笔记本电脑还是台式电脑&#xff0c;IP地址都扮演着至关重要的角色&#xff0c;它帮助设备在网络世界中定位并与其他设备进行通信。对于许多电脑用户来说&#xff0c;了解…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC&#xff08;系统级芯片&#xff09;处理器&#xff0c;适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU&#xff0c;集成了GPU、MCU、NPU、VPU等多种计算核心&#xff0c;并具有丰富的外…

Python面向对象编程思想的深入学习

魔术方法的使用 案例体验 class Student:def __init__(self, name, age):self.name nameself.age age# __str__魔术方法, 如果不去写这个方法&#xff0c;那么print输出的则是信息存储的内存地址。def __str__(self):return fStudent类对象&#xff0c;name:{self.name}, ag…

SolidWorks进行热力学有限元分析一、模型建立

1.话不多说按照我的操作来 2.这一步鼠标移到中心点直接拉就行 3.这里选单位&#xff0c;继续按照操作来 4.选中这个边&#xff0c;直接拉&#xff0c;输入尺寸后确定&#xff0c;其他边同理 5.鼠标右键设置厚度 6.右键零件&#xff0c;然后编辑材料&#xff0c;给他赋予你需要的…

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库&#xff0c;由腾讯开源。 支持 SAX 和 DOM 风格的 API&#xff0c;并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…