Sentinel 降级、限流、熔断

news2024/11/27 6:14:09

前言

在现代分布式系统中,如何有效地保护系统免受突发流量和故障的影响,是每个开发人员和架构师都需要思考的重要问题。在这样的背景下,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的功能将是一个明智的选择,它将为系统的高可用性和稳定性保驾护航。

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

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

相关文章

宝塔 ftp 服务器发回了不可路由的地址/读取目录列表失败

ftp连接不上&#xff1a; 1.注意内网IP和外网IP 2.检查ftp服务是否启动 &#xff08;面板首页即可看到&#xff09; 3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 &#xff08;如是腾讯云/阿里云等还需检查安全组&#xff09; 4.是否主动/被动模式都不能连接…

Java学习笔记(七)——操作数组工具类Arrays

文章目录 ArraysArrays.toString()Arrays.binarySearch()Arrays.copyOf()Arrays.copyOfRange()Arrays.fill()Arrays.sort()升序排序降序排序 Arrays 操作数组的工具类。 Arrays.toString() import java.util.Arrays;public class test40 {public static void main(String[] a…

SAP S/4HANA 2023 Fully-Activated Appliance 虚拟机版介绍

注&#xff1a;市面上所有在售虚拟机均为拷贝本人所作的虚拟机&#xff0c;存在各种技术问题&#xff0c;请知悉。 SAP S4HANA 2023 FAA版本内置了四个Client&#xff1a; 1、000&#xff1a;SAP初始Client&#xff0c;原则上不能动&#xff1b; 2、100&#xff1a;只激活了US…

自己是如何使用单元测试

前言 自己是如何使用单元测试 进行单元测试能够让我们在编写方法的具体实现代码后&#xff0c;能清晰地看到其是否能实现预期的功能&#xff0c;有助于我们及时修正自己方法中存在的bug&#xff0c;以免在后续使用到某方法时出现意想不到的错误。 一、引入单元测试所使用的依赖…

MySQL基础笔记(9)事务

一.简介 所谓事务&#xff0c;是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求&#xff0c;即&#xff0c;这些操作要么同时成功&#xff0c;或者同时失败——OS中有原语不可分割的概念&…

网工每日一练(1月18日)

1.在下面关于VLAN的描述中&#xff0c;不正确的是 &#xff08; C &#xff09; 。 A、VLAN把交换机划分成多个逻辑上独立的交换机 B、主干链路&#xff08;Trunk&#xff09;可以提供多个VLAN之间通信的公共通道 C、由于包含了多个交换机&#xff0c;所以VLAN扩大了冲突域 D、…

高速CAN总线 C 或 B 节点发送 A节点接收 电压分析

CAN收发器放大图 CAN总线3节点框图&#xff0c;如下图 图① CAN总线 C 节点发送&#xff0c;B 节点接收简化后的逻辑框图如下图。 总线上 A B C 三个节点&#xff0c;按照CAN总线规定&#xff0c;首尾 A B 两个节点处需要接入1个120Ω的终端电阻&#xff0c;如下图&#xff1a…

Pyro —— Velocity Voxel Scale

Velocity Voxel Scale是H19.5引入的新参数&#xff0c;该参数可单独定义volume和速度体素&#xff1b;根据参数设置&#xff0c;可观察到模拟时间的显著变化&#xff1b; Velocity Voxel Scale对DOP和SOP均可用&#xff1b;对DOP设置&#xff0c;该参数在Smoke Object&#xf…

django admin后台中进行多个手机号解密消耗时间对比

需求&#xff1a; 1 手机号在数据库中是使用rsa方式加密存储&#xff0c;后台查看中需要转换为明文&#xff0c;因为需要解密多个手机号&#xff0c;所以在后台查看中消耗时间3秒&#xff0c;希望通过多线程&#xff0c;多进程&#xff0c;异步方式来缩短时间 相关注意点&…

JVM内存模型剖析

JDK体系结构 JDK&#xff1a;JDK提供了编译、运行Java程序所需的各种资源和工具&#xff1b;包括Java编译器&#xff0c;Java运行时环境&#xff1a;JRE&#xff1b;开发工具包括编译工具(javac.exe)打包工具(jar.exe)等。 JRE&#xff1a; 即JAVA运行时环境&#xff0c;JVM就…

小程序样例2:简单图片分类查看

基本功能&#xff1a; 1、根据分类展示图片&#xff0c;点击类目切换图片&#xff1a; 2、点击分类编辑&#xff0c;编辑分类显示&#xff1a; 3、点击某个分类&#xff0c;控制主页该分类显示和不显示&#xff1a; 类目2置灰后&#xff0c;主页不再显示 4、点击分类跳转到具…

大数据开发之kafka(完整版)

第 1 章&#xff1a;Kafka概述 1.1 定义 Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只…

Linux系统安装Samba服务器

在实际开发中&#xff0c;我们经常会有跨系统之间文件传递的需求&#xff0c;Samba 便是能够在 Windows 和 Linux 之间传递文件的服务&#xff0c;功能也是非常强大和好用&#xff0c;本篇文章将介绍如何在 Linux 系统上安装 Samba 服务&#xff0c;以 CentOS7 系统为例。 一、…

Java强软弱虚四大引用

文章目录 一、强引用二、软引用三、弱引用四、虚引用 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、强引用 在Java中&#xff0c;强引用&#xff08;Strong Reference&#xff09;是最常见的引用类型。当我们创建一个对象并将其赋值给一个变量时…

Spring Boot整合Spring Security:构建安全的Web应用

文章目录 1. 添加依赖2. 配置Spring Security3. 创建用户服务4. 控制器和视图5. 运行应用 Spring Security是一个强大的身份验证和访问控制框架&#xff0c;用于保护Spring应用程序。它提供了全面的安全服务&#xff0c;包括身份验证、授权、攻击防护等。本文将介绍如何在Spr…

让uniapp小程序支持多色图标icon:iconfont-tools-cli

前景&#xff1a; uniapp开发小程序项目时&#xff0c;对于iconfont多色图标无法直接支持&#xff1b;若将多色icon下载引入项目则必须关注包体&#xff0c;若将图标放在oss或者哪里管理&#xff0c;加载又是一个问题&#xff0c;因此大多采用iconfont-tools工具&#xff0c;但…

原码,补码的除法

目录 一.原码的除法 &#xff08;1&#xff09;恢复余数法 重点看这 &#xff08;2&#xff09;不恢复余数法&#xff08;加减交替法&#xff09; 重点看这 二. 补码除法运算 重点看这 我们已经学习了如何进行原码&#xff0c;补码的乘法&#xff1a; http://t.csdnimg…

【代码整理】基于COCO格式的pytorch Dataset类实现

import模块 import numpy as np import torch from functools import partial from PIL import Image from torch.utils.data.dataset import Dataset from torch.utils.data import DataLoader import random import albumentations as A from pycocotools.coco import COCO …

Spring MVC精解:技术内幕与最佳实践

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Spring MVC&#xff0c;它是Spring的一个模块&#xff0c;专门用来构建Web应用程序。提供了一种轻量级的方式来构建动态网页。就像小黑我刚开始接触Java时候一样&#xff0c;可能对这些听起来很高…

GitHub 一周热点汇总第6期(2024/01/14-01/20)

GitHub一周热点汇总第6期 (2024/01/14-01/20) &#xff0c;梳理每周热门的GitHub项目&#xff0c;这一周的热门项目中AI的比重难得的变低了&#xff0c;终于不像一个AI热门项目汇总了&#xff0c;一起来看看都有哪些项目吧。 #1Maybe 项目名称&#xff1a;Maybe - 个人理财应…