Sentinel限流中间件

news2024/11/23 19:36:31

目录

介绍

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已经初步使用成功

配置本地控制台

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

Releases · alibaba/Sentinel · GitHub

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

sentinel1.8.6-jar阿里云下载

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

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

 

浏览器地址栏输入localhost:9000进行访问,账号密码默认都是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中可能还是没有检测到服务,这里需要重新调用下之前配置的限流规则接口,也就是前面的hello接口,调用后再刷新sentinel页面就可以看到监听的本地服务了

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

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

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

重启项目再测试接口

 

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

 

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

点击保存

再测试接口

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

配置异步任务限流

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

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

 

在sentinel中新增流控规则:

启动测试:

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

使用注解定义限流资源

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

首先导入所需依赖

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

书写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

 书写接口: 

启动项目

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

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

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

 

调用接口测试

 并发线程流控

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

调整接口

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

 启动测试:

关联模式 

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

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

书写接口:

控制台中创建限流规则

 

 

正常测试:

 

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

 

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

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

整合openFeign使用

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

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

在生产者中新建接口

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

控制层书写接口调用

 启动测试:

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

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

 

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

 

 整合sentinel进行服务降级

配置中开启fen对sentinel使用

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

 

 设置服务降级服务接口

启动测试:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS私钥证书和证书profile文件的生成攻略

在使用uniapp打包ios app的时候&#xff0c;要求我们提供一个私钥证书和一个证书profile文件&#xff0c;私钥证书可以使用mac电脑的钥匙串访问程序来生成&#xff0c;也可以使用香蕉云编来生成。证书profile文件可以直接在苹果开发者中心生成。 有部分刚接触ios开发的同学们&…

Easy-Es笔记

一、Easy-ES概述 Easy-Es&#xff08;简称EE&#xff09;是一款ElasticSearch-ORM框架&#xff0c;在原生 RestHighLevelClient 的基础上&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。Easy-Es采用和MP一致的语法设计&#xff0c;能够显著降低ElasticSea…

各种拉格朗日函数

目录 一&#xff0c;拉格朗日函数 二&#xff0c;部分拉格朗日函数 三&#xff0c;增广拉格朗日函数 一&#xff0c;拉格朗日函数 以三元函数为例&#xff1a; 求f(x,y,z)的极值&#xff0c;s.t.g(x,y,z)0 拉格朗日函数L(x,y,z,a) f(x,y,z) a * g(x,y,z) 在极值点处一…

(学习日记)2023.06.09

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Spring AOP(面向切面编程)的详细讲解

1.什么是 AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理 AOP是一种思想&#xff0c;而Spring AOP是一个实现了AOP的思想框架&#xff0c;他们的关系和IOC…

PCIe Error Signaling and Logging持续更新

来源PCI5.0 SPEC 1.错误报告范式ERROR REPORTING PARADIGMS PCI Express定义了两种错误报告范式&#xff1a;baseline capability and the Advanced Error Reporting Capability。baseline错误报告能力是所有PCI Express设备都需要具备的&#xff0c;它定义了最低限度的错误报…

基于Ubuntu 22.04 编译chip-tool工具

前言 编译过程有点曲折&#xff0c;做下记录&#xff0c;过程中&#xff0c;有参考别人写的博客&#xff0c;也看github 官方介绍&#xff0c;终于跑通了~ 环境说明&#xff1a; 首先需要稳定的梯子&#xff0c;可以访问“外网”ubuntu 环境&#xff0c;最终成功实验在Ubunt…

Games101学习笔记 - 基础数学

向量 向量&#xff1a;方向和长度&#xff0c;没有起始位置 向量长度&#xff1a;各个方向平方相加开方 单位向量&#xff1a;向量除向量的长度 点乘 在笛卡尔坐标系中的点乘计算&#xff1a; 几何意思&#xff1a; 表示一个向量在另一个向量上的投影点乘在图形学中应用&a…

SQLite Studio 连接 SQLite数据库

1、在SQLite中创建数据库和表 1.1、按WINR&#xff0c;打开控制台&#xff0c;然后把指引到我们的SQLite的安装路径&#xff0c;输入D:&#xff0c;切换到D盘&#xff0c;cd 地址&#xff0c;切换到具体文件夹&#xff0c;输入“sqlite3”&#xff0c;启动服务 1.2、创建数据库…

