当前位置: 首页 > news >正文

springboot整合sentinel接口熔断

背景

请求第三方接口或者慢接口需要增加熔断处理,避免因为慢接口qps过大导致应用大量工作线程陷入阻塞以至于其他正常接口都不可用,最近项目测试环境就因为一个查询的慢接口调用次数过多,导致前端整个首页都无法加载。

依赖下载

  • springboot
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version>
</parent>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • sentinel dashboard
    下载地址:
    https://github.com/alibaba/Sentinel/releases
    版本:
    sentinel-dashboard-1.8.3.jar
    启动命令:
    java -Dserver.port=9000 -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.3.jar
  • sentinel springboot 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.0.1.0</version>
</dependency>

熔断尝试

使用SentinelResource注解

  • 编写慢接口
@RestController
@RequestMapping(path = "/user")
@RequiredArgsConstructor
@Slf4j
public class UserCtrl {private final IUserService userService;@GetMapping("/{id}")@SneakyThrows@SentinelResource(value = "findById", fallback = "findByIdExt")public User findById(@PathVariable("id") Long id) {TimeUnit.SECONDS.sleep(3);return userService.findById(id);}public User findByIdExt(Long id) {log.error("触发熔断");throw new IllegalStateException(String.format("id[{}]触发熔断", id));}
}
  • 应用注册到sentinel dashboard
    添加jvm启动参数:-Dcsp.sentinel.dashboard.server=${sentinel-dashboard域名}:9000
    指定客户端监控 API 的端口(默认是 8719)-Dcsp.sentinel.api.port=8720
    在这里插入图片描述

  • 启动应用,进行一次接口调用
    Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。
    在这里插入图片描述

  • 配置熔断规则
    在这里插入图片描述在这里插入图片描述

  • 效果
    快速调用3次慢接口,可以看到触发熔断
    在这里插入图片描述在这里插入图片描述10秒熔断失效后可再次成功访问

不使用SentinelResource注解

  • 慢接口代码
@RestController
@RequestMapping(path = "/user")
@RequiredArgsConstructor
@Slf4j
public class UserCtrl {private final IUserService userService;@GetMapping("/{id}")@SneakyThrowspublic User findById(@PathVariable("id") Long id) {TimeUnit.SECONDS.sleep(3);return userService.findById(id);}}
  • 配置熔断规则
    在这里插入图片描述
    在这里插入图片描述
  • 效果
    快速访问多次慢接口
    在这里插入图片描述
  • 对熔断统一添加异常处理
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson.JSON;
import com.test.test.model.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @description sentinel 降级处理* @date 2024/6/14*/
@Slf4j
public class WebBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException e) throws Exception {log.error(String.format("sentinel 降级 资源名称%s", e.getRule().getResource()), e);response.setContentType("application/json");response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());response.getWriter().print(JSON.toJSON(R.err(e.getMessage())));}
}import com.alibaba.cloud.sentinel.feign.SentinelFeignAutoConfiguration;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.test.test.hanlder.WebBlockExceptionHandler;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @description* @date 2024/6/14*/
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore(SentinelFeignAutoConfiguration.class)
public class SentinelAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic BlockExceptionHandler blockExceptionHandler() {return new WebBlockExceptionHandler();}
}
  • 统一降级异常处理效果
    在这里插入图片描述在这里插入图片描述

相关文章:

  • 在线兴趣教学类线上学习APP应用开发部署程序组建研发团队需要准备什么?
  • js如何添加新元素到数组中
  • pytest中失败用例重跑
  • A5M2报错【列 pd.adsrc 不存在】
  • Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)
  • 企业微信发送消息
  • 基于Python的花卉识别分类系统【W9】
  • 高考没考好焦虑怎么选计算机专业!一篇告诉你,推荐三个风口专业!想学计算机怎么选大学专业
  • 【DPDK学习路径】九、学习分支
  • Python爬虫实现“自动重试”机制的方法(1)
  • Linux,shell ,gun基本概念和关系
  • 阿里云运维第一步(监控):开箱即用的监控
  • Mac电脑安装配置NVM
  • 开源语音合成模型ChatTTS本地部署结合内网穿透实现远程访问
  • 【笔记】【Git】多个dev分支合并到master分支的文件冲突
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Flex布局到底解决了什么问题
  • JavaScript 一些 DOM 的知识点
  • Lsb图片隐写
  • PHP变量
  • Redis学习笔记 - pipline(流水线、管道)
  • Redux系列x:源码分析
  • spring-boot List转Page
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue学习系列(二)vue-cli
  • WePY 在小程序性能调优上做出的探究
  • 高度不固定时垂直居中
  • 码农张的Bug人生 - 见面之礼
  • 那些年我们用过的显示性能指标
  • 排序算法学习笔记
  • 手写一个CommonJS打包工具(一)
  • 1.Ext JS 建立web开发工程
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • #NOIP 2014#Day.2 T3 解方程
  • $.proxy和$.extend
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (11)MATLAB PCA+SVM 人脸识别
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SpringBoot)第七章:SpringBoot日志文件
  • (备忘)Java Map 遍历
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (多级缓存)多级缓存
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十六)串口UART
  • (实战篇)如何缓存数据
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)EXC_BREAKPOINT僵尸错误