Sentinel 降级、限流、熔断

前言

在现代分布式系统中,如何有效地保护系统免受突发流量和故障的影响,是每个开发人员和架构师都需要思考的重要问题。在这样的背景下,Sentinel作为一个强大的系统保护和控制组件,为我们提供了降级、限流、熔断等多种策略,帮助我们更好地保障系统的稳定性和可用性。

https://sentinelguard.io/zh-cn/docs/quick-start.html
  • 在微服务的体系架构中,如果遇到服务提供方不能提供服务时,怎么办?
    • 将采用spring cloud alibaba sentinel进行解决。
    • 在学习sentinel之前,先了解相关的观念。

正文

一. 微服务常见概念

1 服务雪崩

  • 服务雪崩:在整条链路的服务中,一个服务失败,导致整条链路的服务都失败的情形。
  1. 存在整条链路服务(Service A、Service B、Service C)
  2. Service A 流量突然性增加,导致Service B 和Service C 流量也增加。
  3. Service C 因为抗不住请求,变得不可用。导致Service B的请求变得阻塞。
  4. 当Service B的资源耗尽,Service B就会变得不可用。
  5. 最后 Service A 不可用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

2 服务熔断

  • 服务熔断:当下游的服务因为某种原因突然变得不可用响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

在这里插入图片描述

  1. 最开始处于closed状态,一旦检测到错误到达一定阈值,便转为open状态;

  2. 这时候会有个 reset timeout,到了这个时间了,会转移到half open状态;

  3. 尝试放行一部分请求到后端,一旦检测成功便回归到closed状态,即恢复服务;

3 服务降级

  • 什么是服务降级呢?
    • 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
    • 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!

4 熔断和降级的区别

  • 服务熔断和服务降级的区别?

    • 服务降级有很多种降级方式!如开关降级、限流降级、熔断降级!
    • 服务熔断属于降级方式的一种!
    • 当发生下游服务不可用的情况,熔断和降级必定是一起出现。
  • 服务降级大多是属于一种业务级别的处理,熔断属于框架层级的实现

  • 开关降级

    在配置中心配置一个开关(变量),在配置中心更改开关,决定哪些服务进行降级

5 Sentinel 介绍

  • Sentinel :一个高可用的流量控制与防护组件,保障微服务的稳定性。
  • Sentinel分为两个部分,sentinel-core与sentinel-dashboard。
    • sentinel-core 部分能够支持在本地引入sentinel-core进行限流规则的整合与配置。
    • sentinel-dashboard 则在core之上能够支持在线的流控规则与熔断规则的维护与调整等。

二. core:降级

在这里插入图片描述

1 现象1

  • 提供者搭建集群(8170/8270),调用者调用,此时关闭提供者的一个服务(8270)

  • 存在现象:访问8170成功访问,不能访问8270

    • RestTemplate:8170可访问,当访问8270时异常。稍等片刻只有8170.
  • 略有卡顿,稍等片刻后,不再卡顿。

2 现象2:

  • 提供者搭建集群(8170/8270),调用者调用,此时关闭提供者的所有服务

  • 现象:无法访问

    在这里插入图片描述

3 降级操作

  • 添加坐标

    在这里插入图片描述

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
    
  • 修改yml文件,开启feign对sentinel的支持

    在这里插入图片描述

    feign:
      sentinel:
        enabled: true
    
    
  • 修改启动类,开启feign

    在这里插入图片描述

    package com.czxy;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    /**
     * @author 薛慕昭
     * @email 18716011269@163.com
     */
    @SpringBootApplication
    @EnableDiscoveryClient  //服务发现
    @EnableFeignClients     //远程调用
    public class TestNacosConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(TestNacosConsumerApplication.class, args );
        }
    }
    
    
    
  • 修改Feign实现

    在这里插入图片描述

    package com.czxy.feign;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    /**
     * @author 薛慕昭
     * @email 18716011269@163.com
     */
    // @FeignClient(value = "服务名", path = "controller配置的路径" )
    @FeignClient(value = "service-provider", fallback = EchoFeignFallback.class )
    public interface EchoFeign {
    
        // 与 nacos-provider-2.1>EchoController声明的方法的完全一致
        @GetMapping("/echo/{string}")
        public String echo(@PathVariable String string);
    }
    
    
    
    package com.czxy.feign;
    
    import org.springframework.stereotype.Component;
    
    /**
     * @author 薛慕昭
     * @email 18716011269@163.com
     */
    @Component
    public class EchoFeignFallback implements EchoFeign {
        @Override
        public String echo(String string) {
            return "降级处理:" + string;
        }
    }
    
    
    
  • 关闭服务提供者,测试

    • 注意:需重启服务

    在这里插入图片描述

