06-Sentinel限流熔断应用实践(1)-程序员宅基地

技术标签: 程序员  sentinel  spring boot  java  

@GetMapping(“/sentinel02”)

public String doSentinel02(){

return “sentinel 02 test …”;

}

第二步:在sentinel中做限流设计,例如

在这里插入图片描述

第三步:打开两个测试窗口,对/provider/sentinel02进行访问,检查/provider/sentinel01的状态,例如:

在这里插入图片描述

链路模式

链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流,在B业务中是不受影响的。现在对链路模式做一个实践,例如:

例如现在设计一个业务对象,代码如下(为了简单,可以直接写在启动类内部):

第一步:在指定包创建一个ResourceService类,代码如下:

package com.jt.provider.service;

@Service

public class ResourceService{

@SentinelResource(“doGetResource”)

public String doGetResource(){

return “doGetResource”;

}

}

第二步:在ProviderSentinelController中添加一个方法,例如:

@Autowired

private ResourceService resourceService;

@GetMapping(“/sentinel03”)

public String doSentinel03() throws InterruptedException {

resourceService.doGetResource();

return “sentinel 03 test”;

}

第三步:在sentinel中配置限流规则,例如:

在这里插入图片描述

在这里插入图片描述

设置链路流控规则后,再频繁对限流链路进行访问,检测是否会出现500异常,例如

在这里插入图片描述

说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在springboot配置文件application.yml中,添加如下语句来关闭URL PATH聚合,例如:

sentinel:

web-context-unify: false

当设置了这个配置后,启动服务,就可以对指定的特定链路进行限流了。

还有,当我们也可以基于@SentinelResource注解描述的方法进行限流后的异常进行自定义处理,其步骤如下:

第一步:定义blockHandlerClass,例如:

package com.jt.provider.service;

import com.alibaba.csp.sentinel.slots.block.BlockException;

import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Component;

@Slf4j

@Component

public class ResourceBlockHandler {

/**

  • 限流后的异常处理方法,应用于@SentinelResource注解中,

  • 此方法在编写时有如下几个要求:

  • 1)方法修饰符为public

  • 2)必须为static方法

  • 3)返回值类型与@SentinelResource注解描述的方法相同

  • 4)参数类型为BlockException

  • 5)方法名自己定义

  • @param ex

  • @return

*/

public static String doHandle(BlockException ex){

log.error(“block exception {}”, ex.getMessage());

return “访问太频繁了,稍等片刻再访问”;

}

}

第二步:修改@SentinelResource注解中的属性定义,例如:

@SentinelResource(value=“doGetResource”,

blockHandlerClass = ResourceBlockHandler.class,

blockHandler = “doHandle”)

public String doGetResource(){

return “do get resource”;

}

第三步:在controller方法中,调用@Sentinel注解描述的方法,例如:

/**

  • 演示链路限流

  • @return

*/

@GetMapping(“/sentinel03”)

public String doSentinel03(){

return resourceService.doGetResource();

//return “sentinel 03 test”;

}

小节面试分析


  • 你了解sentinel中的阈值应用类型吗?(两种-QPS,线程数)

  • Sentinel的限流规则中默认有哪些限流模式?(直连,关联,链路)

  • Sentinel的限流效果有哪些?(快速失败,预热,排队)

Sentinel降级应用实践

========================================================================

概述


除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

准备工作


在ProviderController 类中添加doSentinel05方法,基于此方法演示慢调用过程下的限流,代码如下:

//AtomicLong 类支持线程安全的自增自减操作

private AtomicLong atomicLong=new AtomicLong(1);

@GetMapping(“/sentinel05”)

public String doSentinel05() throws InterruptedException {

//获取自增对象的值,然后再加1

long num=atomicLong.getAndIncrement();

if(num%2==0){//模拟50%的慢调用比例

Thread.sleep(200);

}

return “sentinel 04 test”;

}

说明,我们在此方法中设置休眠,目的是为了演示慢调用(响应时间比较长).

Sentinel降级入门


接下来,我们基于一个请求链路,进行服务降级及应用实践,例如:

第一步:服务启动后,选择要降级的链路,如图所示:

在这里插入图片描述

第二步:选择要降级的链路,如图所示:

在这里插入图片描述

这里表示熔断策略选择"慢调用比例",表示请求数超过3时,假如平均响应时间超过200毫秒的有30%,则对请求进行熔断,熔断时长为20秒钟,10秒以后恢复正常。

第三步:对指定链路进行刷新,多次访问测试,检测页面上是否会出现限流(默认异常为DegradeException).

我们也可以进行断点调试,在DefaultBlockExceptionHandler中的handle方法内部加断点,分析异常类型,假如异常类型DegradeException则为降级熔断。

Sentinel 异常处理


系统提供了默认的异常处理机制,假如默认处理机制不满足我们需求,我们可以自己进行定义。定义方式上可以直接或间接实现BlockExceptionHandler接口,并将对象交给spring管理。

在这里插入图片描述

package com.jt.provider.controller;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;

import com.alibaba.csp.sentinel.slots.block.BlockException;

import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.PrintWriter;

import java.util.HashMap;

import java.util.Map;

/**

  • 自定义限流,降级等异常处理对象

*/

@Slf4j

@Component

public class ServiceBlockExceptionHandler

