【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

news2024/11/26 18:53:05

这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。

目录

一、Sentinel组件

1.1、Sentinel介绍

1.2、Sentinel环境搭建

(1)引入依赖

(2)资源和规则

1.3、使用SphU定义资源

(1)定义资源

(2)定义规则

1.4、使用SphO定义资源

(1)定义资源

(2)定义规则

1.5、使用@SentinelResource注解定义资源

(1)定义资源

(2)定义规则

1.6、熔断降级规则

(1)案例代码

(2)五种降级规则


一、Sentinel组件

1.1、Sentinel介绍

Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件,它和hystrix组件的作用是类似的,但是Sentinel提供的功能比hystrix更加强大,Sentinel分为两部分,一部分是Sentinel核心库,另外一部分是Dashboard控制台,Dashboard控制台可以查看监控的信息,接口的调用情况等。

有两种使用Sentinel组件的方式,分别是:

  • 第一种:引入Sentinel核心库依赖,然后通过Java代码的方式编写流控规则。
  • 第二种:通过Dashboard控制台直接添加流控规则。

1.2、Sentinel环境搭建

Sentinel可以和很多的框架进行整合,并且也可以单独的使用,例如:和SpringCloud整合、和SpringBoot整合、Dubbo整合等,这里我就和SpringCloud进行整合。

(1)引入依赖

<!-- 引入 web 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 sentinel 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

引入sentinel依赖之后,基本的环境就搭建好了,接下来就是使用Sentinel进行流量控制等代码的编写。

(2)资源和规则

在Sentinel中有两种概念需要了解下,分别是:资源和规则。

资源就是指项目中的一个请求资源,可以将一段代码、一个方法看作是资源,Sentinel就是以【资源】的形式进行流控设置,定义资源之后,还需要给这个资源设置相对应的流控规则,规则也就是说,这个资源什么情况下,需要发生熔断、降级、限流等等操作呢,这些操作就是规则。

  • 一般情况下,我们都使用方法名、URL、微服务名称作为资源名称来描述某个资源。
  • 流量控制、熔断降级、系统保护、来源访问控制、热点参数等等规则。

Sentinel提供了多种资源的定义方式,可以通过【@SentinelResource】注解定义资源,也可以通过Java代码的方式手动的定义资源。下面分别介绍一下,几种定义资源和规则的方式。

1.3、使用SphU定义资源

SphU是Sentinel提供的一个类,SphU是采用【try...catch】异常的方式来实现流控配置,当发生流控的时候,就会抛出一个BlockException异常。

(1)定义资源

@GetMapping("/sphU")
public String demo01() {
    Entry entry = null;
    try {
        // 1、开启流控
        entry = SphU.entry("sphU_demo01");
        System.out.println("这里就是执行具体业务逻辑");
    } catch (BlockException e) {
        e.printStackTrace();
        // 记录流控异常日志
        Tracer.traceEntry(e, entry);
        // 2、当发生流控的时候,就会进入这个异常块里面
        return "Sentinel发生流控,请稍后重试!";
    } finally {
        if (entry != null) {
            // 3、退出流控
            entry.exit();
        }
    }
    return "接口调用成功";
}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
private void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();

    // 创建资源对应的流控规则
    FlowRule flowRule = new FlowRule();
    // 设置当前这个规则属于哪个资源的
    // 注意:不要用错方法,是调用【serResource()】方法,而不是【serRefResource()】,方法用错后,sentinel流控不生效
    flowRule.setResource("sphU_demo01");
    // 设置流控规则类型,这采用 QPS 方式
    flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

启动工程,然后浏览器访问【/api/sentinel/sphU】接口,连续多次刷新页面,此时就会出现流控情况,从而抛出异常。

1.4、使用SphO定义资源

SphO也是Sentinel提供的一个类,它是采用【if...else】的方式来实现流控,当触发流控的时候,对应方法会返一个boolean类型,false表示发生了流控,我们就可以根据方法的返回值,进行代码的处理。

(1)定义资源

@GetMapping("/sphO")
public String demo02() {
    boolean entry = SphO.entry("sphO_demo02");
    if (entry) {
        try {
            System.out.println("执行具体业务逻辑...");
            // 没有发生流控,正常执行业务逻辑代码
            return "接口调用成功";
        } finally {
            // 关闭流控
            SphO.exit();
        }
    } else {
        // 发生流控
        return "Sentinel发生流控,请稍后重试!";
    }
}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
public void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();
	
    // 创建资源对应的流控规则
    FlowRule flowRule = new FlowRule();
    flowRule.setResource("sphO_demo02");
    // 设置当前这个规则属于哪个资源的
    // 设置流控规则类型,这采用 QPS 方式
    flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

1.5、使用@SentinelResource注解定义资源

@SentinelResource注解,用于定义资源,这个注解中有下面这些属性:

  • value:定义资源名称。
  • blockHandler:定义流控降级之后调用的方法。
    • 方法必须定义在同一个类中。
    • 方法必须是public的。
    • 方法返回值必须和原方法的返回值一致。
    • 方法参数必须相同,但是最后一个参数可以添加一个异常类参数。
  • blockHandlerClass:作用和blockHandler一致,只是单独写到一个类里面了。
  • fallback:当对应方法抛出异常时候,会调用这个降级方法。

