Sentinel限流中间件

这篇具有很好参考价值的文章主要介绍了Sentinel限流中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

介绍

Sentinel 的特征

Sentinel 的组成

实战使用

简单实例

配置本地控制台

使用可视化ui配置简单流控

配置异步任务限流

使用注解定义限流资源

SpringCloud整合Sentinel

简单整合

 并发线程流控

关联模式 

整合openFeign使用


介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 的特征

丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷(对于突然到来的大量请求,您可以配置流控规则,以稳定的速度逐步处理这些请求,从而避免流量突刺造成系统负载过高)、集群流量控制、实时熔断下游不可用应用等
完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架 / 库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等

Sentinel 的组成

核心库(Java 客户端): 不依赖任何框架 / 库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
控制台(Dashboard): 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器

实战使用

简单实例

准备一个springboot项目.这里不再演示如何创建一个新的springboot项目

添加sentinle必备依赖

<!--        sentinel核心依赖-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.6</version>
        </dependency>

书写接口限流测试

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import jakarta.annotation.PostConstruct;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class TestController {


    @GetMapping("hello")
    public String hello(){
        //使用限流规则
        try (Entry entry = SphU.entry("Hello")){ //限流入口
            System.out.println("你好");
            return "你好 sentinel"; //被保护的资源
        }catch (BlockException e){
            e.printStackTrace();
            return "系统繁忙,请稍后"; //被限流或者被降级的操作处理
        }
    }

    /**
     * 定义限流规则
     * @PostConstruct  当前类的构造函数执行之后执行
     */
    @PostConstruct
    public void initFlowRule(){
        //创建存放限流规则的集合
        List<FlowRule> ruleList = new ArrayList<>();
        //创建限流规则
        FlowRule rule = new FlowRule();
        //定义资源 表示Sentinel会对哪个资源生效 相当于做一个标记
        rule.setResource("Hello");
        //定义限流规则类型 RuleConstant.Flow_GRADE_QPS: QPS限流类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //定义QPS每秒能通过的请求个数
        rule.setCount(2);
        //将限流规则存放到集合中
        ruleList.add(rule);
        //加载限流规则
        FlowRuleManager.loadRules(ruleList);
    }
}

这里配置限流规则为1秒中最多可以通过2次,启动测试:

Sentinel限流中间件,springboot,sentinel,中间件

 可以看到请求过快的话会直接返回接口中配置限流规则后的异常信息,说明sentinel已经初步使用成功

配置本地控制台

sentinel可以通过配置本地控制台ui来进行接口限流的可视化管理,首先需要下载官网提供的可视化jar包

Releases · alibaba/Sentinel · GitHub

当然有下载比较慢的问题,所以也可以在本博主提供的链接里进行下载

sentinel1.8.6-jar阿里云下载

下载后在cmd窗口中运行启动

java -Dserver.port=9000 -jar sentinel-dashboard-1.8.6.jar

 Sentinel限流中间件,springboot,sentinel,中间件

浏览器地址栏输入localhost:9000进行访问,账号密码默认都是sentinel

 Sentinel限流中间件,springboot,sentinel,中间件

 此时登录后会发现没有被监控的服务,因为该控制台还没有和本地项目进行关联

关联本地项目需要添加控制台所需依赖

<!--        本地sentinel控制台依赖-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.8.6</version>
        </dependency>

然后在idea启动配置中添加启动配置

-Dcsp.sentinel.dashboard.server=localhost:9000   Sentinel控制台的地址和端口号
-Dproject.name=SentinelQuickStart                本地应用在控制台中的名称

这里博主使用的是idea新版ui,和旧版ui可能有些许不同

Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

命令配置以空格隔开即可

启动项目后发现sentinel中可能还是没有检测到服务,这里需要重新调用下之前配置的限流规则接口,也就是前面的hello接口,调用后再刷新sentinel页面就可以看到监听的本地服务了

Sentinel限流中间件,springboot,sentinel,中间件

使用可视化ui配置简单流控

前面的流控是在底层书写代码进行限流控制的,还可以使用可视化ui来配置接口的限流策略

首先注释掉之前书写的限流规则

Sentinel限流中间件,springboot,sentinel,中间件

重启项目再测试接口

 Sentinel限流中间件,springboot,sentinel,中间件

可以看到此时手写的限流规则已失效,切换到sentinel控制台

Sentinel限流中间件,springboot,sentinel,中间件

Sentinel限流中间件,springboot,sentinel,中间件 Sentinel限流中间件,springboot,sentinel,中间件

 注意此处的资源名要和后台接口中配置的资源名一致

点击保存

Sentinel限流中间件,springboot,sentinel,中间件

再测试接口

Sentinel限流中间件,springboot,sentinel,中间件

可以看到和之前的手动书写的限流规则一样都起到了接口限流的作用,而且在控制台中也可以看到接口的监控情况

配置异步任务限流

在主启动类中开启允许异步任务