三. dashboard 控制面板

1 概述

  • Sentinel Dashboard 是一个可视化流控管理工具。

  • Sentinel Dashboard 是一个独立的项目,sentinel-dashboard-1.8.4.jar,需要使用 java -jar 运行

    java -jar -Dserver.port=18080 sentinel-dashboard-1.8.4.jar
    
    

    在这里插入图片描述

  • 下载地址

    https://github.com/alibaba/Sentinel/releases
    
    

2 配置dashboard

  • 添加坐标(已有)

    <!-- 降级 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
    
  • 配置yml

    #server.port=8071
    #spring.application.name=service-consumer
    #spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    #spring.cloud.sentinel.transport.dashboard=192.168.152.153:8080
    #端口号
    server:
      port: 8071
    
    spring:
      application:
        name: service-consumer          #服务名
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848   #nacos服务地址
        sentinel:
          transport:
            dashboard: 127.0.0.1:18080
    feign:
      sentinel:
        enabled: true
    
    
    
  • 测试

    • 先访问资源 http://localhost:8071/feign/echo/123

    • dashboard 登录

      在这里插入图片描述

    • 查看控制面板 http://localhost:18080/

      在这里插入图片描述

3 设置资源点(埋点)

  • 通过 @SentinelResource 注解,设置监控点(定义控制资源、配置控制策略)

    package com.czxy.nacos.controller;
    
    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.czxy.nacos.feign.TestFeign;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    /**
     * @author 薛慕昭
     * @email 18716011269@163.com
     */
    @RestController
    @RequestMapping("/feign")
    public class TestFeignController {
        @Resource
        private TestFeign testMyFeign;
    
        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
        @SentinelResource("/feign/echo")
        public String echo(@PathVariable String str) {
            return testMyFeign.echo(str);
        }
    }
    
    
    
  • 测试

    在这里插入图片描述

四. 限流

1 编写测试类

在这里插入图片描述

package com.czxy.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 薛慕昭
 * @email 18716011269@163.com
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/login")
    public String login(String str) {
        return "登录成功" + str;
    }


    @GetMapping("/register")
    public String register(String str) {
        return "注册成功";
    }
}

2 限流方法

  • 通过@SentinelResource注解的blockHandler属性制定限流的处理函数
package com.czxy.nacos.controller;

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

