Spring Cloud Alibaba一一SentinelResource

SentinelResource

    在定义了资源点之后,我们可以通过Dashboard控制台页面来设置限流和降级策略来对资源点进行保护。同时还能通过[**@SentinelResource**](/SentinelResource)****注解来制定出现异常时的处理策略

1、属性说明

  • value

         资源名称、必须项、因为需要通过resource name找到对应的规则,这个是必须配置的。

  • blockHandler

         blockHandler对应处理BlockException的函数名称,可选项。blockHandler函数访问范围需要是public,返回的类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。

  • fallback

         fallback函数名称,可选项,用于在抛出异常的时候提供fallback处理逻辑。fallBack函数可以针对所有类型的异常(Throwable)

  • blockHandlerClass

         blockHandler函数默认需要和原生方法在同一个类中,如果希望使用其他类的函数,则需要指定blockhandlerClass为对应的类的Class对象,注意对应的函数必须为static函数,否则无法解析。

  • fallbackClass

         fallBackClass的应用和blockHandlerClass类似,fallback函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass为对应的类的Class对象,注意对应的函数必须为static函数,否则无法解析。

2、自定义处理限流和业务异常

@GetMapping("/hello4")
@SentinelResource(value ="hel1o4",blockHandler ="blockHandler",fallback ="fallbackHandler")
public string hello4(Integer age){int i = 10 / age;return "hello4";
}
// hel13Handler方法的参数和返回值要和原方法一直,BlockException用来接收原方法的异常
public string blockHandler(Integer age,BlockException e){return"资源被限流”;
}
//hel13Handler方法的参数和返回值要和原方法一直,Throwable用来接收原方法的异常(这里必须是Throwable用来接收原方法的异常,不能是exception)
public string fallbackHandler(Integer age,Throwable e) {return"资源出现异常";
}

     以上这种方式可以处理资源中的限流和业务异常了,但是发现异常处理类和业务代码耦合了,而且还没办法复用。

3、处理异常类和业务类解耦

@RestController
@slf4j
public class HelloController f@GetMapping("/hel1o4")@SentinelResource(value = "hello4",blockHandlerClass = MyBlockHandlerClass.class,blockHandler ="blockHandler",fallbackClass = FallbackHandler.class,fallback ="fallbackHandler")public string hello4(Integer age) {int i = 18 / age;return "hel1o4";}
}
public class FallbackHandler {// 这里的方法必须是静态的,方法参数和返回值要和原方法一致public static string fallbackHandler(Integer age,Throwable e) {return"资源出现异常"}
}
public class MyBlockHandlerClass f// 这里的方法必须是静态的,方法参数和返回值要和原方法一致public static string blockHandler(Integer age,BlockException e) {System.out.println("bolockHanlder age ="+ age +",e="+e);return"资源被限流”;}
}

Feign整合Sentinel实现降级

    Feign整合Sentinel后不同异常调用不同的处理器来解决异常。

    流控异常调用:blockHandler

   服务运行时异常调用:fallback

   feign调用异常调用:feign降级

1、导入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactIdx
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、FeignFallbackFactory

@Component
public class FeignFallbackFactory implements FallbackFactory<HelloService>(@Autowiredprivate HelloServiceImpl helloService;@Overridepublic HelloService create(Throwable throwable) {System.out.println(throwable);return helloService;}
}

3、Feign接口

@FeignClient(value = "provider-1",fallbackFactory = FeignFallbackFactory.class)
public interface HelloService {@RequestMapping("/hello")public string hello();
}

4、开启sentinel

feign:sentinel:enabled: true

5、版本问题

SpringCloud版本和SpringCloudAlibaba版本冲突的问题。

