Spring Cloud Sentinel配置

Spring Cloud Sentinel

文章目录

      • Spring Cloud Sentinel
        • 1. Sentinel Dashboard 启动
        • 2. Spring Cloud 客户端配置
        • 3. Sentinel Dashboard 限流配置
          • 流控模式
            • 直连
            • 关联
            • 链路
          • 流控规则
            • 快速失败
            • Warm Up
            • 排队等待
        • 4. Sentinel Dashboard 熔断配置
        • 5. Sentinel Dashboard 热点配置

1. Sentinel Dashboard 启动
  1. 下载sentinel dashboard jar包
  2. sentinel dashboard启动在8889端口上
    java -jar -Dserver.port=8889 sentinel-dashboard-1.8.8.jar
    在这里插入图片描述
  3. 打开dashboard页面
    http://localhost:8889
    默认用户名密码都是sentinel
2. Spring Cloud 客户端配置
  1. 引入sentinel客户端
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. application.yaml文件添加sentinel客户端配置
spring:
  application:
    name: stock-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8889 # dashboard服务所在的地址跟ip
        client-ip: 192.168.0.5 # 这里是程序所在的客户端ip,使用ipconfig命令查看,不配置无法再dashboard上显示当前服务
  1. 打开dashboard页面,由于Sentinel Dashboard是惰性加载,此时簇点链路不会有服务的信息跟服务的接口信息,需要我们调用接口,才会在上面显示
    在这里插入图片描述
  2. 调用order-service的/order/add接口后可以看到比上图增加了一个/order/add接口. 在这里插入图片描述
3. Sentinel Dashboard 限流配置
流控模式

流控模式有三种,直连,关联跟链路
在这里插入图片描述

直连

限制并发过高问题,防止当前程序崩溃,限制当前接口的qps,设置为5,可以在流控规则中看到
在这里插入图片描述
发起压测,并发10个,只能通过5个,不限流的话10个请求时都可以通过的
在这里插入图片描述


关联

关联用于两个接口间的资源竞争
这里有两个接口/order/{productId}跟/order/add接口,一个接口是订单查询,一个接口是订单新增后,因为两者都要去操作数据库的订单表,所以可能存在数据库资源抢占问题,一般认为订单的新增接口优先级比订单查询接口高,所以当/order/add的QPS达到某个阈值时,对优先级低的/order/{productId}接口进行限流,这里设置当/order/add的QPS达到5时(只是一个监控,不会限制add接口的QPS),/order/{productId}接口进行限流
在这里插入图片描述


同时发起/order/add接口跟/order/{productId}接口的压测,add接口都成功,QPS是8,不会被上图设置的QPS=5限制住,/order/{productId}则是因为add接口的QPS达到8,直接限制了接口,拒绝请求

/order/add并发:
/order/add关联并发情况


/order/{productId}并发:
/order/{productId}关联并发情况


链路

链路主要是资源分配,对同一个资源有多个入口的情况下,限制该资源的访问

  1. Service类通过@SentinelResource定义一个方法为资源,/order/add接口跟/order/{productId}接口都会调用到这个服务,add是新增后查询,/order/{productId}是直接查询
    @Override
    @SentinelResource(value = "order")
    public TProduct getProduct(String productId) {
        return productMapper.selectById(productId);
    }
  1. 客户端的spring.cloud.sentinel.web-context-unify的默认值是true,资源是聚合的,这里的入口资源是sentinel_web_servlet_context,顶层的入口,统一对资源进行限流,两个接口共享资源的QPS,同一时间两个接口并发的总QPS为5
    资源共享链路配置

同时发起/order/add接口跟/order/{productId}并发请求10s,可以看到 两个接口的成功数(5+46)/并发时间10s = 5QPS
/order/add并发:
/order/add接口链路并发情况


/order/{productId}并发:
/order/{productId}接口链路并发情况


  1. spring.cloud.sentinel.web-context-unify设置为false,则入口资源可以分别单独设置为/order/add接口跟/order/{productId},将对不同接口进行限流
spring:
  application:
    name: order-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8889
        client-ip: 192.168.0.5
      web-context-unify: false

/order/{productId}链路并发设置
QPS大概是5
/order/{productId}链路并发情况


流控规则

流控规则也有三种快速失败Warm Up排队等待

快速失败

快速失败就是之前例子展示的,达到阈值时,拒绝请求:
在这里插入图片描述


Warm Up

Warm Up代表一个预热过程,使用场景是刚启动时需要一些耗时的准备工作的接口,例如刚开始需要跟其他系统建立长连接的接口,待接口逐渐建立长连接时,接口能处理的请求量也逐渐上升

