SpringCloudAlibaba之Sentinel简单使用

SpringCloudAlibaba之Sentinel简单使用

文章目录

    • SpringCloudAlibaba之Sentinel简单使用
      • sentinel入门
      • 资源定义
        • SphU(抛出异常方式)
        • SphO(布尔类型方式)
        • @SentinelResource(注解的方式定义)
          • @SentinelResource使用前置条件
          • 使用@SentinelResource定义资源
          • 定义blockHandler和fallback方法(方法名称和@sentinelResoruce的参数名称需要一直,并且方法必须是public修饰)
          • @SentinelResoruce参数释义
          • 完整的service代码(资源定义)
      • 定义sentinel规则
      • 校验规则是否生效

使用sentinel三部曲,

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

sentinel入门

  1. 创建基础模块sentinel-boot-service
  • 引入依赖
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.0</version>
</dependency>
  • 创建主类
@SpringBootApplication
public class SentinelBootServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelBootServiceApplication.class,args);
    }
}
  • 创建application.yml
server:
  port: 8080

资源定义

  1. 定义sentinel资源,sentinel中的资源可以是一段代码,一个方法,甚至是整个应用。sentinel可以保护整个应用

资源必须定义资源名称

  • 创建service/SentinelTestService
SphU(抛出异常方式)
public String sphuTest(){
        // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try(Entry ignored = SphU.entry("sphuTest")) {
            // 被保护的逻辑
            return "hello world";
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            return "blocked";
        }
}

Sphu.entry(resourceName) 可以定义一段sentinel资源,当访问超出sentinel定义的规则后,Sphu.entry方法会抛出BlockException

所以可以在try语句块中定义sentinel的资源,也就是被保护的逻辑。在catch块中捕获BlockException,用来对降级进行处理

SphO(布尔类型方式)
public String sphoTest() {
        if(SphO.entry("sphoTest")){
            try {
                return "hello world";
            } finally{
                SphO.exit();
            }
        }else{
            //被限流了,逻辑处理
            return "被限流了";
        }
}

SphO.entry(resourceName) 方法可以返回一个boolean值,用于是否通过sentinel管控,必须与SphO.exit()搭配使用

@SentinelResource(注解的方式定义)
@SentinelResource使用前置条件

由于@SentinelResource是通过aop方式进行管控,所以需要引入aspectj模块

<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.0</version>
</dependency>
  • SentinelResourceAspect注入到Spring容器中

sentinel-boot-service 的config包下创建SentinelConfig

@Configuration
public class SentinelConfig {

    //注入
    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }
}
使用@SentinelResource定义资源
private static AtomicInteger atomicInteger = new AtomicInteger(0);

	@SentinelResource(value = "annotationTest",blockHandler = "blockHandler",fallback = "fallback")
    public String annotationTest(){
        int i = atomicInteger.incrementAndGet();
        if(i % 2 == 0){
            return "hello world";
        }else{
            throw new RuntimeException("something wrong");
        }
	}

blockHandler和fallback是两个概念

blockHandler是sentinel对资源进行限流或者熔断时的处理规则

fallback是资源抛出异常后,对异常捕获后的处理

定义blockHandler和fallback方法(方法名称和@sentinelResoruce的参数名称需要一直,并且方法必须是public修饰)
	public String blockHandler(BlockException ex){
        ex.printStackTrace();
        return "block handler";
    }

    public String fallback(){
        return "fallback";
    }

所以上述代码有三段逻辑,第一段正常逻辑返回hello world,第二段,抛出异常,被fallback捕获,返回fallback,第三段,被sentinel限流,被blockHandler处理,返回block handler