implements BlockExceptionHandler {

/**

  • 用于处理BlockException类型以及子类类型异常

*/

@Override

public void handle(HttpServletRequest request,

HttpServletResponse response,

BlockException e) throws Exception {

//设置响应数据编码

response.setCharacterEncoding(“utf-8”);

//告诉客户端响应数据的类型,以及客户端显示内容的编码

response.setContentType(“text/html;charset=utf-8”);

//向客户端响应一个json格式的字符串

//String str=“{“status”:429,“message”:“访问太频繁了”}”;

Map<String,Object> map=new HashMap<>();

map.put(“status”, 429);

map.put(“message”,“访问太频繁了”);

String jsonStr=new ObjectMapper().writeValueAsString(map);

PrintWriter out = response.getWriter();

out.print(jsonStr);

out.flush();

out.close();

}

}

小节面试分析


  • 何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不通)

  • 为什么要进行熔断呢?(平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)

  • Sentinel中限流,降级的异常父类是谁?(BlockException)

  • Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)

  • Sentinel中异常处理接口是谁?(BlockExceptionHandler)

  • Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)

  • 假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)

  • 我们如何自己定义Sentinel中异常处理呢?(直接或间接实现BlockExceptionHandler )

  • Sentinel熔断降级策略有哪些?(慢调用比例、异常比例、异常数)

Sentinel热点规则分析(重点)

============================================================================

概述


何为热点?热点即经常访问的数据。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制。

  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制。

热点参数限流会统计传入参数中的热点数据,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。其中,Sentinel会利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

快速入门


第一步:在sca-provider中添加如下方法,例如:

@GetMapping(“/sentinel/findById”)

@SentinelResource(“resource”)

public String doFindById(@RequestParam(“id”) Integer id){

return "resource id is "+id;

}

第二步:服务启动后,选择要限流的热点链路,如图所示:

在这里插入图片描述

第三步:设置要限流的热点,如图所示:

在这里插入图片描述

热点规则的限流模式只有QPS模式(这才叫热点)。参数索引为@SentinelResource注解的方法参数下标,0代表第一个参数,1代表第二个参数。单机阈值以及统计窗口时长表示在此窗口时间超过阈值就限流。

第四步:多次访问热点参数方法,前端会出现如下界面,如图所示:

在这里插入图片描述

然后,在后台出现如下异常表示限流成功。

com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException: 2

其中,热点参数其实说白了就是特殊的流控,流控设置是针对整个请求的;但是热点参数他可以设置到具体哪个参数,甚至参数针对的值,这样更灵活的进行流控管理。

一般应用在某些特殊资源的特殊处理,如:某些商品流量大,其他商品流量很正常,就可以利用热点参数限流的方案。

特定参数设计


配置参数例外项,如图所示:

在这里插入图片描述

其中,这里表示参数值为5时阈值为100,其它参数值阈值为1.

小节面试分析


  • 如何理解热点数据?(访问频度比较高的数据,某些商品、谋篇文章、某个视频)

  • 热点数据的限流规则是怎样的?(主要是针对参数进行限流设计)

  • 热点数据中的特殊参数如何理解?(热点限流中的某个参数值的阈值设计)

  • 对于热点数据的访问出现限流以后底层异常是什么?(ParamFlowException)

Sentinel系统规则(了解)

==========================================================================

概述


系统在生产环境运行过程中,我们经常需要监控服务器的状态,看服务器CPU、内存、IO等的使用率;主要目的就是保证服务器正常的运行,不能被某些应用搞崩溃了;而且在保证稳定的前提下,保持系统的最大吞吐量。

快速入门


Sentinel的系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load(负载)、RT(响应时间)、入口 QPS 、线程数和CPU使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。如图所示:

在这里插入图片描述

系统规则是一种全局设计规则,其中,

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

最后

由于篇幅原因,就不多做展示了
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

最后

[外链图片转存中…(img-ufOruVCS-1711530821009)]

[外链图片转存中…(img-krDLG8xR-1711530821009)]

[外链图片转存中…(img-zdFEdCxG-1711530821009)]

[外链图片转存中…(img-r6WErs8G-1711530821010)]

[外链图片转存中…(img-sgaqFKQB-1711530821010)]

[外链图片转存中…(img-VAJBgSFS-1711530821010)]

由于篇幅原因,就不多做展示了
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83703951/article/details/137083484

智能推荐

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

深度神经网络在训练初期的“梯度消失”或“梯度爆炸”的问题解决:数据标准化(Data Standardization),权重初始化(Weight Initialization),Dropout正则化等_在人工神经网络研究的初始阶段,辛顿针对训练过程中常出现的梯度消失现象, 提供相-程序员宅基地

文章浏览阅读101次。1986年,深度学习(Deep Learning)火爆,它提出了一个名为“深层神经网络”(Deep Neural Networks)的新型机器学习模型。随后几年,神经网络在图像、文本等领域取得了惊艳成果。但是,随着深度学习的应用范围越来越广泛,神经网络在遇到新的任务时出现性能下降或退化的问题。这主要是由于深度神经网络在训练初期面临着“梯度消失”或“梯度爆炸”的问题。_在人工神经网络研究的初始阶段,辛顿针对训练过程中常出现的梯度消失现象, 提供相

kill进程的几种方式_如何kill掉一个进程-程序员宅基地

文章浏览阅读461次。我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。,这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。命令:pid of xx进程,显示进程的进程号,同上pgrep。这是 kill 命令最主要的用法,也是本文要介绍的内容。_如何kill掉一个进程

随便推点

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

vscode打开markdown文件 不显示图片 预览markdown文件_vscodemarkdown图片无法显示-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏4次。vscode打开markdown文件 不显示图片 预览markdown文件_vscodemarkdown图片无法显示

推荐文章

热门文章

相关标签