sentinel深入讲解流量控制/熔断降级

news2024/11/23 2:32:58

文章目录

  • sentinel
    • sentinel介绍
    • 重要的核心概念
    • 引入依赖
    • 限流的规则
    • 熔断规则
    • yaml 项目配置
    • 使用注解 @SentinelResource讲解
    • 类的静态方法

sentinel

sentinel介绍

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

重要的核心概念

资源

  • 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
  • 只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
    规则
  • 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>

限流的规则

[
    {
       "resource":"addOrder",
       "count":"1",
       "grade":"1",
       "strategy":"1",
       "limitApp":"queryOrder",
       "controlBehavior":"0"
    }
]
  • resource: 定义当前规则绑定限制的资源id 名称
  • count: 限流的阈值,grade=1 表示qps上限,grade=0 表示并发上限
  • grade: 1 qps类型的限流 0 并发类型限流
  • strategy: 限流策略.以哪种方案和逻辑来限流 0直接 1关联 2链路
  • limitApp: 流控针对的调用来源,默认default不区分调用来源,配合strategy=1的是后和2的时候使用.
  • controlBehavior: 限流效果(0直接拒绝,1Warm up,2排队)
  • strategy:
    • 0 直接限制,针对当前定义资源,限制访问
    • 1 关联,和limitApp有关系,如果当前资源流量,超过限流规则,限制limitApp定义的资源.
      在这里插入图片描述
    • 2 链路 决定限制流量的时候,先判断一下链路的入口,和limitApp有关,表示入口的资源
      在这里插入图片描述

熔断规则

[
  {
    "resource": "serviceHi",
    "count": 1,
    "grade": 0,
    "timeWindow": 10,
    "minRequestAmount": 1,
    "slowRatioThreshold": 0.5,
    "statIntervalMs": 10000
  }
]
  • count: 熔断触发的阈值(不再调用这个资源,而是访问降级策略),如果grade=0 count表示慢调用临界RT(响应时间单位毫秒),超过这个数字,就记录一次慢调用.grade是1,count值应该是>0小于1的小数,表示异常比例,grade=2 count配置整数,表示异常出现的次数
  • slowRatioThreshold: 慢调用比例,在grade=0时生效.当满足count记录成慢调用时,达到这个阈值,触发熔断.
  • minRequestAmount: 最少统计的请求数量.没达到最少数量,不会触发熔断
  • statIntervalMs: 统计时长,在同一个统计时长之内的数据,才能触发熔断.单位毫秒数.
  • timeWindow: 如果触发熔断,持续时间,单位秒
  • grade: 熔断类型 0 默认值 慢调用比例 1 异常比例 2异常数

当前熔断规则定义:
在10秒钟之内,最少达到1次请求前提下,超过1毫秒的资源处理时间记录为慢调用,如果所有调用请求的慢调用比例达到50%,则资源会熔断,熔断持续时间10秒,10秒后,断路器半开,尝试访问资源,再次计算熔断规则.

  • 熔断规则中的异常数.
[
  {
    "resource": "serviceHi",
    "count": 1,
    "grade": 2,
    "timeWindow": 10,
    "minRequestAmount": 1,
    "slowRatioThreshold": 0.5,
    "statIntervalMs": 10000
  }
]

表示内容:
10秒内统计异常数的熔断策略,如果最小请求达到1,并且异常数超过1,进入熔断持续时间10秒.

yaml 项目配置

spring:
  cloud:
    sentinel:
      datasource:
        #定义一个数据源的名称
        key1:
          nacos:
            #数据源具体属性 nacos address namespace group-id 文件名称
            server-addr: localhost:8848
            data-id: flowRules.json
            data-type: json
            #namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
            #每一个数据源的规则类型必须配置
            rule-type: flow
            #如果sentinel版本高于1.7 必须配置nacos用户名密码
            username: nacos
            password: nacos
        key2:
          nacos:
            #数据源具体属性 nacos address namespace group-id 文件名称
            server-addr: localhost:8848
            data-id: degradeRules.json
            data-type: json
            #namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
            #每一个数据源的规则类型必须配置
            rule-type: degrade
            #如果sentinel版本高于1.7 必须配置nacos用户名密码
            username: nacos
            password: nacos

使用注解 @SentinelResource讲解