Sentinel限流中间件,springboot,sentinel,中间件

 新建书写一个服务层,并书写异步方法

Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

在sentinel中新增流控规则:

Sentinel限流中间件,springboot,sentinel,中间件

启动测试:

Sentinel限流中间件,springboot,sentinel,中间件

 可以看到异步任务的限流也成功监控

使用注解定义限流资源

 前面都是使用的代码方式来进行接口资源的定义,下面使用注解的形式来进行资源定义

首先导入所需依赖

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.6</version>
        </dependency>

书写sentinel注解定义配置类

Sentinel限流中间件,springboot,sentinel,中间件

 书写接口

Sentinel限流中间件,springboot,sentinel,中间件

Sentinel限流中间件,springboot,sentinel,中间件

 测试:

Sentinel限流中间件,springboot,sentinel,中间件

 可以看到基于注解定义的流控资源也已生效

SpringCloud整合Sentinel

简单整合

新建一个springboot项目,引入依赖:

 <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-sentinel</artifactId>
       <version>2.2.0.RELEASE</version>
 </dependency>

书写配置:

server.port=8083
# 设置本地应用名称
spring.application.name=SentinelSpringCloud
# 设置sentinel控制台的地址和端口
spring.cloud.sentinel.transport.dashboard=localhost:9000
#Spring表达你允许循环依赖存在,并且希望Spring能够自动解决这些循环依赖关系。启用此配置后,
# Spring会尝试自动解决循环依赖,以支持相关Bean之间的相互引用。
spring.main.allow-circular-references=true

Sentinel限流中间件,springboot,sentinel,中间件

 书写接口: 

Sentinel限流中间件,springboot,sentinel,中间件

启动项目

Sentinel限流中间件,springboot,sentinel,中间件

输入之前的 命令启动下载的可视化jar包

java -Dserver.port=9000 -jar sentinel-dashboard-1.8.6.jar

在控制台中添加限流策略资源

 Sentinel限流中间件,springboot,sentinel,中间件

调用接口测试

Sentinel限流中间件,springboot,sentinel,中间件

 并发线程流控

并发线程数
并发数控制用于保业务线程池不被慢调用耗尽,例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延增加对于调用者来说,意味着否叫量下降和更多的线程教占用,极端值下其至导致线程池耗尽,为应对大多线程占用的情况,业内有使用隔离的方案,比通过不同业务逻使用不同线程池来隔富业务自身之间的资源争抢线程池离),这种属富方案虽然爆宫性比较好,但是代价就是线程数目大多,线程上下文切换的 ovehead 比大,特别是对低延的调用有比较的影响,Sein 并发控制不负责创建和管理池,而是简单统计当前请求上下文的线数目(正在执行的调用数目),如果超出闻值,新的请求会被立即拒绝,效果类似于信号量隔离。并发数控制涌常在调用端进行配置

调整接口

Sentinel限流中间件,springboot,sentinel,中间件

新增流控规则时选择并发线程数

Sentinel限流中间件,springboot,sentinel,中间件

 启动测试:

Sentinel限流中间件,springboot,sentinel,中间件

关联模式 

关联当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数一个字段的读和写操作存在争抢,读的速度过高会影响写得速度,写的违度过高会影响读的速度如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的否量,可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,tead h 和 mite h 这两个资源分别代表数车读写,我们同以给 read  设置限流规达到优先的目的:设置 strate 为 1etatSIRTECT L时设置 eert 为 te这当/于时教据的会被限流

举例 生成订单和查询订单,当生成订单接口访问过高时,被关联的查询订单接口被限流

书写接口:

Sentinel限流中间件,springboot,sentinel,中间件

控制台中创建限流规则

 Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

正常测试:

 Sentinel限流中间件,springboot,sentinel,中间件

这里手动点击很难看到限流作用,所以使用一些压测工具进行测试.可以使用传统压测工具jemter进行压测,这里使用apipost进行压测

 Sentinel限流中间件,springboot,sentinel,中间件

对生成订单进行接口压测,然后查看查询订单接口是否服务降级 

Sentinel限流中间件,springboot,sentinel,中间件

 可以看到对生成订单进行压测,关联的查询订单却受到了流控服务降级

整合openFeign使用

首先准备一个最少有两个服务的微服务项目并将服务注册到nacos中,这样可以进行服务之间的远程调用,从而使用openFeign再整合sentinel 这里不再从头演示,具体使用openFeign可以查看博主之前文章

这里准备一个生产者服务,一个消费者服务

在生产者中新建接口

Sentinel限流中间件,springboot,sentinel,中间件

在消费者中创建fen接口进行远程调用生产者接口

Sentinel限流中间件,springboot,sentinel,中间件

控制层书写接口调用

Sentinel限流中间件,springboot,sentinel,中间件 启动测试:

Sentinel限流中间件,springboot,sentinel,中间件

调用消费者接口,消费者通过openFeign调用生产者的接口,说明此时接口已经调通