最全SWAT教程:SWAT模型系统学习(建模方法、实例应用、高级进阶)

目前&#xff0c;水环境问题逐渐成为制约社会经济和环境可持续发展的重要因素。根据国内外研究表明&#xff0c;受全球环境变化和经济快速发展的影响&#xff0c;面源污染已逐渐成为水环境污染的第一因素。但面源污染由于具有排放分散、隐蔽&#xff0c;排污随机、不确定、不易…

关于封装的定义?以及API接口封装作用有哪些

封装是面向对象编程中的一个重要概念&#xff0c;它指的是将数据和程序代码包含在类中&#xff0c;并对外部对象隐藏其内部实现细节&#xff0c;只提供公共接口。这种方式可以有效地保护数据&#xff0c;防止被外部对象随意访问或修改&#xff0c;同时也更容易维护、升级和复用…

Linux下top命令用法详解

一、命令介绍 Linux top命令用于实时显示 process &#xff08;进程&#xff09;的动态。它用于监控正在运行系统负荷的信息&#xff0c;包括系统负载、CPU利用分布情况、内存使用、每个进程的资源占用情况等。 使用权限&#xff1a;所有使用者 二、命令详解 在命令行下输入…

串稳定混合交通的协同自适应巡航控制:基准和以人为本的设计(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 串稳定混合交通的协同自适应巡航控制是一种针对复杂交通环境的控制方法&#xff0c;旨在实现交通系统的高效运行和安全性。其中…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…

推送docker镜像到私有/DockerHub仓库

制作本地镜像 以定制jdk11镜像为例&#xff1a; 新建文件夹jdk11下载orcale jdk11&#xff0c;复制orcale jdk11 到刚刚新建文件夹jdk11下新建Dockerfile&#xff0c;镜像对字符集和时间都做了处理 FROM centos:7 MAINTAINER cc <ccqq.com>ADD jdk-11.0.10_linux-x64_…

多线程——多线程的创建方式、常用成员方法

目录 一、什么是多线程&#xff1f; 线程与进程 进程与线程区别&#xff1a; 并发与并行 二、多线程的创建方式&#xff08;三种方式&#xff09; 第一种&#xff1a;继承Thread类方式创建 第二种&#xff1a;实现Runnable接口的方式创建 第三种&#xff1a;利用Callab…

uniapp实现预约时间选择弹窗组件

做了个组件&#xff0c;实现出当日预约时间组件&#xff0c;效果图如下 废话不多说&#xff0c;直接上代码&#xff0c;代码简单&#xff0c;参数自己任意改 <template><view class"inventory"><u-popup :show"show" :round"10"…

全国青少年信息素养大赛Scratch图形化编程_初赛_模拟二卷

全国青少年电子信息智能创新大赛Scratch图形化编程_初赛_模拟二卷 一、选择题 第 1 题 单选题 执行下面程序&#xff0c;角色会说&#xff1f;&#xff08; &#xff09; A.34 B.28 C.51 D.42 第 2 题 单选题 默认小猫角色&#xff0c;初始位置在舞台中心&#xff0c;下面…

Vuex模块化管理

如果你的项目是一个小型项目&#xff0c;就用不着使用模块化&#xff1b; 但是&#xff0c;如果你参与的项目是一个中大型项目&#xff0c;那Vuex模块化&#xff0c;必不可少&#xff0c;否则整个文件很臃肿&#xff0c;也很难管理。 通过模块化管理&#xff1a;各自模块下都有…

【Linux环境搭建篇】--- 还不会搭建Linux环境?收藏这一篇就够了

文章目录 前言&#x1f31f;一、Linux背景介绍&#x1f30f;1.1. 发展史&#x1f30f;1.2. 开源 &#x1f31f;二、搭建Linux环境&#x1f31f;三、使用 XShell 远程登陆到 Linux&#x1f31f;四、XShell 下的复制粘贴&#x1f63d;总结 前言 &#x1f467;个人主页&#xff1a…