@Service
public class HelloService {
    //定义一个方法为sentinel资源使用的注解
    //value 定义资源名称
    //blockhandler 会在本类中,寻找一个同名的方法,做降级的处理 要求
    //方法参数和方法返回值要和当前目标方法一致,并且要求添加一个异常对象的参数
    //fallback
    public String aaa(String name,BlockException e){
        //异常 BlockException 有可能是所有不同规则对应的异常类型
        //DegradeException
        return "sorry,sayHi方法熔断了,"+name;
    }
    public String bbb(String name,Throwable e){
        return "sorry,sayHi出现了异常,"+name;
    }
    @SentinelResource(
            value = "serviceHi",
            blockHandler="aaa",
            fallback = "bbb")
    public String sayHi(String name){
        System.out.println("进入到service的saiHi");
        String result="你好啊!"+name;
        int a=1/0;
        return result;
    }
}

在这里插入图片描述

类的静态方法

  • 为了减少业务代码类中,降级处理逻辑的代码繁杂,提供了简化,静态方法提取
  • sentinel允许我们将降级逻辑的代码方法,放到指定的类中,提供静态方法调用.节省本类代码,看起来更整洁.
  • 限流目的: 根据预估/压测的数据 实现并发或者qps设置,保护服务器
  • 熔断目的: 在保证主要业务功能成功实现前提下,附属,不重要的业务,可以做降级处理,避免他们问题影响主要业务功能
    在这里插入图片描述

在这里插入图片描述

/**
远程调用时,和cart购物车有关的方法
 单独封装一个bean对象
 */
@Component
@Slf4j
public class DubboCartService {
    @DubboReference
    private ICartService cartService;

    /**
     * 熔断降级的资源方法
     * @param orderAddDTO
     */
    @SentinelResource(
            value="serviceHi",
            blockHandler ="aaa" ,
            fallback = "bbb")
    public void HelloServiceBlockHanlder(OrderAddDTO orderAddDTO){
        cartService.deleteUserCart(orderAddDTO.getUserId(), orderAddDTO.getCommodityCode());
    }
    public void aaa(OrderAddDTO orderAddDTO, BlockException e){
        log.error("熔断规则生效,断路器打开状态,orderAddDTO:{},异常信息e:{}",orderAddDTO,e.getMessage());
    }
    public void bbb(OrderAddDTO orderAddDTO,Throwable e){
        log.error("业务调用异常,orderAddDTO:{},异常信息e:{}",orderAddDTO,e.getMessage());
    }
}

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

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

相关文章

STM32中PWM概述

STM32F103C8T6 PWM资源&#xff1a; 高级定时器(TIM1):7路 通用定时器(TIM2~TIM4):各4路 PWM输出模式&#xff1a; *PWM模式1&#xff1a;在向上计数时&#xff0c;一旦CNT<CCRx时输出为有效电平&#xff0c;否则为无效电平 *PWM模式2&#xff1a;在向上计数时&#xf…

vue实现仿手写稿样式,可导出成png图片

文章目录 环境实现效果代码 环境 安装html2canvas&#xff0c;用于将指定标签下的全部子节点转换为图片 npm install html2canvas实现 <template><div class"handwrite"><div id"left" class"left"><div id"backImg…

【Mycat2】关于序列功能的一个 Bug

创建序列前 Mycat 的 sequences/ 目录情况&#xff1a; 创建一个 MySQL 生成方式的序列。 /* mycat:setSequence{"name":"sharding_db_not_tb111","clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator"} */;因为没有官方文档支…

字符函数和字符串函数下篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数2 1…

DevOps自动化平台开发之 Shell脚本执行的封装

基础知识 基于如下技术栈开发DevOps平台 Spring Boot Shell Ansible Git Gitlab Docker K8S Vue 1、spring boot starter的封装使用 2、Shell脚本的编写 3、Ansible 脚本的编写 4、Docker 的使用与封装设计 本篇介绍如何使用Java封装Linux命令和Shell脚本的使用 将其设计成…

【Datawhale夏令营】任务一学习笔记

目录 一&#xff1a;anaconda的环境配置 二&#xff1a;赛题任务解读 2.1 任务要求 2.2 数据集介绍 2.3 评估指标 三&#xff1a;机器学习之 LightGBM 一&#xff1a;anaconda的环境配置 下载Anaconda&#xff1a;访问Anaconda官方网站&#xff08;https://www.anaconda.…