/**
 * @author 薛慕昭
 * @email 18716011269@163.com
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/login")
    // 限流设置
    @SentinelResource(value="login", blockHandler = "loginBlockHandler")
    public String login(String str) {
        return "登录成功" + str;
    }

    public String loginBlockHandler(String str , BlockException e) {
        return str + ": 请稍后重试";
    }

    @GetMapping("/register")
    public String register(String str) {
        return "注册成功";
    }
}


3 限流操作

  • 运行 sentinel-dashboard-1.8.4.jar

  • 访问测试功能:http://localhost:8071/user/login?str=1234

  • 通过 dashboard 设置限流

    • QPS:一般指每秒查询率

    在这里插入图片描述

  • 连续快速2次访问测试功能

    在这里插入图片描述

五. 熔断降级

1 降级方法

  • 使用@SentinelResource注解的fallback属性来指定降级的方法名
package com.czxy.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 薛慕昭
 * @email 18716011269@163.com
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/login")
    // 限流设置
    @SentinelResource(value="login", blockHandler = "loginBlockHandler")
    public String login(String str) {
        return "登录成功" + str;
    }

    public String loginBlockHandler(String str , BlockException e) {
        return str + ": 请稍后重试";
    }


    @GetMapping("/register")
    // 熔断降级
    @SentinelResource(value="register", fallback = "registerFallback")
    public String register(String str) {
        int r = RandomUtils.nextInt(10);
        if(r < 5) {
            int i = 1 / 0;
        }
        return "注册成功";
    }

    public String registerFallback(String str) {
        return str + ": 熔断降级";
    }
}

2 测试

  • 成功

    在这里插入图片描述

  • 熔断降级

    在这里插入图片描述

3 降级操作

  • 慢调用比例:
    • RT:平均响应时间
    • 比例阈值:
    • 熔断时长:
    • 最小请求数:
  • 异常比例:每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态
  • 异常数:当资源近 1 分钟的异常数目超过阈值之后会进行熔断

在这里插入图片描述

六. 限流和降级的区别?

  • 限流是通过设置QPS(每秒查询率)/线程数,将超过阈值部分拒绝处理;
  • 服务降级是监控请求响应时间、响应异常比例、异常数量;超过限定阈值,将进行服务降级熔断,一定时间内不可用;

结尾

k(String str) {
return str + “: 熔断降级”;
}
}




### 2 测试

* 成功

  [外链图片转存中...(img-EtoFL8NX-1705283262451)]

* 熔断降级 

  [外链图片转存中...(img-SNdK9B8Y-1705283262451)]





### 3 降级操作

* 慢调用比例:
  * RT:平均响应时间
  * 比例阈值:
  * 熔断时长:
  * 最小请求数:
* 异常比例:每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态
* 异常数:当资源近 1 分钟的异常数目超过阈值之后会进行熔断

[外链图片转存中...(img-7eNiRPkH-1705283262452)]







## 六. 限流和降级的区别?

* 限流是通过设置QPS(每秒查询率)/线程数,将超过阈值部分拒绝处理;
* 服务降级是监控请求响应时间、响应异常比例、异常数量;超过限定阈值,将进行服务降级熔断,一定时间内不可用;

# 结尾

   Sentinel的降级、限流、熔断等功能为我们构建健壮的分布式系统提供了强有力的支持。通过合理地设置各项保护和控制策略,我们可以更好地抵御恶劣环境下的挑战,保持系统的稳定和可靠。因此,在设计和实现分布式系统时,充分利用Sentinel的功能将是一个明智的选择,它将为系统的高可用性和稳定性保驾护航。

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

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

相关文章

边缘数据采集网关无法上传数据是什么原因?如何解决?

边缘数据采集网关是物联网系统中的常见设备&#xff0c;主要用途包括数据采集、协议转换、边缘数据处理、数据传输分发等&#xff0c;实现多设备和多系统的互联互通和数据协同应用&#xff0c;对于提高物联网感知和响应效率、加强物联网联动协同能力、提升数据安全性等方面都具…

MATLAB实验Simulink的应用

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740734 一、实验目的 1.熟悉Simulink操作环境。 2.掌握建立系统仿真模型以及系统仿真分析的方法。 二、实验内容 1.利用Simulink仿真下列曲…

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换&#xff0c;则是需要进行跨网络、跨网段甚至跨组织地进行数据交互&#xff0c;对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…

【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介 UC的关键特性 之所以DataBricks要用UC&#xff0c; 很大程度是对安全的管控。从上文可以了解到它的四大特性&#…

Python 以相对/绝对路径的方式压缩文件

文章目录 1. tarfile 简单介绍2. tarfile 支持的模式3. 绝对路径压缩4. 相对路径压缩5. 参考 1. tarfile 简单介绍 Python 的 tarfile 模块提供了对 .tar 格式归档文件的全面支持&#xff0c;允许用户创建、读取、修改和写入 tar 归档文件。在实际应用中&#xff0c;tar 文件通…

护眼台灯是智商税吗?写作业使用的护眼台灯推荐

在当今社会&#xff0c;越来越多的人在工作和生活中长时间地盯着电脑屏幕或手机屏幕&#xff0c;给眼睛带来了很大的压力和损害。为了缓解眼睛的疲劳和不适&#xff0c;护眼台灯成为了很多人的选择。然而&#xff0c;市场上的护眼台灯种类繁多&#xff0c;价格各异&#xff0c;…

M-A352AD10高精度三轴加速度计

一般描述 M-A352是一种三轴数字输出加速度计&#xff0c;具有超低噪声、高稳定性、低功耗等特点&#xff0c;采用了夸特的精细处理技术。. 多功能M-A352具有高精度和耐久性&#xff0c;非常适合广泛的具有挑战性的应用&#xff0c;如SHM、地震观测、工业设备的状态监测和工业…

pandas查看数据常用方法(以excel为例)

目录 1.查看指定行数的数据head() 2. 查看数据表头columns 3.查看索引index 4.指定索引列index_col 5.按照索引排序 6.按照数据列排序sort_values() 7.查看每列数据类型dtypes 8.查看指定行列数据loc 9.查看数据是否为空isnull() 1.查看指定行数的数据head() &#xff…

软信天成:数据安全管理解决方案分享

近年来&#xff0c;随着数据环境日趋复杂多变和潜在的数据隐私泄露风险潜伏&#xff0c;如何确保企业数据安全已成为众多企业亟待面对与妥善处理的重要问题。 为了应对这一严峻的现实挑战&#xff0c;软信天成凭借专业的知识体系和丰富的实战经验积累&#xff0c;总结出了一套…

Java实现海南旅游景点推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

计算机组成原理-程序中断(基本概念 中断分类 流程 )

文章目录 总览中断的基本概念中断请求的分类中断请求标记中断判优-实现中断判优-优先级设置中断处理过程-中断隐指令中断处理过程-中断服务程序小结 总览 中断的基本概念 中断隐指令就是修改PC的值到中断服务程序 在每条指令执行完后&#xff0c;在指令周期末尾检查是否有中断…

【linux】软链接创建(linux的快捷方式创建)

软连接的概念 类似于windows系统中的快捷方式。有的文件目录很长或者每次使用都要找很不方便&#xff0c;于是可以用类似windows的快捷方式的软链接在home&#xff08;初始目录类似于桌面&#xff09;上创建一些软链接方便使用。 软链接的语法 ln -s 参数1 参数2 参数1&#…

批评与自我批评组织生活会发言材料2024年六个方面

生活就像一场马拉松&#xff0c;成功需要坚持不懈的奔跑。每一步都可能会遇到挫折和困难&#xff0c;但只要你努力向前&#xff0c;坚持不放弃&#xff0c;你就一定能够迎接胜利的喜悦。不要害怕失败&#xff0c;因为失败是成功的垫脚石。相信自己的能力&#xff0c;追求自己的…

反射助你无痛使用Semantic Kernel接入离线大模型

本文主要介绍如何使用 llama 的 server 部署离线大模型&#xff0c;并通过反射技术修改 Semantic Kernel 的 OpenAIClient 类&#xff0c;从而实现指定端点的功能。最后也推荐了一些学习 Semantic Kernel 的资料&#xff0c;希望能对你有所帮助。 封面图片&#xff1a; Dalle3 …

Java零基础教学文档servlet(1)

【Web开发和HTTP协议】 1. Web开发概述 1.1 web概述 万维网&#xff08;英语&#xff1a;World Wide Web&#xff09;亦作WWW、Web、全球广域网&#xff0c;是一个透过互联网访问的&#xff0c;由许多互相链接的超文本组成的信息系统。英国科学家蒂姆伯纳斯-李于1989年发明了…

更换为mainwindow.ui更新工程架构

文章目录 前言一、新建带mainwindow.ui的工程1.新建工程2. 添加工程模块添加opencv的库3.添加资源3.1工程上添加资源3.2引用资源 4.添加曲线文件4.1 复制关键文件到新工程4.2 新进显示曲线的ui带.h的为了方面名字取一样4.3添加曲线显示控件4.4 添加工具 5. 添加曲线.h文件内容6…

OpenCV-Python(39):Meanshift和Camshift算法

目标 学习了解Meanshift 和Camshift 算法在视频中找到并跟踪目标 Meanshift 原理 Meanshift算法是一种基于密度的聚类算法&#xff0c;用于将数据点划分为不同的类别。它的原理是通过数据点的密度分布来确定聚类中心&#xff0c;然后将数据点移动到离其最近的聚类中心&#…

UIAlertController简单使用-swift

UIAlertControlle时IOS的对话框控制器&#xff08;警报控制器&#xff09;&#xff0c;简单使用方法如下&#xff1a; 步骤都一样&#xff0c;先是创建UIAlertController&#xff0c;然后创建UIAlertAction&#xff0c;再将UIAlertAction添加到UIAlertController中&#xff0c;…

PyTorch深度学习实战(30)——Deepfakes

PyTorch深度学习实战&#xff08;30&#xff09;——Deepfakes 0. 前言1. Deepfakes 原理2. 数据集分析3. 使用 PyTorch 实现 Deepfakes3.1 random_warp.py3.2 Deepfakes.py 小结系列链接 0. 前言 Deepfakes 是一种利用深度学习技术生成伪造视频和图像的技术。它通过将一个人的…

TongLINKQ(2):TongLINKQ服务端安装

1 安装前的准备 明确应用&#xff08;JDK&#xff09;和TongLINK/Q的版本、位数&#xff08;要么都是32位&#xff0c;要么都是64位&#xff09;TLQ安装程序使用InstallAnywhere打包而成&#xff0c;因此需要JDK1.5及以上版本。 2 安装步骤 3 选择安装安装包 目前TongLINKQ的…