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

springboot整合sentinel和对feign熔断降级

一、准备

  • docker安装好sentinel-dashboard(sentinel控制台),参考docker安装好各个组件的命令
  • 启动sentinel-dashboard,我的虚拟机ip为192.168.200.131,sentinel-dashboard的端口为8858

二、整合sentinel的主要工作

  • 在需要监控的服务中引入spring-cloud-starter-alibaba-sentinel依赖
  • bootstrap.yml中设置好sentinel-dashboardip:port

在我的项目中,给order-serviceproduct-service都引入了sentinel

# pom.xml
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency># bootstrap.yml
spring:cloud:sentinel:transport:dashboard: 192.168.200.131:8858

三、查看sentinel控制台

  • 启动两个服务
  • docker启动sentinel控制台
    • 浏览器输入:http://192.168.200.131:8858/
    • 输入默认账号密码都是sentinel

刚开始控制台左边只能看到sentinel-dashboard,只有当我们第一次访问过后,相应的服务和请求才会在左边(和簇点链路)中出现

在这里插入图片描述

四、控制台基础功能

4.1 流量控制

4.2 熔断降级

4.2.1 当未配置熔断降级功能时

product-service/product/getByObj限流为QPS=10,超过10则迅速失败

在这里插入图片描述使用jmeter进行压测,QPS为20,访问接口为http://127.0.0.1:8081/order/get2,发现20个请求里有10个请求访问失败,浏览器报500错误

在这里插入图片描述
此外,idea控制台报异常

feign.FeignException$TooManyRequests: [429] during [POST] to [http://product-service/product/getByObj] [IProductClient#getByObj(ProductDTO)]: [Blocked by Sentinel (flow limiting)]

sentinel控制台显示有10个请求被拒绝

在这里插入图片描述

4.2.1 给IProductClient配置熔断降级功能

IProductClient这个feign接口为例,当这个接口对应的http请求被限流阻断时,启用一个新的IProductClient对服务进行降级(实际项目中比如:"当前请求繁忙,请稍后访问"或者推荐别的页面)。
步骤如下:

  • sd-api模块的com.hdl.api.client.product包下建一个fallback包,用来存放feignclient的请求调用被熔断时降级处理的类
  • 在该包下建ProductClientFallback
  • IProductClient@FeignClient注解上配置fallbackFactory = ProductClientFallback.class 【1】
  • 需要将ProductClientFallback类放入ioc容器【2】,因此在com.hdl.api.config包下建一个FallbackConfig,用来生产ProductClientFallbackbean,同时将FallbackConfig放到·spring.factories·文件里
  • order-serviceproduct-service模块的bootstrap.yml中配置feign.sentinel.enabled=true【3】

结构如下
在这里插入图片描述
sd-api模块不需要引入sentinel依赖,ProductClientFallback类代码如下:

@Slf4j
public class ProductClientFallback implements FallbackFactory<IProductClient> {@Overridepublic IProductClient create(Throwable cause) {log.error("查询product服务异常",cause);return new IProductClient() {@Overridepublic ProductDTO getById(Integer id, Integer price) {ProductDTO productDTO = new ProductDTO();productDTO.setName("getById的默认product");return productDTO;}@Overridepublic ProductDTO getByObj(ProductDTO productDTO) {ProductDTO productDTO1 = new ProductDTO();productDTO.setName("getByObj的默认product");return productDTO1;}@Overridepublic ProductDTO getByParams(ProductDTO productDTO, Integer price) {ProductDTO productDTO2 = new ProductDTO();productDTO.setName("getByParams的默认product");return productDTO2;}};}
}

其它两个模块结构
在这里插入图片描述

测试
sentinel限流qps为10
在这里插入图片描述

使用jmeter进行压测,QPS为20,访问接口为http://127.0.0.1:8081/order/get2,发现20个请求里虽然超过了限流但,返回全都成功了,并且熔断的feign走的fallback返回的是默认的null
在这里插入图片描述

idea控制台打印出了fallback类的日志,并且有异常

在这里插入图片描述

feign.FeignException$TooManyRequests: [429] during [POST] to [http://product-service/product/getByObj] [IProductClient#getByObj(ProductDTO)]: [Blocked by Sentinel (flow limiting)]

sentinel控制台通过了12个(跟限流的10差不多),拒绝了8个
在这里插入图片描述

http://www.lryc.cn/news/449092.html

相关文章:

  • 遗传算法与深度学习实战——使用进化策略实现EvoLisa
  • HttpServletRequest简介
  • c++开发之编译curl(安卓版本)
  • QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析
  • Web APIs 5:Window对象(BOM)+本地存储
  • 神经网络(四):UNet图像分割网络
  • Java 编码系列:注解处理器详解与面试题解析
  • C语言 | Leetcode C语言题解之第441题排列硬币
  • Linux noVNC远程桌面(xfce)部署
  • 【网络安全】身份认证
  • LeetCode - #124 二叉树中的最大路径和(Top 100)
  • Java:插入排序
  • How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024)概览
  • leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.不同的二叉搜索树)
  • 基于Python大数据的B站热门视频的数据分析及可视化系统
  • matlab-批处理图像质量变化并形成折线图 (PSNR)
  • [Doc][Ros2]ros2中Qos(Quality of Service,服务质量)介绍
  • SpringBoot日志集成-LogBack
  • Google BigTable架构详解
  • 【python】如何切换ipynb的kernel至指定conda环境
  • Linux【基础指令汇总】
  • SpringCloud-EurekaClient
  • 配置Scrapy项目
  • 航顺芯片HK32MCU受邀出席汽车芯片国产化与技术创新闭门研讨会
  • 【深度学习】(6)--图像数据增强
  • Vscode 远程切换Python虚拟环境
  • Sqoop面试整理
  • PyCharm 的安装和配置
  • 【工具类:FastJsonRedisSerializer】
  • Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】