客户端流控配置有个coldFactor,默认值是3,例如我们设置的PQS是12,预热时间是4s,一开始访问请求时,能达到的 起始QPS=设置的QPS/coldFactor=12/3=4,之后在4s内QPS逐渐上升到12

spring.cloud.sentinel.flow.coldFactor:
在这里插入图片描述
Warm Up流控配置:
在这里插入图片描述


接口进行4s的压测,预测下请求成功数,这里可以看成是求梯形的面积,(上底是4QPS+下底12QPS)*4秒 / 2 = 32,压测结果成功的请求数是34,差不多:
在这里插入图片描述


查看dashboard的接口监控,可以看到接口在4s内,QPS由起始的4达到最终的12:
在这里插入图片描述


排队等待

排队等待就是让当前无法处理的请求进入等待队列,等待超时时间,等待期间如果可以处理则处理,等待超时则拒绝,可以应对某个时间段峰值请求,当某个时间段有大量请求进入,又不想抛弃这些请求,就让这些请求进入队列等待处理或超时。

等待队列设置,QPS为5,等待时间为2s:
在这里插入图片描述


接口并发测试如下
10个并发请求:

  1. 第1s进来10个请求,按照5个5个划分为A、B两组请求,每组5个请求
  2. 第1s,A组的5个请求被处理,B组等待1s
  3. 第2s,A组5个已处理完成,B组5个还未超时,则再处理B组的5个请求
  4. 预测10个请求都被处理完成

队列等待10个并发请求


接下来是并发15个请求

  1. 第1s进来15个请求,按照5个5个划分为A、B、C三组请求,每组5个请求
  2. 第1s,A组的5个请求被处理,B组跟C组共10个等待1s
  3. 第2s,A组5个已处理完成,B组5个还未超时,则再处理B组的5个请求,C组的5个请求等待1s
  4. 第3s,A组跟B组共10个请求已处理完成,但是此时C组已经等待了2s,达到了超时时间,C组不会被处理
  5. 预测大约10个请求被处理,5个请求被拒绝
    队列等待15个并发请求

4. Sentinel Dashboard 熔断配置

熔断是上级微服务调用下级微服务时,下级微服务如果出现超时或者异常达到一定比例时,则下次调用下级接口时,需要在上级微服务层面上不去调用下级微服务,所以上级微服务的调用框架需要跟Sentinel有所关联,这里微服务调用框架使用的Feign,需要开启Feign跟Sentinel之间的联系,在Feign调用其他微服务接口前,使用Sentinel进行判断是否熔断。

  1. application.yaml中配置feign开启sentinel
feign:
  sentinel:
    enabled: true

这样Sentinel就会使用SpringBoot的自动装配修改Feign.Builder,往Feign相关代码中加入Sentinel相关代码

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ SphU.class, Feign.class })
public class SentinelFeignAutoConfiguration {

	@Bean
	@Scope("prototype")
	@ConditionalOnMissingBean
	@ConditionalOnProperty(name = "feign.sentinel.enabled")
	public Feign.Builder feignSentinelBuilder() {
		return SentinelFeign.builder();
	}

}
  1. Sentinel 的熔断配置
    客户端添加了Feign跟Sentinel相关联的配置后,重启再调用接口,可以看到下次服务的资源
    在这里插入图片描述

对该资源添加熔断配置:

  • RT配置200ms,代表一个请求的响应时长超出200ms就代表着慢调用
  • 比例阈值0.1代表统计时间内10%的请求超过200ms就进行熔断
  • 最小请求数5代表统计时长内如果有超过5个请求,才会触发该熔断器,进行阈值判断
  • 熔断时长代表熔断器生效时,10s内无法调用下级接口
  • 统计时长就是统计这段时间内的请求,这里是统计1s内的请求
    在这里插入图片描述
  1. 程序模拟上级服务是OrderService,下级服务是StockService集群,其中StockService2修改接口内容,调用该接口时,当前线程会sleep 300ms,这样就超过了上面配置的RT时间
X
OrderService
StockService1
StockService2
	@ResponseBody
    @GetMapping("reduceProduct")
    public String reduce(@RequestParam("productId") String productId, @RequestParam("num") int num) {
        System.out.println("Current Time:" + LocalDateTime.now() + " Reduce Product:" + productId + " for:" + num);
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "SUCCESS";
    }
  1. 并发请求
    并发10次,由于Feign使用的轮询策略,所以OrderServce会两个下级服务各调用5次,这样慢请求的比例会达到0.5,这次统计窗口就会触发熔断:
    第一次调用触发熔断

