您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

五小步快速集成使用sentinel限流

时间:2023-09-19 14:11:02  来源:微信公众号  作者:不焦躁的程序员

1、环境和资源准备

sentinel支持许多流控方式,比如:单机限流、熔断降级、集群限流、系统保护规则、黑白名单授权等。

本文介绍如何快速集成使用sentinel,文中以单机限流为例,使用代码而非控制台配置的方式限流。

  • sentinel官网地址:https://sentinelguard.io/zh-cn/index.html
  • Github地址:https://github.com/alibaba/Sentinel
  • 本文采用的版本是1.8.0,下载地址:https://github.com/alibaba/Sentinel/releases/tag/v1.8.0
  • sentinel-dashboard下载地址:https://github.com/alibaba/Sentinel/releases/download/v1.8.0/sentinel-dashboard-1.8.0.jar
  • 本文使用的项目地址:https://github.com/yclxiao/spring-sentinel-demo,代码中有一部分使用的是官方demo。

2、启动sentinel-dashboard

从上文地址下载sentinel-dashboard,然后执行命令启动:JAVA -jar sentinel-dashboard-1.8.0.jar

启动完毕后,通过http://localhost:8080/#/dashboard访问dashboard,出现如下界面:

3、项目集成sentinel

项目中集成sentinel分如下5步。

3.1、引入pom

<!-- 这是sentinel的核心依赖 -->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-core</artifactId>
  <version>1.8.0</version>
</dependency>
<!-- 这是将自己项目和sentinel-dashboard打通的依赖 -->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-transport-simple-http</artifactId>
  <version>1.8.0</version>
</dependency>
<!-- 这是使用sentinel对限流资源进行AOP -->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-annotation-aspectj</artifactId>
  <version>1.8.0</version>
</dependency>

3.2、增加sentinel-aop

@Configuration
public class AopConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

3.3、增加sentinel.properties配置

Application.properties同级目录下,增加sentinel.properties文件,配置内容如下:

# 集成到sentinel的项目名称
project.name=spring-sentinel-demo
# 对应的sentinel-dashboard地址
csp.sentinel.dashboard.server=localhost:8080

同时需要加载sentinel.properties配置,有两种加载方式,选择一种即可,如下:

3.4、设置需要被限流的资源

给需要被限流的资源打上注解@SentinelResource,使用方式如下。

  • 默认情况下,超出配置的流控阈值后,直接抛出 FlowException(BlockException) 异常,可以使用blockHandler自定义。
  • fallback用于配置熔断降级的方法,当发生慢调用、异常数、异常比例数,会调用fallback方法。
  • 可以针对部分异常情况做忽略处理,不再触发熔断降级。
@Service
public class TestServiceImpl implements top.mangod.springsentineldemo.service.TestService {

    @Override
    @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {top.mangod.springsentineldemo.service.ExceptionUtil.class})
    public void test() {
        System.out.println("Test");
    }

    @Override
    @SentinelResource(value = "hello", fallback = "helloFallback")
    public String hello(long s) {
        if (s < 0) {
            throw new IllegalArgumentException("invalid arg");
        }
        return String.format("Hello at %d", s);
    }

    @Override
    @SentinelResource(value = "helloAnother", defaultFallback = "defaultFallback",
        exceptionsToIgnore = {IllegalStateException.class})
    public String helloAnother(String name) {
        if (name == null || "bad".equals(name)) {
            throw new IllegalArgumentException("oops");
        }
        if ("foo".equals(name)) {
            throw new IllegalStateException("oops");
        }
        return "Hello, " + name;
    }

    public String helloFallback(long s, Throwable ex) {
        // Do some log here.
        ex.printStackTrace();
        return "Oops, error occurred at " + s;
    }

    public String defaultFallback() {
        System.out.println("Go to default fallback");
        return "default_fallback";
    }
}

3.5、指定和加载流控规则

文中我使用代码方式制定流控规则,在控制台中也可以直接配置流控规则,为什么不使用控制台方式呢?

如果是类似云原生的部署环境,比如:将spring应用打成Docker镜像,然后在部署到Kube.NETes中,部署之后Pod地址是会变化。

只要应用的地址变化后,之前的配置就消失了。不可能每次地址变化后都到控制台去重新配置策略,所以需要选择代码方式制定规则。

流控规则一般会有如下几个:

  • 资源限流规则FlowRule
  • 异常熔断降级规则DegradeRule
  • 系统过载保护规则SystemRule
  • 访问黑白名单规则AuthorityRule

控制台设置流控规则,如下:

代码制定和加载流控规则,如下:

public static void mAIn(String[] args) {
    // 加载限流规则
    initSentinelRule();
    SpringApplication.run(SpringSentinelDemoApplication.class, args);
  }

  private static void initSentinelRule() {
    // 资源限流
    FlowRule flowRule = new FlowRule("test")
        .setCount(1)
        .setGrade(RuleConstant.FLOW_GRADE_QPS);
    List<FlowRule> list = new ArrayList<>();
        /*if (method) {
            FlowRule flowRule1 = new FlowRule("test:sayHello(java.lang.String)")
                    .setCount(5)
                    .setGrade(RuleConstant.FLOW_GRADE_QPS);
            list.add(flowRule1);
        }*/
    list.add(flowRule);
    FlowRuleManager.loadRules(list);

    // 异常降级
    /*List<DegradeRule> DegradeRules = new ArrayList<>();
    DegradeRule degradeRule = new DegradeRule("");
    degradeRule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType());
    degradeRule.setCount(0.7); // Threshold is 70% error ratio
    degradeRule.setMinRequestAmount(100)
            .setStatIntervalMs(30000) // 30s
            .setTimeWindow(10);
    DegradeRules.add(degradeRule);
    DegradeRuleManager.loadRules(DegradeRules);*/

    // 系统负载保护
    /*List<SystemRule> systemRules = new ArrayList<>();
    SystemRule systemRule = new SystemRule();
    systemRule.setHighestSystemLoad(10);
    systemRules.add(systemRule);
    SystemRuleManager.loadRules(systemRules);*/
    
    // 黑白名单授权访问
    /*AuthorityRule rule = new AuthorityRule();
    rule.setResource("test");
    rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
    rule.setLimitApp("appA,appB");
    AuthorityRuleManager.loadRules(Collections.singletonList(rule));*/
  }

4、启动测试

项目启动完毕后,访问链接http://localhost:9091/foo,就可以在控制台上看到被限流的资源

在流控规则这里,可以看到上文中在代码里设置的规则:

启动项目后,测试限流效果,如下:

  1. 1秒内多次访问http://localhost:9091/foo,可以看到触发了限流异常:

  1. 输入http://localhost:9091/foo?t=-1会触发异常。fallback用于配置熔断降级的方法,当发生慢调用、异常数、异常比例数时,会调用fallback方法。图片
  2. 输入http://localhost:9091/baz/foo、http://localhost:9091/baz/bad,会分别触发异常和默认fallback。图片

5、总结

本文主要介绍spring项目如何快速集成sentinel实现系统限流。

首先启动sentinel-dashboard,然后使用5个简单步骤即可使用sentinel限流。

在应用server的IP地址频繁变动的场景下,建议使用代码方式限流。

流控的方式较多,你需要根据自身的业务需求做选择,我一般情况下选择单机流控和系统保护。



Tags:sentine   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Redis Sentinel的监控和自动化处理Redis节点故障恢复机制
Redis Sentinel是一个分布式的监控系统,它可以监控多个Redis节点的健康状态,并在节点发生故障时自动进行故障转移和恢复。Redis Sentinel通过选举机制选择一个主节点,并将其他...【详细内容】
2023-12-25  Search: sentine  点击:(81)  评论:(0)  加入收藏
五小步快速集成使用sentinel限流
1、环境和资源准备sentinel支持许多流控方式,比如:单机限流、熔断降级、集群限流、系统保护规则、黑白名单授权等。本文介绍如何快速集成使用sentinel,文中以单机限流为例,使用...【详细内容】
2023-09-19  Search: sentine  点击:(236)  评论:(0)  加入收藏
玩转Sentinel⾃定 义异常-整合Open-Feign
AlibabaCloud版本升级-⾃定义降级异常不向下兼容的坑默认降级返回数据问题 限流和熔断返回的数据有问题 微服务交互基本都是json格式,如果让⾃定义异常信息AlibabCloud版本升...【详细内容】
2022-06-16  Search: sentine  点击:(433)  评论:(0)  加入收藏
3分钟彻底弄懂Sentinel集群限流探索
最近看了下关于分布式限流的部分,看到Sentinel的分布式限流,也就是集群限流的部分,想搭个环境看看,结果发现网上关于这方面的内容基本可以说没有,你甚至很难跑起来他的demo,就算能...【详细内容】
2022-05-10  Search: sentine  点击:(283)  评论:(0)  加入收藏
阿里开源的限流神器 Sentinel,轻松搞定接口限流
Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规...【详细内容】
2021-04-30  Search: sentine  点击:(405)  评论:(0)  加入收藏
硬盘检测修复神器:硬盘哨兵HardDisk Sentinel
众所周知,硬盘是计算机中最重要的硬件之一,所有重要数据都存储在硬盘中。如果你的硬盘突然崩溃导致所有重要数据都消失了,你是否不想要它?现在,通过将Hard Sentinel Pro安装到计...【详细内容】
2021-01-18  Search: sentine  点击:(1112)  评论:(0)  加入收藏
Sentinel+Nacos实现资源流控、降级、热点、授权
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。这篇文章主要介绍 Sentinel 引入和规则配置等使用...【详细内容】
2020-11-11  Search: sentine  点击:(197)  评论:(0)  加入收藏
Redis Sentinel主从高可用方案简析
一、Sentinel介绍Sentinel是Redis的高可用性(HA)解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被...【详细内容】
2019-12-06  Search: sentine  点击:(354)  评论:(0)  加入收藏
Redis一主二从Sentinel监控配置
本文基于Redis单实例安装安装。开启哨兵模式,至少需要3个Sentinel实例(奇数个,否则无法选举Leader)。本例通过3个Sentinel实例监控3个Redis服务(1主2从)。IP地址 节点角色&端口1...【详细内容】
2019-10-22  Search: sentine  点击:(667)  评论:(0)  加入收藏
扛住阿里双十一高并发流量,Sentinel是怎么做到的?
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较基本介绍1 名词解释 服务...【详细内容】
2019-10-15  Search: sentine  点击:(861)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条