更改接口,手动添加错误异常,从而模拟服务降级场景,从而使用sentinel进行整合服务降级

 Sentinel限流中间件,springboot,sentinel,中间件

重启调用接口查看异常效果:

Sentinel限流中间件,springboot,sentinel,中间件

 Sentinel限流中间件,springboot,sentinel,中间件

 整合sentinel进行服务降级

配置中开启fen对sentinel使用

Sentinel限流中间件,springboot,sentinel,中间件

创建服务降级服务实现fen服务

Sentinel限流中间件,springboot,sentinel,中间件 

 设置服务降级服务接口

Sentinel限流中间件,springboot,sentinel,中间件

启动测试:

Sentinel限流中间件,springboot,sentinel,中间件 文章来源地址https://www.toymoban.com/news/detail-609082.html

到了这里,关于Sentinel限流中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core 的 Web Api 实现限流 中间件

    Microsoft.AspNetCore.RateLimiting  中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用于限制速率的扩展方法:​​​​​ 固定窗口限制器 滑动窗口限制器 令牌桶限

    2024年01月17日
    浏览(39)
  • 后端 .net7 Minimal API 限流中间件(微信小程序无师自通十)

            我的微信小程序使用.net7 Minimal API 作为后端,当服务器摆上公网后,可以观察到很多的攻击行为和暴力访问。所以,我需要使用微软的限流中间件部署相应的功能在服务器上 : AddFixedWindowLimiter using Microsoft.AspNetCore.RateLimiting; using System.Threading.RateLimiting; 后端

    2024年02月12日
    浏览(39)
  • Springboot整合RabbitMQ消息中间件

    spring-boot-rabbitmq–消息中间件整合 前言:RabbitMQ的各种交换机说明 1、直连交换机 生产者发布消息时必须带着routing-key,队列绑定到交换机时必须指定binding-key ,且routing-key和binding-key必须完全相同,如此才能将消息路由到队列中 直连交换机通常用来循环分发任务给多个workers,

    2024年02月11日
    浏览(47)
  • SpringBoot中间件—ORM(Mybatis)框架实现

    目录 定义 需求背景 方案设计 代码展示 UML图  实现细节 测试验证  总结 源码地址(已开源) :https://gitee.com/sizhaohe/mini-mybatis.git  跟着源码及下述UML图来理解上手会更快, 拒绝浮躁,沉下心来搞         ORM:Object Relational Mapping  --  对象关系映射,是一种程序设计技术,

    2024年02月16日
    浏览(33)
  • SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

    1、EventBus 使用EventBus 事件总线的方式可以实现消息的 发布/订阅 功能,EventBus是一个轻量级的消息服务组件,适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); // 3.监听事件,通过在方法上添加注解 @Subscribe实现

    2024年02月13日
    浏览(43)
  • SpringBoot整合消息中间件(ActiveMQ,RabbitMQ,RocketMQ,Kafka)

    消息的发送方:生产者 消息的接收方:消费者 同步消息:发送方发送消息到接收方,接收方有所回应后才能够进行下一次的消息发送 异步消息:不需要接收方回应就可以进行下一步的发送 什么是消息队列? 当此时有很多个用户同时访问服务器,需要服务器进行操作,但此

    2024年04月27日
    浏览(52)
  • Springboot整合activiti5,达梦数据库,mybatis中间件

    由于工作流引擎不支持达梦数据库以及国产中间件,所以我们引入的时候会报错,这个时候就需要去改造代码和配置文件。各种文档和资料查找一天,现在对这个问题进行解决了。 1.查看网上的各类教程,手动将源码复制粘贴出来,进行修改。这方面可以自行去查找对应文档

    2024年02月14日
    浏览(40)
  • SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)

    实现步骤: pom文件导坐标 yaml配置文件配置mongodb: 随便建一个pojo 测试: 装配MongoTemplate模板类,调用方法 整合MongoDB总结: 导坐标 写配置文件 核心类MongoTemplate调用 前提准备:数据库+ES 数据库建表语句: 实现步骤: pom文件到坐标 yaml配置文件 创建实体类: 对应数据库表

    2024年02月04日
    浏览(54)
  • 【Sentinel】Sentinel与gateway的限流算法

    线程隔离有两种方式实现: 线程池隔离(Hystrix默认采用) 信号量隔离(Sentinel默认采用) 服务I需要远程调用服务A、服务B,则创建两个线程池,分别用来处理服务I–服务A,和服务I–服务B的请求。和线程池隔离不同的是,信号量隔离比较轻量级,就维护一个计数器就好,不

    2024年02月09日
    浏览(52)
  • Sentinel dashboard的使用;Nacos保存Sentinel限流规则

    Nacos环境搭建 Nacos注册中心的使用 Nacos配置中心的使用 Sentinel 容灾中心的使用 Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub github地址:Sentinel/sentinel-dashboard at master · alibaba/Sentinel · GitHub 创建sentinel-dashboard的启动脚本,并添加如下信息: 目录: 注意:sentinel-dashboard默认会在87

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包