(1)定义资源

package com.gitcode.demo.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @version 1.0.0
 * @Date: 2023/4/25 17:07
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/sentinel/demo")
public class SentinelDemo {

    @SentinelResource(value = "sentinel_demo", blockHandler = "blockHandlerMethod", fallback = "fallbackMethod")
    @GetMapping("/resource")
    public String demo02() {
        System.out.println("执行具体业务逻辑...");
        return "接口调用成功";
    }

    public String blockHandlerMethod() {
        System.out.println("Sentinel发生流控,请稍后重试!");
        return "Sentinel发生流控,请稍后重试!";
    }

    public String fallbackMethod(Throwable ex) {
        System.out.println("Sentinel发生异常,请稍后重试!" + ex.getMessage());
        return "Sentinel发生异常,请稍后重试!" + ex.getMessage();
    }

}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
public void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();

    // 创建资源对应的流控规则
    FlowRule flowRule3 = new FlowRule();
    // 设置当前这个规则属于哪个资源的
    flowRule3.setResource("sentinel_demo");
    // 设置流控规则类型,这采用 QPS 方式
    flowRule3.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule3.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

1.6、熔断降级规则

通过Java代码的方式设置降级规则,降级规则采用【DegradeRule】类表示,通过这个类设置一些规则,然后将其保存到【DegradeRuleManager】类中的缓存里面即可。

(1)案例代码

/**
 * 服务降级规则配置
 */
public void initDegradeRule() {
    List<DegradeRule> degradeRuleList = new ArrayList<>();
    
    // 设置降级规则
    DegradeRule rule = new DegradeRule();
    rule.setResource("资源名称");
    // 指定触发降级的规则类型,有五种
    rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
    // 设置发生异常时候数量
    rule.setCount(2);
    // 设置窗口时间
    rule.setTimeWindow(10);
    // 设置最小请求数量
    rule.setMinRequestAmount(2);

    degradeRuleList.add(rule);
    
    // 加载到Sentinel里面
    DegradeRuleManager.loadRules(degradeRuleList);
}

(2)五种降级规则

  • DEGRADE_GRADE_EXCEPTION_COUNT:在指定时间内发生的异常次数降级。
  • DEGRADE_GRADE_EXCEPTION_RATIO:在指定时间内发生的异常比率降级。
  • DEGRADE_DEFAULT_MIN_REQUEST_AMOUNT:根据最小请求数量来实现降级。
  • DEGRADE_GRADE_RT:根据响应比进行降级。
  • DEGRADE_DEFAULT_SLOW_REQUEST_AMOUNT:最慢请求数量降级。

常用的就只有三个,分别是:异常数量、异常比率、响应比。

综上,这篇文章结束了,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程&#xff1a; 1.客户端通过域名进行请求访问时&#xff0c;会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断&#xff0c;如果是静态请求,Nginx会自行处理&#xff0c;并将处理结果返…

微信小程序原生开发功能合集十三:列表界面的实现

本章实现列表展示组件,包括列表数据加载、筛选、分页加载、快速搜索等功能。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/379…

提交代码「前置处理」,向前一小步,效率提升「亿点点」

&#x1f4a1; 如何巧用 Git Hook&#xff0c;解决代码提交中的代码规范性、冲突和错误以及工作流程问题&#xff1f; 近日&#xff0c;在极狐Tech Talk 直播上&#xff0c;极狐(GitLab) 后端工程师田鲁分享了自己的实践经验。以下内容整理自本次直播&#xff0c;你也可以点击文…

Linux第二章

文章目录 前言一、Linux系统的目录结构和路径表达形式二、Linux命令基础1.ls命令入门2.ls命令的参数和选项3.-cd-pwd命令4.相对路径绝对路径和特殊路径符5.-mkdir命令6.-touch-cat-more-命令7.-cp-mv-rm-命令8.-which-find命令9.-grep-wc-管道符10.-echo-tail-重定向符11.-vi编…

Spring Boot自动装配

目录 是什么&#xff1f; 自动装配的原理 进入SpringBootApplication注解 点击进入EnableAutoConfiguration注解 AutoConfigurationImportSelector&#xff08;核心&#xff09; 点进getAutoConfigurationEntry()方法: 点进getCandidateConfigurations() 流程图 是什么&…

远程支持软件:轻松解决电脑问题!

远程协助不工作 当我们提到Windows的远程支持软件时&#xff0c;许多人的第一个想法可能是Windows远程协助。它可以通过发送和接收邀请文件连接两台电脑&#xff0c;然后您可以远程修复另一台电脑上的问题。但是&#xff0c;有时&#xff0c;您会遇到诸如“远程协助无法连接…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集&#xff0c;可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程&#xff0c;arm环境下的编译过程和FFTW类似&#xff0c;不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…

十大常见的电子元器件