下一次统计窗口再发起请求时就不会调用下级服务,10个请求都失败:
在这里插入图片描述
这里原本以为熔断是熔断集群内的一个微服务节点(StockService2),但是发现其实是整个下级微服务集群的某个接口的熔断,查看代码确实是熔断的一个集群:
SentinelFeign.Builder返回了一个SentinelInvocationHandler
在这里插入图片描述


代理方法中methodHandler.invoke是Feign的原逻辑,根据服务名选择具体的微服务进行调用,上面的SphU.entry则是Sentinel处理一些流控或者熔断逻辑,如果被熔断就会走catch异常语句:
在这里插入图片描述


往里面走会获取到一个chain对象,是一个ProcessorSlot链对象,chain.entry()方法来对请求进行判断,是否需要熔断降级:
在这里插入图片描述


其中的一个实现类是DegradeSlot,在判断的时候,拿的是ResourceName是GET:http://stock-service/stock/reduceProduct,没有区分出是哪一个下级微服务(StockService1 or StockService2),只要tryPass匹配不通过,直接就往外抛DegradeException,后面的Feign原逻辑就不会往下走去调用下级微服务了。
在这里插入图片描述

5. Sentinel Dashboard 热点配置

热点配置是对接口的热点数据进行限制,比如/order/{productId},productId代表产品id,产品有热销跟不热销产品,在秒杀系统时,某些产品的访问量会比其他产品多。

  1. 热点配置只对@SentinelResource有限制反应,无法直接对某个接口进行热点限制,在查询接口上添加@SentinelResource
    @ResponseBody
    @GetMapping("/{productId}")
    @SentinelResource("query")
    public TProduct getProduct(@PathVariable("productId") String productId) {
        TProduct product = tProductService.getProduct(productId);
        return product;
    }
  1. 全局热点配置
  • 参数索引0,代表一个参数,即productId,不管productId是什么,查询阈值都是10
  • 单机阈值10QPS
    在这里插入图片描述
  1. 全局并发测试
    同时发起100045跟1000455产品的请求,并发5s,两个请求成功数都是50,可以看到两个不同商品的QPS互不影响,都是10

100045:
在这里插入图片描述


1000455:
在这里插入图片描述

  1. 例外热点配置
    热点规则的高级选项可以配置例外项,这里配置100046的QPS为15,注意参数类型一定要跟后端接口的参数类型对得上,否则例外配置不会生效:
    在这里插入图片描述
  2. 例外项并发测试
    100046产品并发5s,成功数是75,QPS是15
    在这里插入图片描述

100045的QPS没有变,还是10
在这里插入图片描述

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

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

相关文章

MEMC功能详解

文章目录 MEMC的工作原理&#xff1a;优点&#xff1a;缺点&#xff1a;适用场景&#xff1a;1. Deblur&#xff08;去模糊&#xff09;2. Dejudder&#xff08;去抖动&#xff09;总结两者区别&#xff1a; MEMC&#xff08;Motion Estimation and Motion Compensation&#x…

打破“几何第五公设不可证明”的神话——黄氏平行定义使证明第五公设易如反掌

黄小宁 绿色图片中的直线平行的定义&#xff08;此定义可推广为相应的平面平行的定义&#xff09;使人能根据几何常识一下子证明第五公设从而表明“2000年都无人能解决的世界著名数学难题”其实是一个天大的笑话。

Linux 手撕线程池

前言 线程池 是 池化技术 中很典型的一个&#xff0c;它旨在高效的管理和复用线程资源&#xff01;在现在的计算机体系中&#xff0c;线程是执行任务&#xff08;调度&#xff09;的基本单位。然而&#xff0c;频繁的创建和销毁线程也会带来较大的开销&#xff0c;包括系统资源…

RISC-V笔记——Pipeline依赖

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…

ECCV‘24 | WTConv:小参数大感受野,基于小波变换的新型卷积

前言 近年来&#xff0c;人们尝试增加卷积神经网络&#xff08;CNN&#xff09;的卷积核大小&#xff0c;以模拟视觉Transformer&#xff08;ViTs&#xff09;自注意力模块的全局感受野。然而&#xff0c;这种方法很快就遇到了上限&#xff0c;并在实现全局感受野之前就达到了饱…

鸿蒙原生应用扬帆起航

就在2024年6月21日华为在开发者大会上发布了全新操作的系统HarmonyOS Next开发测试版&#xff0c;网友们把它称之为“称之为纯血鸿蒙”。因为在此之前鸿蒙系统底层式有两套基础架构的&#xff0c;一套是是Android的AOSP&#xff0c;一套是鸿蒙的Open Harmony&#xff0c;因为早…