Caused by:at feien.FeignsBuilder.com.alibaba.cloud.sentinel.feign,sentinelcontractHolder.parseAndvalidateMetadajava .lang.AbstractMethoderror:lane/class;)Liava/util/list:
at feignReflectiveFeigsParseHandlersByllame,apply(Reflectivefeign.java:151) feign-(ore-10.7,4,jar:na
at feign,ReflectiveFein,newinstance(ReflectiveFeign.java:49) [feign-core-10.7.4jar:na)
target(feien.ia
core-18.7.4.ar;na7
at or3.sorineframework.coudopenfeien.-strixtareter.tareetHystrixtmeter, ava:33)  sorine-cloud-enfee-ore-2.2.2,RELEASE,m2.2.2RELEASE
at r.trmewo.cou.ttr da ertat  -
at org.sprineframevwork,cIod.0pfeignFegclietactoryBen-gtTretFeclitFto Bean av282  gprn-coud-Efe-0re-2-22RELEASE.ar:2.2.2ELEASEam.Co.0 it B- tat 2----S22S
t org.pringframework.beans.atory, support.Fto Beamegistryuprt,0etbjectfrnFtr Ben (to Beamepistry supprtaa71)re-ns-52.4ELEASE5.2.4ELEASE
... 67 common frames omitted

解决方式

自定义一个SentinelContractHolder类,包名和源码保持一致。

packagecom.alibaba.cloud.sentinel.feign;
import feign.Contract;
import feign.MethodMetadata;
import java.util.HashMap;import
import java.util.List;import
import java.util.Map;
public class SentinelContractHolder implements Contract {private final Contract delegate;/* map key is constructed by ClassFullName + configkey. configkey is constructed by* (@link feign.Feign#configKey}*/public final static Map<String, MethodMetadata> METADATA MAP = new HashMap<>();public SentinelContractHolder(Contract delegate) {this.delegate = delegate!}@Overridepublic List<MethodMetadata> parseAndValidateMetadata(Class<?> targetType) {List<MethodMetadata> metadatas = delegate.parseAndValidateMetadata(targetType);metadatas.forEach(metadata -> METADATA MAP.put(targetType.getName() + metadata.configkey(), metadata));return metadatas;}
}

        Feign调用服务过程中,服务出现故障,如果服务中存在全局异常管理器,会认为这个故障已经被服务处理了,然后返回一个空的对象,feign不会调用自己的降级方法。

       sentinel持久化

 1、sentinel工作模式

    在Sentinel客户端(微服务)中用代码写的配置,在启动后,当有第一次流量进来的时候,会推送给Sentinel-Dashboard;在Sentinel-Dashboard中的配置,会被推送到Sentinel客户端(微服务);默认情况下,不论 Sentinel-Dashboard中的配置还是Sentinel客户端中的配置,都是在内存中的,一点重启,这些变化过的规则就全部消失了。

2、semtinel持久化

在此将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中。

1、导入依赖

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2、在yml中配置nacos信息

spring:application:name: sentinel-servercloud:nacos:discovery:server-addr: 192.168.147.11.8848sentinel:transport:dashboard: 192.168.147.11:8080port: 8719eager: truedatasource:sentinel1:nacos:serverAddr: 192.168.147.11:8848dataId: ${spring.application.name}groupId: DEFAULT_GROUPdata-type: jsonrule-type: flow

3、在nacos中添加规则

[{"resource":"he11o4","limitApp":"default","grade": 1,"count": 5,"strategy": 0,"controlBehavior":0,'clusterMode": false}
]
  • resource: 资源名称
  • limitApp: 来源应用
  • grade: 阈值类型, 0-线程数  1-qps
  • count: 单机阈值
  • strategy: 流控模式, 0-直接  1-关联  2-链路
  • controlBehavior:流控效果、0-快速失败,1-warm up,2-排队等待
  • clusterMode: 是否集群

4、测试

服务启动后,当有第一次流量进来的时候,Sentinel-Dashboard会从nacos中拉取流控信息。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于遗传优化的协同过滤推荐算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 最后得到推荐的商品ID号&#xff1a; 推荐商品的ID号&#xff1a;ans 9838175822191114902149021235224732230712349911790154716550165501655011…

快速上手:在 Android 设备上运行 Pipy

Pipy 作为一个高性能、低资源消耗的可编程代理&#xff0c;通过支持多种计算架构和操作系统&#xff0c;Pipy 确保了它的通用性和灵活性&#xff0c;能够适应不同的部署环境&#xff0c;包括但不限于云环境、边缘计算以及物联网场景。它能够在 X86、ARM64、海光、龙芯、RISC-V …

Java中Sleep和Wait的区别

目录 1、所属类不同 2、作用不同 3、使用场景不同 4、异常处理不同 总结 在Java编程中&#xff0c;我们经常会遇到需要让线程暂停执行的情况。这时&#xff0c;我们可以使用Thread类的sleep()方法和Object类的wait()方法来实现线程的暂停。尽管它们都可以达到暂停线程的目的…

Linux——自写一个简易的shell

目录 前言 一、打印提示信息 二、分割字符串 三、替换程序 前言 之前学习了很多进程相关的知识&#xff0c;包括环境变量、进程的创建与退出、进程等待、进程替换。现在可以用所学的作一个小总结&#xff0c;手撕一个shell解释器&#xff0c;大致的思路是先通过环境变量获…

Java对接快递100实时快递单号查询API接口

目录 1.引入依赖 2.定义配置信息 3.模块结构 4.Controller 5.Service实现类 6.返回数据dto以及dto中的数据dto 7.测试运行 今天也是接到了这个任务&#xff0c;官网有小demo&#xff0c;可以下载下来参考test中代码 官方文档地址&#xff1a; 实时快递查询接口技术文档…

docker的网络配置

文章目录 1、网络模式1.1、bridge模式(默认模式)1.2、host模式 2、bridge模式3、自定义网络 1、网络模式 Docker在创建容器时有四种网络模式&#xff1a;bridge/host/container/none&#xff0c;bridge为默认不需要用–net去指定&#xff0c;其他三种模式需要在创建容器时使用…

【QT】创建第一个QT程序

下面的前7个可以先不看&#xff0c;直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分&#xff1a;应用程序类&#xff0c;窗口类应用程序类个数&#xff1a;有且只有一个QApplication a;如何查看类对应的模块&#xff1a;光标移动到类上&#xff0c;F1qmake模块的名字 2. …

【易经】-- 伏羲八卦次序图

1、伏羲八卦次序图 ☷☶☵☴☳☲☱☰八卦坤艮坎巽震离兑乾四象太阴少阳少阴太阳两仪阴阳太极太极 2、八“单卦”&#xff08;经卦&#xff09; 符号卦名自然象征1☰乾qin天2☱兑du泽3☲离l火4☳震zhn雷5☴巽xn风6☵坎kǎn水7☶艮gn山8☷坤kūn地 3、八卦及所代表的意像

二,几何相交----2,区间相交检测IID

一&#xff0c;算法 对于空间的线段是否相交&#xff0c;假设都是与x平行&#xff0c;则需要三步 1&#xff0c;对各线段左右端点设置为L,R标志 2&#xff0c;从小到大进行排序 3&#xff0c;线性扫描&#xff0c;从小到大&#xff0c;根据模式判断是否相交&#xff0c;假设不相…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

录屏、截屏好工具

踩过的坑&#xff1a;用了win11之后&#xff0c;截屏工具就无法安装了&#xff0c;还有sqlcompare也无法安装了。 解决&#xff1a;关闭系统自带的安全机制“实时保护”&#xff0c;再重新安装工具。

shell脚本 条件语句

一、条件语句 1. test测试 test 测试文件的表达式 是否成立 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] 注意[]空格&#xff0c;否则会失败 操作符&#xff1a; -d&#xff1a;测试是否为目录&#xff08;Directory&#xff09; -e&#xff1a;测…