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

Sentinel实现限流和熔断降级

文章:关于sentinel的介绍已经非常详细了,直接看它就可以了,这边只是做一个简单的学习。

自己根据上面的链接配置好sentinel.

前面我们学习过通过feign + resilience4j 实现限流和服务的熔断降级

feign + resilience4j前情回顾:

 需要的依赖:

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency>

yml配置:

spring:cloud:openfeign:circuit breaker:enabled: true

通过@FeignClient就可以实现服务调用和熔断降级 

现在我们学习一个更加灵活的限流和熔断降级方式:Sentinel 

首先

  1. 下载好sentinel控制台的jar包
  2. 运行jar包
  3. 访问127.0.0.1:8080

应用引入依赖:

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--sentinel限流,熔断降级--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

给应用配置好sentinel

spring:cloud:sentinel:enabled: true# 开启对sentinel看板的饥饿式加载。sentinel默认是懒加载机制,只有访问过一次的资源才会被监控,通过关闭懒加载,在项目启动时就连接sentinel控制台eager: truelog:#日志输出地址dir: logs/sentinel transport:#跟控制台交流的端口port: 8719# sentinel看板的地址dashboard: localhost:8080
feign:sentinel:enabled: true

我们看到配置里面配置了:

feign:
  sentinel:
    enabled: true 

我们让openfeign集成Sentinel熔断器,,所以同样通过@FeignClient也可以实现熔断降级。在熔断器Sentinel下@FeignClient的使用与熔断器resilience4并没有什么太大差别,同样可以实现服务降级,OpenFeign 本身只是一个声明式的 HTTP 客户端,它不包含熔断器的实现,它只提供了与熔断器集成的接口,所以可以注入不同的熔断器来实现@FeignClient的熔断降级

sentinel的使用就是一个@SentinelResource注解的使用

@SentinelResource的属性

  • value:作用指定资源名称,必填
  • entryType:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
  • blockHandler:处理BlockException的函数名称,函数要求为
    必须是public
    返回类型与原方法一致
    参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
    默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法
  • blockHandlerClass:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为:
    必须是public
    返回类型与原方法一致
    参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
  • fallback:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为:
    返回类型与原方法一致
    参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数
    默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法
  • fallbackClass:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
  • defaultFallback:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
    返回类型与原方法一致
    方法参数列表为空,或者有一个Throwable类型的参数
    默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。
  • exceptionsToIgnore:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
  • exceptionsToTrace:需要trace的异常

这边重点讲一下blockHandler和 fallback属性:

blockHandler:就是对我们手动在控制台添加的流空规则、熔断规则、热点规则、系统规则等的处理,只要超过了规则阈值就会执行blockHandler指定的的方法,如果指定的方法与@SentinelResource不在同一个类,blockHandlerClass需要指定blockHandler指定的方法的存放类,否则可省

fallback:就是被@SentinelResource注释的接口发生异常时会调用fallback指定的方法,fallbackClass就是存放fallback的类

简单实现使用一下@SentinelResource注解:

    @RequestMapping("/hello")@SentinelResource(value = "hello",blockHandler = "getNameBlockHandler",fallback = "helloFallback")public String hello(){throw new RuntimeException("consumer error");}public static String helloFallback(String name, Throwable e){return "接口出错了,请稍后重试";}@RequestMapping("/get")@SentinelResource(value = "getName",blockHandler = "getNameBlockHandler")public String get(String name){return name;}public static String getNameBlockHandler(String name, BlockException e){return "服务繁忙,请稍后重试";}

添加一个流控规则:

通过Jmeter来进行压测(使用Jmeter自己看:jemter的安装与使用),让1秒内进行4次请求看一下结果: 

 

 

http://www.dtcms.com/a/304698.html

相关文章:

  • 基于YOLOP与GAN的图像修复与防御系统设计与实现
  • sqli-labs通关笔记-第24关 SQL二次注入(单引号闭合)
  • Scikit-learn高级功能与Python实践
  • 军工堡垒机国产化突围:打破国外垄断的三大技术流派
  • vue3项目搭建
  • VIKOR(Multi-criteria Optimization and Compromise Solution)简介与简单示例
  • 无人机图传:让天空视角 “触手可及”
  • Apache Ignite 的分布式原子类型(Atomic Types)
  • 【高阶版】R语言空间分析、模拟预测与可视化高级应用
  • 解密犯罪时间 - 华为OD统一考试(JavaScript 题解)
  • 自定义View和动画学习记录 抓娃娃机View
  • DataParallel (DP) DistributedDataParallel (DDP)
  • 15-TPS65261 4.5V 至 18V 输入电压、3A/2A/2A 输出电流三路同步降压转换器
  • 分布式时序数据库的特点解析
  • Three.js 完整实战项目:构建一个 3D 商品展示空间
  • UE5 打包Windows平台时无法找到SDK的解决方法
  • C# 基于halcon的视觉工作流-章25-椭圆查找
  • 【自动化运维神器Ansible】Ansible常用模块之service模块详解
  • C++ 赋值与交换法则
  • STM32 集成 USB 时出现 HAL_StatusTypeDef 未定义 的错误
  • STM32--DHT11(标准库)驱动开发
  • AI崛起后,对使用AI的一些小思考
  • LaTeX 下载安装保姆级教程
  • 异形设备前端适配挑战:条形屏/嵌入式终端的布局弹性与触控热区重构
  • 直播间里的酒旅新故事:内容正在重构消费链路
  • 亚马逊 Vine 计划:评论生态重构与合规运营策略
  • 《UE教程》第一章第九回——地图BGM
  • Kafka运维实战 17 - kafka 分区副本从 1 增加到 3【实战】
  • 减速机:自动化生产线的“精密传动心脏”
  • 网站备案号被注销了,怎么重新备案