一篇文章教你完成软件验收测试,项目结题不再难

在软件开发过程中&#xff0c;验收测试是项目结题前的最后一道关卡。能否顺利通过验收测试&#xff0c;直接关系到项目的成功与否。 了解软件验收测试的重要性 软件验收测试是项目开发周期中的关键环节&#xff0c;其主要目的是检验软件是否满足用户需求、设计规范和合同要求…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值&#xff08;1&#xff09;、返回值不仅可以赋给变量&#xff0c;也可以被用作表达式的一部分。&#xff08;2&#xff09;、返回值不一定是变量的值&#x…

机器视觉入门基础相关概念一 ——单目相机模型

机器视觉入门基础相关概念 相机模型 引言介绍&#xff1a;如果只是希望获取图像上的一些信息&#xff08;例如特征提取、拟合等&#xff09;&#xff0c;那么我们不会对三维空间中相机的位置有所要求。但如果希望通过二维的图像去理解三维空间中摄像机的信息&#xff0c;或者是…

简单三步完成 Telegram 生态的 Web3 冷启动

在竞争激烈的 Web3 领域&#xff0c;强有力的启动往往能决定成败。Telegram 无疑当下最火热的流量池&#xff0c;是很多 Web3 项目冷启动阶段的必选项。 但眼看着好多项目在 Telegram 生态火速获取百万级甚至千万级别的用户&#xff0c;自己的项目要怎么开始做增长&#xff0c;…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接&#xff0c;切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

nginx过滤模块怎么生效的

在nginx中&#xff0c;如果你要开发一个过滤模块&#xff0c;config中必须要加 HTTP_FILTER_MODULES$HTTP_FILTER_MODULES xxx 否则&#xff0c;即使在postconfiguration回调中加了ngx_http_top_header_filtermy_xxxx_filter_handle&#xff0c;最终my_xxxx_filter_handle也不…

PTA L1系列题解(C语言)(L1_081 -- L1_088)

L1-081 今天我要赢 题目内容&#xff1a; 2018 年我们曾经出过一题&#xff0c;是输出“2018 我们要赢”。今年是 2022 年&#xff0c;你要输出的句子变成了“我要赢&#xff01;就在今天&#xff01;”然后以比赛当天的日期落款。 输入格式&#xff1a; 本题没有输入。 输…

聊聊ASSERT处理在某些场景下的合理用法

先看看ASSERT的介绍&#xff1a; 编写代码时&#xff0c;我们总是会做出一些假设&#xff0c;ASSERT断言就是用于在代码中捕捉这些假设&#xff0c;可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式&#xff0c;程序员相信在程序中的某个特定点该表达式值为真…

数据结构编程实践20讲(Python版)—20并查集

本文目录 20 并查集&#xff08;Union-Find Set&#xff09;S1 说明并查集的定义并查集基本操作并查集优化并查集特点应用领域 S2 示例S3 问题1&#xff1a;朋友圈问题S4 问题2&#xff1a;网络连接恢复问题S5 问题3&#xff1a;随机生成迷宫 往期链接 01 数组02 链表03 栈04 …

【热门】用ChatGPT做智慧农业云平台——农业ERP管控系统

随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…

vue3中监视 Reactive对象中的属性

watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组 一、框架&#xff1a; <template><div class"divBox"><h2>姓名&#xff1a;{{ person.…

2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

一、单选题 1、下列选项中关于 turtle.color(red) 语句的作用描述正确的是&#xff1f;&#xff08; &#xff09; A. 只设置画笔的颜色为红色 B. 只设置填充的颜色为红色 C. 设置画笔和填充的颜色为红色 D. 设置画笔的颜色为红色&#xff0c;设置画布背景的颜色为红色 正…

告别ELK,APO提供基于ClickHouse开箱即用的高效日志方案——APO 0.6.0发布

ELK一直是日志领域的主流产品&#xff0c;但是ElasticSearch的成本很高&#xff0c;查询效果随着数据量的增加越来越慢。业界已经有很多公司&#xff0c;比如滴滴、B站、Uber、Cloudflare都已经使用ClickHose作为ElasticSearch的替代品&#xff0c;都取得了不错的效果&#xff…

C#教程笔记

C#开发的程序依附.NET平台 编译器->IL中间语言->CLR->机器指令 .NET CORE平台 跨平台 .cs后缀名 快捷键 CtrlKD格式化CtrlL或CtrlX删除一行CtrlY反撤销cwTab快速生成命令行输出Ctrl空格或CtrlJ获取提示///方法注释CtrlMO代码全部折叠CtrlML代码全部展开 上升沿0变1 安…