SQL篇-04_SQL进阶挑战-01_增删改操作

插入记录 SQL110 插入记录&#xff08;一&#xff09; 描述 牛客后台会记录每个用户的试卷作答记录到exam_record表&#xff0c;现在有两个用户的作答记录详情如下&#xff1a;用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001&#xff0c;并在50分钟后提交&#xff…

【算法基础:数学知识】4.3 欧拉函数

文章目录 欧拉函数定义性质 例题列表873. 欧拉函数&#xff08;使用质因数分解求一个数的欧拉函数&#xff09;原理讲解&#xff08;公式推导&#xff09;⭐解法代码 874. 筛法求欧拉函数&#xff08;求 1 ~ n 中所有数字的欧拉函数&#xff09;⭐ 欧拉函数 https://oi-wiki.o…

安装及配置zabbix_agent代理端(监控FTP服务器)

监控agent的linux主机我们在之前的文章里已经做好了 现在直接安装ftp服务即可 [rootagent ~]# yum install -y vsftpd[rootagent ~]# systemctl start vsftpd #启动ftp服务[rootagent ~]# systemctl enable vsftpd #设置ftp服务开机自启 Created symlink fro…

codec2play流程总结

Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API&#xff0c;vendor可用这个API实现他们自己的HAL层&#xff0c;Codec2.0是用于替换现有的OMX-IL。 数据流程 C2LinearBlock创建share ptr类型block&#xff0c;fetchLinearBlock对blo…

【每日一题Day274】LC42接雨水 | 单调栈

接雨水【LC42】[面试常见] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 按列求贡献&#xff1a;枚举 首先确定按行计算雨水&#xff0c;还是按列确定雨水 按行计算&#xff1a; 按列计算&#xff1…

SpringBoot之jackson之复杂XML和Object互转、泛型、传参/接参

引入依赖 <!-- lombok插件 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- jackson xml 转换工具 --><dependency><…

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…

crmeb部署

安装宝塔 教程 安装所需要的软件 php mysql5.7 redis fileinfo nginx 安装crmeb 重启mysql 前台http://192.168.216.128/ 后台http://192.168.216.128/admin admin admin888登录 访问前台

GOF 代理模式

1.需求 &#xff08;1&#xff09;&#xff1a;在程序中&#xff0c;对象A和对象B无法直接交互时。 &#xff08;2&#xff09;&#xff1a;在程序中&#xff0c;功能需要增强时。 &#xff08;3&#xff09;&#xff1a;在程序中&#xff0c;目标需要被保护时 代理模式中有一…

使用html和css技巧提升网站加载速度

使用html和css技巧提升网站加载速度 加载时间每增加一秒&#xff08;0-5 秒之间&#xff09;&#xff0c;网站转化率平均就会下降 4.42%。页面加载时间的前五秒对转化率的影响最大。 通过更改html和css文件可以提高网站的页面加载速度,本文现在就来介绍一下怎么实现。 延迟加载…

51单片机--AT24C02数据存储

文章目录 存储器的介绍AT24C02I2C总线I2C时序结构AT24C02数据帧AT24C02数据存储实例 存储器的介绍 存储器是计算机系统中的一种重要设备&#xff0c;用于存储程序和数据&#xff0c;它可以通过电子、磁性介质等技术来记录和保持数据。在这里&#xff0c;主要介绍的是随机存储器…

Java SPI机制:扩展Java应用的灵活性与可插拔性

文章目录 引言1. Java SPI机制简介2. Java SPI的工作原理2.1. 定义服务接口2.2. 编写服务提供者2.3. 创建SPI配置文件2.4. 使用Service Loader加载服务2.5. 客户端代码调用服务 3. 实例演示HelloEnService .javaHelloZhServiceImpl .javaMETA-INF/services/com.gpj.spi.HelloSe…

Blazor前后端框架Known-V1.2.6

V1.2.6 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

kubesphere安装中间件

kubesphere安装mysql 创建configMap [client] default-character-setutf8mb4[mysql] default-character-setutf8mb4[mysqld] init_connectSET collation_connection utf8mb4_unicode_ci init_connectSET NAMES utf8mb4 character-set-serverutf8mb4 collation-serverutf8mb4_…