@SentinelResoruce参数释义
参数名称类型描述
valueString必需项,用于指定资源的名称。这个名称通常用于在 Sentinel Dashboard 中进行监控和管理。
entryTypeEntryType可选项,指定 entry 的类型。默认为 EntryType.OUT,表示这是一个出站调用。
blockHandlerString可选项,指定处理 BlockException 的函数名称。当原方法被限流或熔断时,会调用这个函数进行异常处理。该函数的访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。默认情况下,这个函数需要和原方法在同一个类中。
blockHandlerClassClass<?>可选项,当希望使用其他类的函数作为 blockHandler 时,可以指定这个类的 Class 对象。注意,对应的函数必须为 static 函数。
fallbackString可选项,指定回退函数名称,当原方法调用失败时,会调用这个回退函数。回退函数的签名(返回值类型、参数类型)需要与原方法一致。
fallbackClassClass<?>可选项,当希望使用其他类的函数作为回退函数时,可以指定这个类的 Class 对象。同样,对应的函数必须为 static 函数。
resourceTypeint可选项,用于指定资源的类型。这通常用于区分不同类型的资源,以便进行更精细的控制。
exceptionsToIgnoreClass<? extends Throwable>[]可选项,指定需要忽略的异常类型。当原方法抛出这些异常时,Sentinel 不会触发限流或熔断逻辑。

这个注解允许开发者对方法进行细粒度的流量控制,同时提供了异常处理和回退机制,确保系统的可靠性和稳定性。通过合理配置这些参数,可以更加精准地控制应用的流量,避免由于流量过大或异常导致的系统崩溃。

完整的service代码(资源定义)
@Service
public class SentinelTestService {

    private static AtomicInteger atomicInteger = new AtomicInteger(0);

    public String sphuTest(){
        // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try(Entry ignored = SphU.entry("sphuTest")) {
            // 被保护的逻辑
            return "hello world";
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            return "blocked";
        }
    }

    public String sphoTest() {
        if(SphO.entry("sphoTest")){
            try {
                return "hello world";
            } finally{
                SphO.exit();
            }
        }else{
            //被限流了,逻辑处理
            return "被限流了";
        }
    }

    @SentinelResource(value = "annotationTest",blockHandler = "blockHandler",fallback = "fallback")
    public String annotationTest(){
        int i = atomicInteger.incrementAndGet();
        if(i % 2 == 0){
            return "hello world";
        }else{
            throw new RuntimeException("something wrong");
        }
    }

    public String blockHandler(BlockException ex){
        ex.printStackTrace();
        return "block handler";
    }

    public String fallback(){
        return "fallback";
    }
}

定义sentinel规则

sentinel的规则有很多种,此文章示例,仅用流控来测试sentinel定义的资源信息

在config/SentinelRuleConfig下分别创建上面三个资源的流控规则,如下

@Configuration
public class SentinelRuleConfig {
    @PostConstruct
    public void init(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //定义规则适用的资源名称
        rule.setResource("sphuTest");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //定义每秒被保护的代码块最多运行2次
        rule.setCount(2);
        rules.add(rule);


        FlowRule sphoTestRule = new FlowRule();
        //定义规则适用的资源名称
        sphoTestRule.setResource("sphoTest");
        sphoTestRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //定义每秒被保护的代码块最多运行2次
        sphoTestRule.setCount(2);
        rules.add(sphoTestRule);


        FlowRule annotationTestRule = new FlowRule();
        //定义规则适用的资源名称
        annotationTestRule.setResource("annotationTest");
        annotationTestRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //定义每秒被保护的代码块最多运行2次
        annotationTestRule.setCount(2);
        rules.add(annotationTestRule);
        FlowRuleManager.loadRules(rules);
    }
}
  • setResource:设置资源名称
  • setGrade:设置流控的类型,此处通过QPS,即每秒的访问量
  • setCount: 设置每秒访问量的阈值,当大于2时,触发sentinel流控

校验规则是否生效

  • 新建入口SentinelTestController,并分别创建三个uri对应三个资源的访问
public class SentinelTestController {

    @Resource
    private SentinelTestService sentinelTestService;

    @GetMapping("/sphuTest")
    public String sphuTest(){
        return sentinelTestService.sphuTest();
    }