电子元器件是电子技术中的基础组成部分&#xff0c;是电子电路的基本构件。电子元器件的种类繁多&#xff0c;但其中一些元器件的应用非常广泛&#xff0c;被称为十大最常用电子元器件。本文将介绍这些元器件的基础知识。 一、电阻器 电阻器是一种用来阻碍电流流动的元器件&a…

改善内部客户服务的 3 个技巧

在当今世界&#xff0c;许多公司都专注于改善客户关系管理&#xff0c;公司管理层面临的挑战是他们不仅拥有外部客户&#xff0c;员工也是有痛点和需求的内部客户。正如糟糕的客户服务会导致客户流失一样&#xff0c;糟糕的内部客户服务会增加员工流动率。在当今瞬息万变的就业…

C++98 auto_ptr智能指针

auto_ptr 是C98定义的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接)的地址赋给这种对象.当对象过期时,其析构函数将使用delete来释放内存! 用法: 头文件: #include<memory> 用法: auto_ptr <类型> 变量名(new 类型); #include<iostream> …

算力为基,生态谋远,英特尔商用客户端的三重创新进化

“混合办公”仍旧是2023年全球企业IT管理者与“打工人”共同关注的热点话题。 比如根据携程最新公布的数据&#xff0c;过去一年内有超过66%的员工申请了混合办公对比试运行阶段&#xff0c;管理者对混合办公的支持率提升了10%。超九成管理者认为混合办公对效率无影响。调研数…

gpt人工智能模型原理-GPT的特点和基本原理

gpt训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是指一类以Transformer网络为基础的语言模型&#xff0c;可以用于自然语言生成、问答、文本分类等多个NLP任务。GPT的训练是基于预训练&#xff08;pre-training&#xff09;的方式进行的&#xff…

Java中读取用户输入的是谁?Scanner类

目录 前言一、Scanner类二、Scanner类基本使用1. 基本使用2. nextLine()方法 前言 我们在初学 Java 编程的时候&#xff0c;总是感觉很枯燥乏味&#xff0c;想着做点可以交互的小系统&#xff0c;可以让用户自由输入&#xff0c;系统可以接收做出反映。这就要介绍一下 Java 中的…

【数据库】表的增删改查(基础 )

目录 1、新增/插入数据 1.1、给表中所有字段插入数据 1.1、给表中指定字段&#xff08;列&#xff09;插入数据 1.2、一次插入多条记录 1.3、时间日期数据的插入 1.3.1、手动插入某个时间 1.3.2、插入当前时刻的时间 2、查找操作 2.1、全列查找&#xff08;查找表的…

【ArcGIS Pro二次开发】(24):现状、规划用地图斑的变化检查

如题如见&#xff0c;这是一个检查现状、规划用地变化的工具。 通过此工具&#xff0c;可以生成变化图斑&#xff0c;检查规划中发生的变化&#xff0c;明确是正常的规划措施&#xff0c;还是因为误操作产生的图斑变化。 一、要实现的功能 如上图所示&#xff0c;点击【检查现状…

【Daily Share】没有域名怎么破?手把手教你如何通过hosts配置域名(假域名)

目录 ❌前言&#x1f4c4;hosts文件&#x1f989;DNS解析步骤&#x1f44c;配置伪域名第一步 修改本机hosts配置第二步 配置服务器nginx &#x1f503;流程图 ❌前言 ip记不住&#xff1f;&#xff1f;&#xff1f; 域名不想买&#xff1f;&#xff1f;&#xff1f; 每次当我…

系统分析师《企业信息化战略与实施》高频知识点

企业信息化战略与实施---企业信息化与电子商务 业务流程重组&#xff08;Business Process Reengineering BPR&#xff09;是针对企业业务流程的基本问题进行反思&#xff0c;并对它进行彻底的重新设计&#xff0c;使业绩取得显著性提高。与目标管理、全面质量管理、战略管理等…

桂林阳朔4天4夜旅游攻略-亲测整理踩坑版本

桂林阳朔4天4夜旅游攻略-亲测整理踩坑版本 前言我的行程上海飞机出发到达两江机场桂林第一家酒店第一天早饭桂林米粉正宗吃法坐大巴去杨堤路口杨堤路口坐巴士直达杨堤码头杨堤到兴坪坐电动竹筏兴坪--20元背面打卡地兴坪古镇--汽车站阳朔酒店租电动车遇龙河漂流&#xff08;*五星…

Three.js教程:Face3对象定义Geometry的三角形面

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 Face3对象定义Geometry的三角形面 几何体Geometry的三角面属性geometry.faces和缓冲类型几何体BufferGeometry顶点索引属性BufferGeometry.index类似都是顶点位置数据的索引值…

【MySQL入门指南】MySQL中的数据类型总结

文章目录 MySQL数据类型一、数值类型1.类型总览2.BIT类型3.INT系列类型4.浮点数类型1)float与double2.float与decimal 二、字符串类型1.类型总览2.CHAR类型3.VARCHAR类型 三、日期与时间类型四、枚举类型1.enum类型2.set类型3.在set中的查找 MySQL数据类型 ​ MySQL中支持的数…