    @GetMapping("/sphoTest")
    public String sphoTest(){
        return sentinelTestService.sphoTest();
    }

    @GetMapping("/annotationTest")
    public String annotationTest(){
        return sentinelTestService.annotationTest();
    }
}
  • 启动sentinel-boot-service项目模块,并通过浏览器访问
  1. sphuTest
  • 访问sphuTest,可以看到正常返回hello world
http://localhost:8080/sentinel/sphuTest
-> hello world
  • 快速刷新sphuTest,可以看到blockedhello world出现
http://localhost:8080/sentinel/sphuTest
-> hello world
-> blocked    
  1. sphotest
  • 访问sphOTest,可以看到正常返回hello world
http://localhost:8080/sentinel/sphoTest
-> hello world
  • 快速刷新sphoTest,可以看到被限流了hello world出现
http://localhost:8080/sentinel/sphoTest
-> hello world
-> 被限流了
  1. annotationTest
  • 低频率刷新annotationTest,可以看到hello world和fallback交替出现,这里由于业务逻辑是执行一次,抛一次异常,异常捕获被fallback执行,所以交替出现
http://localhost:8080/sentinel/annotationTest
-> hello world
-> fallback
-> hello world
-> fallback
-> hello world
-> fallback
  • 高频率刷新,可以看到hello worldfallbackblock handler都会出现。

在高频率刷新中,可能会执行正常逻辑(未限流,未异常情况),可能执行到fallback逻辑(异常情况),block handler(达到设定的流控QPS阈值)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

OpenHarmony实战开发-合理运行后台任务

简介 设备返回主界面、锁屏、应用切换等操作会使应用退至后台。为了降低设备耗电速度、保障用户使用流畅度&#xff0c;系统会对退至后台的应用进行管控&#xff0c;包括进程挂起和进程终止。为了保障后台音乐播放、日历提醒等功能的正常使用&#xff0c;系统提供了受规范约束…

iptables实现docker容器动态端口映射实操

背景 之前在《Docker 动态修改容器端口映射的方法》一文中&#xff0c;说明了如何使用修改配置和加防火墙规则实现动态端口映射。但是没有具体分享加防火墙实现动态端口映射的实际案例。今天就分享一下实际操作案例&#xff0c;供大家参考。 分析 动态端口映射的用途 容器端口…

JavaEE初阶——多线程(六)——线程池

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第六篇文章,关于线程池 如果有不足的或者错误的请您指出! 目录 3.线程池3.1标准库的线程池3.2 标准库自己提供的几个工厂类3.3自己实现一个线程池完成大体框架接下来完…

解决DataGrip连接MySQL8时出现时区错误问题

解决办法&#xff1a;在url后面拼接时区参数 ?serverTimezoneAsia/Shanghai

生成式AI在B端产品的应用分析

AI产品发展到现在&#xff0c;消费端的产品应用还受到比较大的限制&#xff1b;但是在B端&#xff0c;已经有了不错的表现。作者总结了AI产品在B端的几款应用&#xff0c;一起来看看表现如何。 生成式AI在B端产品的应用分析© 由 ZAKER 提供 随着今年生成式AI应用的大范围…

绝地求生:16款战术手套,你最钟爱哪一款?

大家好&#xff0c;我是闲游盒&#xff01; 喜迎PUBG七周年生日同时游戏里又迎来了一款新的战术手套&#xff0c;那么就让我们来回顾一下目前出游戏中的16款战术手套吧&#xff0c;看看你最中意的是哪一款&#xff1f; 1、MAZARIN1K 战术手套 2、SPAJKK 战术手套 3、SWAGGER 战…

机器学习(四)之无监督学习

前言&#xff1a; 前面写了监督学习的几种算法&#xff0c;下面就开始无监督啦&#xff01; 如果文章有错误之处&#xff0c;小伙伴尽情在评论区指出来&#xff08;嘿嘿&#xff09;&#xff0c;看到就会回复的。 1.聚类&#xff08;Clustering&#xff09; 1.1 概述&#xff…

8.4.3 使用3:配置单臂路由实现VLAN间路由

1、实验目的 通过本实验可以掌握&#xff1a; 路由器以太网接口上的子接口配置和调试方法。单臂路由实现 VLAN间路由的配置和调试方法。 2、实验拓扑 实验拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;配置交换机S1 S1(config)#vlan 2 S1(config-vlan)#exit S…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

LayuiMini使用时候初始化模板修改(下载源码)

忘记加了 下载 地址 &#xff1a; layui-mini: layuimini&#xff0c;后台admin前端模板&#xff0c;基于 layui 编写的最简洁、易用的后台框架模板。只需提供一个接口就直接初始化整个框架&#xff0c;无需复杂操作。 LayuiMini使用时候初始化模板官网给的是&#xff1a; layu…

立即刷新导致请求的response没有来得及加载造成的this request has no response data available

1、前端递归调用后端接口 const startProgress () > {timer.value setInterval(() > {if (progress.value < 100) {time.value--;progress.value Math.ceil(100 / wait_time.value);} else {clearInterval(timer.value);progress.value 0;timer.value null;time.…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(六)

目录 1. 静电测试干扰方式 2. 案例一 3. 案例二 4. 案例三 5. 案例四 6. 总结 静电放电测试的复杂性决定了这项测试对产品的主要影响方式也是多样的。标准里介绍了几种常见的影响方式&#xff1a; 1. 静电测试干扰方式 在静电放电试验中&#xff0c;测试了受试设备对于…

CDN、边缘计算与云计算:构建现代网络的核心技术

在数字化时代&#xff0c;数据的快速传输和处理是保持竞争力的关键。内容分发网络&#xff08;CDN&#xff09;、边缘计算和云计算共同构成了现代互联网基础架构的核心&#xff0c;使内容快速、安全地到达用户手中。本文将探讨这三种技术的功能、相互关系以及未来的发展趋势。 …

大语言模型微调过程中的 RLHF 和 RLAIF 有什么区别?

目前想要深入挖掘大型语言模型&#xff08;LLM&#xff09;的全部潜力需要模型与我们人类的目标和偏好保持一致。从而出现了两种方法&#xff1a;来自人类反馈的人力强化学习&#xff08;RLHF&#xff09;和来自人工智能反馈的人工智能驱动的强化学习&#xff08;RLAIF&#xf…

rosdep一键修复

External Player - 哔哩哔哩嵌入式外链播放器 rosdep失败原因 通常在执行rosdep init操作时就会报错&#xff0c;问题的核心在于rosdep会访问raw.githubusercontent.com这个网址下的资源&#xff0c;例如https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sour…

免费开源线上社交交友婚恋系统平台 可打包小程序 支持二开 源码交付!

婚姻是人类社会中最重要的关系之一&#xff0c;它对个人和家庭都有着深远的影响。然而&#xff0c;在现代社会的快节奏生活中&#xff0c;找到真爱变得越来越困难。在这个时候&#xff0c;婚恋产品应运而生&#xff0c;为人们提供了寻找真爱的新途径。 1.拓宽人际交流圈子 现代…

【Camera KMD ISP SubSystem笔记】CRM V4L2驱动模型

1. CRM为主设备 /dev/video0&#xff0c;先创建 v4l2_device 设备&#xff0c;再创建 video_device 设备&#xff0c;最后创建 media_device 设备/dev/media0 v4l2_device的mdev指向media_device&#xff0c;v4l2_device的entity链接到media_device的entities上&#xff08…

P1106 删数问题

本题为洛谷&#xff1a; #include<iostream> #include<string> using namespace std; int main(){string n;int k;cin>>n>>k;while(k--){for(int i0;i<n.length();i){if(n[i]>n[i1]){n.erase(i,1); break;} }for(int i0;i<n.length()-1&&…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…
最新文章